Fail with ConfigInvalidException if checker config contains invalid status
If in a checker config file the status is set to a value that cannot be
resolved to a CheckerStatus enum we failed with an
IllegalArgumentException, but since this is an invalid config it's
better to throw ConfigInvalidException.
Signed-off-by: Edwin Kempin <ekempin@google.com>
Change-Id: Ibb8c6ac666ff58196663003e1fe037bdd64a664b
diff --git a/java/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImpl.java b/java/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImpl.java
index 34c5ad3..e3ff24e 100644
--- a/java/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImpl.java
+++ b/java/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImpl.java
@@ -268,6 +268,20 @@
}
}
+ if (testCheckerUpdate.forceInvalidStatus()) {
+ try (Repository repo = repoManager.openRepository(allProjectsName)) {
+ TestRepository<Repository> testRepo = new TestRepository<>(repo);
+ Config checkerConfig =
+ readConfig(testRepo, checkerUuid.toRefName(), CheckerConfig.CHECKER_CONFIG_FILE);
+ checkerConfig.setString("checker", null, "status", "invalid");
+ testRepo
+ .branch(checkerUuid.toRefName())
+ .commit()
+ .add(CheckerConfig.CHECKER_CONFIG_FILE, checkerConfig.toText())
+ .create();
+ }
+ }
+
if (testCheckerUpdate.deleteRef()) {
try (Repository repo = repoManager.openRepository(allProjectsName)) {
RefUpdate ru =
diff --git a/java/com/google/gerrit/plugins/checks/acceptance/testsuite/TestCheckerUpdate.java b/java/com/google/gerrit/plugins/checks/acceptance/testsuite/TestCheckerUpdate.java
index 76d41c0..99f6f92 100644
--- a/java/com/google/gerrit/plugins/checks/acceptance/testsuite/TestCheckerUpdate.java
+++ b/java/com/google/gerrit/plugins/checks/acceptance/testsuite/TestCheckerUpdate.java
@@ -47,6 +47,8 @@
public abstract boolean forceInvalidBlockingCondition();
+ public abstract boolean forceInvalidStatus();
+
public abstract boolean deleteRef();
abstract ThrowingConsumer<TestCheckerUpdate> checkerUpdater();
@@ -56,6 +58,7 @@
.checkerUpdater(checkerUpdater)
.forceInvalidConfig(false)
.forceInvalidBlockingCondition(false)
+ .forceInvalidStatus(false)
.deleteRef(false);
}
@@ -100,6 +103,12 @@
abstract Builder forceInvalidBlockingCondition(boolean forceInvalidBlockingCondition);
+ public Builder forceInvalidStatus() {
+ return forceInvalidStatus(true);
+ }
+
+ abstract Builder forceInvalidStatus(boolean forceInvalidStatus);
+
public Builder deleteRef() {
return deleteRef(true);
}
diff --git a/java/com/google/gerrit/plugins/checks/db/CheckerConfigEntry.java b/java/com/google/gerrit/plugins/checks/db/CheckerConfigEntry.java
index d1d49ef..3734bf2 100644
--- a/java/com/google/gerrit/plugins/checks/db/CheckerConfigEntry.java
+++ b/java/com/google/gerrit/plugins/checks/db/CheckerConfigEntry.java
@@ -229,7 +229,11 @@
throw new ConfigInvalidException(
String.format("status of checker %s not set", checkerUuid));
}
- checker.setStatus(config.getEnum(SECTION_NAME, null, super.keyName, CheckerStatus.ENABLED));
+ try {
+ checker.setStatus(config.getEnum(SECTION_NAME, null, super.keyName, CheckerStatus.ENABLED));
+ } catch (IllegalArgumentException e) {
+ throw new ConfigInvalidException(e.getMessage());
+ }
}
@Override
diff --git a/javatests/com/google/gerrit/plugins/checks/acceptance/api/GetCheckerIT.java b/javatests/com/google/gerrit/plugins/checks/acceptance/api/GetCheckerIT.java
index 2cb2ec8..0d7baf9 100644
--- a/javatests/com/google/gerrit/plugins/checks/acceptance/api/GetCheckerIT.java
+++ b/javatests/com/google/gerrit/plugins/checks/acceptance/api/GetCheckerIT.java
@@ -222,6 +222,16 @@
}
@Test
+ public void getCheckerWithInvalidStatusFails() throws Exception {
+ CheckerUuid checkerUuid = checkerOperations.newChecker().create();
+ checkerOperations.checker(checkerUuid).forUpdate().forceInvalidStatus().update();
+
+ exception.expect(RestApiException.class);
+ exception.expectMessage("Cannot retrieve checker " + checkerUuid);
+ getCheckerInfo(checkerUuid);
+ }
+
+ @Test
public void getCheckerByNameFails() throws Exception {
String name = "my-checker";
checkerOperations.newChecker().name(name).create();
diff --git a/javatests/com/google/gerrit/plugins/checks/acceptance/api/ListCheckersIT.java b/javatests/com/google/gerrit/plugins/checks/acceptance/api/ListCheckersIT.java
index ffe26fc..f52257e 100644
--- a/javatests/com/google/gerrit/plugins/checks/acceptance/api/ListCheckersIT.java
+++ b/javatests/com/google/gerrit/plugins/checks/acceptance/api/ListCheckersIT.java
@@ -90,12 +90,14 @@
CheckerUuid checkerUuid = checkerOperations.newChecker().create();
CheckerUuid invalidCheckerUuid1 = checkerOperations.newChecker().create();
CheckerUuid invalidCheckerUuid2 = checkerOperations.newChecker().create();
+ CheckerUuid invalidCheckerUuid3 = checkerOperations.newChecker().create();
checkerOperations.checker(invalidCheckerUuid1).forUpdate().forceInvalidConfig().update();
checkerOperations
.checker(invalidCheckerUuid2)
.forUpdate()
.forceInvalidBlockingCondition()
.update();
+ checkerOperations.checker(invalidCheckerUuid3).forUpdate().forceInvalidStatus().update();
List<CheckerInfo> allCheckers = checkersApi.all();
assertThat(allCheckers).containsExactly(checkerOperations.checker(checkerUuid).asInfo());
diff --git a/javatests/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImplTest.java b/javatests/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImplTest.java
index b282e94..e256e35 100644
--- a/javatests/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImplTest.java
+++ b/javatests/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImplTest.java
@@ -528,6 +528,21 @@
}
@Test
+ public void statusCanBeMadeInvalid() throws Exception {
+ CheckerUuid checkerUuid = checkerOperations.newChecker().create();
+
+ checkerOperations.checker(checkerUuid).forUpdate().forceInvalidStatus().update();
+
+ try {
+ checkers.getChecker(checkerUuid);
+ assert_().fail("expected ConfigInvalidException");
+ } catch (ConfigInvalidException e) {
+ // expected
+ assertThat(e.getMessage()).contains("Invalid value: checker.status");
+ }
+ }
+
+ @Test
public void refCanBeDeleted() throws Exception {
CheckerUuid checkerUuid = checkerOperations.newChecker().create();