| // Copyright (C) 2022 The Android Open Source Project |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package com.google.gerrit.acceptance.testsuite.change; |
| |
| import com.google.gerrit.acceptance.DisabledAccountIndex; |
| import com.google.gerrit.acceptance.DisabledChangeIndex; |
| import com.google.gerrit.acceptance.DisabledProjectIndex; |
| import com.google.gerrit.index.project.ProjectIndex; |
| import com.google.gerrit.index.project.ProjectIndexCollection; |
| import com.google.gerrit.server.index.account.AccountIndex; |
| import com.google.gerrit.server.index.account.AccountIndexCollection; |
| import com.google.gerrit.server.index.change.ChangeIndex; |
| import com.google.gerrit.server.index.change.ChangeIndexCollection; |
| import com.google.inject.Inject; |
| |
| /** Helpers to enable and disable reads/writes to secondary indices during testing. */ |
| public interface IndexOperations { |
| /** |
| * Disables reads from the secondary index that this instance is scoped to. Reads fail with {@code |
| * UnsupportedOperationException}. |
| */ |
| AutoCloseable disableReads(); |
| |
| /** |
| * Disables writes to the secondary index that this instance is scoped to. Writes fail with {@code |
| * UnsupportedOperationException}. |
| */ |
| AutoCloseable disableWrites(); |
| |
| /** Disables reads from and writes to the secondary index that this instance is scoped to. */ |
| default AutoCloseable disableReadsAndWrites() { |
| AutoCloseable reads = disableReads(); |
| AutoCloseable writes = disableWrites(); |
| return () -> { |
| reads.close(); |
| writes.close(); |
| }; |
| } |
| |
| class Change implements IndexOperations { |
| @Inject private ChangeIndexCollection indices; |
| |
| @Override |
| public AutoCloseable disableReads() { |
| ChangeIndex maybeDisabledSearchIndex = indices.getSearchIndex(); |
| if (!(maybeDisabledSearchIndex instanceof DisabledChangeIndex)) { |
| indices.setSearchIndex( |
| new DisabledChangeIndex(maybeDisabledSearchIndex), /* closeOld */ false); |
| } |
| |
| return () -> { |
| ChangeIndex maybeEnabledSearchIndex = indices.getSearchIndex(); |
| if (maybeEnabledSearchIndex instanceof DisabledChangeIndex) { |
| indices.setSearchIndex( |
| ((DisabledChangeIndex) maybeEnabledSearchIndex).unwrap(), /* closeOld */ false); |
| } |
| }; |
| } |
| |
| @Override |
| public AutoCloseable disableWrites() { |
| for (ChangeIndex i : indices.getWriteIndexes()) { |
| if (!(i instanceof DisabledChangeIndex)) { |
| indices.addWriteIndex(new DisabledChangeIndex(i)); |
| } |
| } |
| return () -> { |
| for (ChangeIndex i : indices.getWriteIndexes()) { |
| if (i instanceof DisabledChangeIndex) { |
| indices.addWriteIndex(((DisabledChangeIndex) i).unwrap()); |
| } |
| } |
| }; |
| } |
| } |
| |
| class Account implements IndexOperations { |
| @Inject private AccountIndexCollection indices; |
| |
| @Override |
| public AutoCloseable disableReads() { |
| AccountIndex maybeDisabledSearchIndex = indices.getSearchIndex(); |
| if (!(maybeDisabledSearchIndex instanceof DisabledAccountIndex)) { |
| indices.setSearchIndex( |
| new DisabledAccountIndex(maybeDisabledSearchIndex), /* closeOld */ false); |
| } |
| |
| return () -> { |
| AccountIndex maybeEnabledSearchIndex = indices.getSearchIndex(); |
| if (maybeEnabledSearchIndex instanceof DisabledAccountIndex) { |
| indices.setSearchIndex( |
| ((DisabledAccountIndex) maybeEnabledSearchIndex).unwrap(), /* closeOld */ false); |
| } |
| }; |
| } |
| |
| @Override |
| public AutoCloseable disableWrites() { |
| for (AccountIndex i : indices.getWriteIndexes()) { |
| if (!(i instanceof DisabledAccountIndex)) { |
| indices.addWriteIndex(new DisabledAccountIndex(i)); |
| } |
| } |
| return () -> { |
| for (AccountIndex i : indices.getWriteIndexes()) { |
| if (i instanceof DisabledAccountIndex) { |
| indices.addWriteIndex(((DisabledAccountIndex) i).unwrap()); |
| } |
| } |
| }; |
| } |
| } |
| |
| class Project implements IndexOperations { |
| @Inject private ProjectIndexCollection indices; |
| |
| @Override |
| public AutoCloseable disableReads() { |
| ProjectIndex maybeDisabledSearchIndex = indices.getSearchIndex(); |
| if (!(maybeDisabledSearchIndex instanceof DisabledProjectIndex)) { |
| indices.setSearchIndex( |
| new DisabledProjectIndex(maybeDisabledSearchIndex), /* closeOld */ false); |
| } |
| |
| return () -> { |
| ProjectIndex maybeEnabledSearchIndex = indices.getSearchIndex(); |
| if (maybeEnabledSearchIndex instanceof DisabledProjectIndex) { |
| indices.setSearchIndex( |
| ((DisabledProjectIndex) maybeEnabledSearchIndex).unwrap(), /* closeOld */ false); |
| } |
| }; |
| } |
| |
| @Override |
| public AutoCloseable disableWrites() { |
| for (ProjectIndex i : indices.getWriteIndexes()) { |
| if (!(i instanceof DisabledProjectIndex)) { |
| indices.addWriteIndex(new DisabledProjectIndex(i)); |
| } |
| } |
| return () -> { |
| for (ProjectIndex i : indices.getWriteIndexes()) { |
| if (i instanceof DisabledProjectIndex) { |
| indices.addWriteIndex(((DisabledProjectIndex) i).unwrap()); |
| } |
| } |
| }; |
| } |
| } |
| } |