Merge changes I92fa8ce1,I08822edb
* changes:
Validate checker properties in CheckerCreation and CheckerUpdate
Make name of checker mandatory
diff --git a/java/com/google/gerrit/plugins/checks/CheckJson.java b/java/com/google/gerrit/plugins/checks/CheckJson.java
index 074d4cc..535fbc4 100644
--- a/java/com/google/gerrit/plugins/checks/CheckJson.java
+++ b/java/com/google/gerrit/plugins/checks/CheckJson.java
@@ -86,7 +86,7 @@
.getChecker(checkerUuid)
.ifPresent(
checker -> {
- info.checkerName = checker.getName().orElse(null);
+ info.checkerName = checker.getName();
info.checkerStatus = checker.getStatus();
info.blocking = checker.getBlockingConditions();
info.checkerDescription = checker.getDescription().orElse(null);
diff --git a/java/com/google/gerrit/plugins/checks/Checker.java b/java/com/google/gerrit/plugins/checks/Checker.java
index 075e2c9..348bd5e 100644
--- a/java/com/google/gerrit/plugins/checks/Checker.java
+++ b/java/com/google/gerrit/plugins/checks/Checker.java
@@ -39,11 +39,11 @@
/**
* Returns the display name of the checker.
*
- * <p>Checkers may not have a name, in this case {@link Optional#empty()} is returned.
+ * <p>The same name may be used by multiple checkers.
*
* @return display name of the checker
*/
- public abstract Optional<String> getName();
+ public abstract String getName();
/**
* Returns the description of the checker.
diff --git a/java/com/google/gerrit/plugins/checks/CheckerCreation.java b/java/com/google/gerrit/plugins/checks/CheckerCreation.java
index f814ce4..294f354 100644
--- a/java/com/google/gerrit/plugins/checks/CheckerCreation.java
+++ b/java/com/google/gerrit/plugins/checks/CheckerCreation.java
@@ -14,7 +14,10 @@
package com.google.gerrit.plugins.checks;
+import static com.google.common.base.Preconditions.checkState;
+
import com.google.auto.value.AutoValue;
+import com.google.common.annotations.VisibleForTesting;
import com.google.gerrit.reviewdb.client.Project;
@AutoValue
@@ -26,6 +29,13 @@
*/
public abstract CheckerUuid getCheckerUuid();
+ /**
+ * Defines the name the checker should have.
+ *
+ * <p>The same name may be used by multiple checkers.
+ */
+ public abstract String getName();
+
/** Defines the repository for which the checker applies. */
public abstract Project.NameKey getRepository();
@@ -37,8 +47,24 @@
public abstract static class Builder {
public abstract Builder setCheckerUuid(CheckerUuid checkerUuid);
+ public abstract Builder setName(String name);
+
public abstract Builder setRepository(Project.NameKey repository);
- public abstract CheckerCreation build();
+ abstract CheckerCreation autoBuild();
+
+ public CheckerCreation build() {
+ CheckerCreation checkerCreation = autoBuild();
+ checkState(!checkerCreation.getName().trim().isEmpty(), "checker name cannot be empty");
+ checkState(
+ !checkerCreation.getRepository().get().trim().isEmpty(),
+ "repository name cannot be empty");
+ return checkerCreation;
+ }
+
+ @VisibleForTesting
+ public CheckerCreation buildWithoutValidationForTesting() {
+ return autoBuild();
+ }
}
}
diff --git a/java/com/google/gerrit/plugins/checks/CheckerJson.java b/java/com/google/gerrit/plugins/checks/CheckerJson.java
index 701a169..55fdf91 100644
--- a/java/com/google/gerrit/plugins/checks/CheckerJson.java
+++ b/java/com/google/gerrit/plugins/checks/CheckerJson.java
@@ -23,7 +23,7 @@
public CheckerInfo format(Checker checker) {
CheckerInfo info = new CheckerInfo();
info.uuid = checker.getUuid().get();
- info.name = checker.getName().orElse(null);
+ info.name = checker.getName();
info.description = checker.getDescription().orElse(null);
info.url = checker.getUrl().orElse(null);
info.repository = checker.getRepository().get();
diff --git a/java/com/google/gerrit/plugins/checks/CheckerUpdate.java b/java/com/google/gerrit/plugins/checks/CheckerUpdate.java
index 97165f6..463cb1d 100644
--- a/java/com/google/gerrit/plugins/checks/CheckerUpdate.java
+++ b/java/com/google/gerrit/plugins/checks/CheckerUpdate.java
@@ -14,7 +14,10 @@
package com.google.gerrit.plugins.checks;
+import static com.google.common.base.Preconditions.checkState;
+
import com.google.auto.value.AutoValue;
+import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableSortedSet;
import com.google.gerrit.plugins.checks.api.BlockingCondition;
import com.google.gerrit.plugins.checks.api.CheckerStatus;
@@ -82,6 +85,27 @@
public abstract Builder setQuery(String query);
- public abstract CheckerUpdate build();
+ abstract CheckerUpdate autoBuild();
+
+ public CheckerUpdate build() {
+ CheckerUpdate checkerUpdate = autoBuild();
+
+ if (checkerUpdate.getName().isPresent()) {
+ checkState(!checkerUpdate.getName().get().trim().isEmpty(), "checker name cannot be empty");
+ }
+
+ if (checkerUpdate.getRepository().isPresent()) {
+ checkState(
+ !checkerUpdate.getRepository().get().get().trim().isEmpty(),
+ "repository name cannot be empty");
+ }
+
+ return checkerUpdate;
+ }
+
+ @VisibleForTesting
+ public CheckerUpdate buildWithoutValidationForTesting() {
+ return autoBuild();
+ }
}
}
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 984cd31..e96f0c2 100644
--- a/java/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImpl.java
+++ b/java/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImpl.java
@@ -115,8 +115,13 @@
checkerCreation
.uuid()
.orElseGet(() -> CheckerUuid.parse("test:checker-" + checkerCounter.incrementAndGet()));
+ String checkerName = checkerCreation.name().orElse("Test Checker");
Project.NameKey repository = checkerCreation.repository().orElse(allProjectsName);
- return CheckerCreation.builder().setCheckerUuid(checkerUuid).setRepository(repository).build();
+ return CheckerCreation.builder()
+ .setCheckerUuid(checkerUuid)
+ .setName(checkerName)
+ .setRepository(repository)
+ .build();
}
private static CheckerUpdate toCheckerUpdate(TestCheckerCreation checkerCreation) {
@@ -268,6 +273,10 @@
unsetValueInCheckerConfig("uuid");
}
+ if (testCheckerInvalidation.unsetName()) {
+ unsetValueInCheckerConfig("name");
+ }
+
if (testCheckerInvalidation.unsetRepository()) {
unsetValueInCheckerConfig("repository");
}
diff --git a/java/com/google/gerrit/plugins/checks/acceptance/testsuite/TestCheckerInvalidation.java b/java/com/google/gerrit/plugins/checks/acceptance/testsuite/TestCheckerInvalidation.java
index f845ddd..850d7c8 100644
--- a/java/com/google/gerrit/plugins/checks/acceptance/testsuite/TestCheckerInvalidation.java
+++ b/java/com/google/gerrit/plugins/checks/acceptance/testsuite/TestCheckerInvalidation.java
@@ -29,6 +29,8 @@
public abstract boolean unsetUuid();
+ public abstract boolean unsetName();
+
public abstract boolean unsetRepository();
public abstract boolean unsetStatus();
@@ -45,6 +47,7 @@
.invalidBlockingCondition(false)
.invalidStatus(false)
.unsetUuid(false)
+ .unsetName(false)
.unsetRepository(false)
.unsetStatus(false)
.deleteRef(false);
@@ -80,7 +83,13 @@
return unsetUuid(true);
}
- abstract Builder unsetUuid(boolean unsetUuid);
+ abstract Builder unsetUuid(boolean unsetName);
+
+ public Builder unsetName() {
+ return unsetName(true);
+ }
+
+ abstract Builder unsetName(boolean unsetName);
public Builder unsetRepository() {
return unsetRepository(true);
diff --git a/java/com/google/gerrit/plugins/checks/api/CreateChecker.java b/java/com/google/gerrit/plugins/checks/api/CreateChecker.java
index ff533a7..8ae0513 100644
--- a/java/com/google/gerrit/plugins/checks/api/CreateChecker.java
+++ b/java/com/google/gerrit/plugins/checks/api/CreateChecker.java
@@ -99,15 +99,20 @@
CheckerUuid.tryParse(input.uuid)
.orElseThrow(() -> new BadRequestException("invalid uuid: " + uuidStr));
+ String name = CheckerName.clean(input.name);
+ if (name.isEmpty()) {
+ throw new BadRequestException("name is required");
+ }
+
Project.NameKey repository = resolveRepository(input.repository);
CheckerCreation.Builder checkerCreationBuilder =
- CheckerCreation.builder().setCheckerUuid(checkerUuid).setRepository(repository);
+ CheckerCreation.builder()
+ .setCheckerUuid(checkerUuid)
+ .setName(name)
+ .setRepository(repository);
CheckerUpdate.Builder checkerUpdateBuilder = CheckerUpdate.builder();
- String name = CheckerName.clean(input.name);
- if (!name.isEmpty()) {
- checkerUpdateBuilder.setName(name);
- }
+
if (input.description != null && !input.description.trim().isEmpty()) {
checkerUpdateBuilder.setDescription(input.description.trim());
}
diff --git a/java/com/google/gerrit/plugins/checks/db/CheckerConfig.java b/java/com/google/gerrit/plugins/checks/db/CheckerConfig.java
index 3adb2dd..2594a96 100644
--- a/java/com/google/gerrit/plugins/checks/db/CheckerConfig.java
+++ b/java/com/google/gerrit/plugins/checks/db/CheckerConfig.java
@@ -311,6 +311,11 @@
}
private void ensureThatMandatoryPropertiesAreSet() throws ConfigInvalidException {
+ if (getNewName().equals(Optional.of(""))) {
+ throw new ConfigInvalidException(
+ String.format("Name of the checker %s must be defined", describeForError()));
+ }
+
if (getNewRepository().equals(Optional.of(""))) {
throw new ConfigInvalidException(
String.format("Repository of the checker %s must be defined", describeForError()));
@@ -321,6 +326,16 @@
checkState(isLoaded, "Checker %s not loaded yet", describeForError());
}
+ private Optional<String> getNewName() {
+ if (checkerUpdate.isPresent()) {
+ return checkerUpdate.get().getName().map(Strings::nullToEmpty).map(String::trim);
+ }
+ if (checkerCreation.isPresent()) {
+ return Optional.of(Strings.nullToEmpty(checkerCreation.get().getName()).trim());
+ }
+ return Optional.empty();
+ }
+
private Optional<String> getNewRepository() {
if (checkerUpdate.isPresent()) {
return checkerUpdate
diff --git a/java/com/google/gerrit/plugins/checks/db/CheckerConfigEntry.java b/java/com/google/gerrit/plugins/checks/db/CheckerConfigEntry.java
index 0b2c5ab..eabcfb2 100644
--- a/java/com/google/gerrit/plugins/checks/db/CheckerConfigEntry.java
+++ b/java/com/google/gerrit/plugins/checks/db/CheckerConfigEntry.java
@@ -91,16 +91,22 @@
*/
NAME("name") {
@Override
- void readFromConfig(CheckerUuid checkerUuid, Checker.Builder checker, Config config) {
+ void readFromConfig(CheckerUuid checkerUuid, Checker.Builder checker, Config config)
+ throws ConfigInvalidException {
String name = config.getString(SECTION_NAME, null, super.keyName);
- if (name != null) {
- checker.setName(name);
+ if (name == null) {
+ throw new ConfigInvalidException(
+ String.format(
+ "%s.%s is not set in config file for checker %s",
+ SECTION_NAME, super.keyName, checkerUuid));
}
+ checker.setName(name);
}
@Override
void initNewConfig(Config config, CheckerCreation checkerCreation) {
- // Do nothing. Name key will be set by updateConfigValue.
+ String checkerName = checkerCreation.getName();
+ config.setString(SECTION_NAME, null, super.keyName, checkerName);
}
@Override
diff --git a/java/com/google/gerrit/plugins/checks/testing/CheckerConfigSubject.java b/java/com/google/gerrit/plugins/checks/testing/CheckerConfigSubject.java
index 8e5bb2c..2b4e356 100644
--- a/java/com/google/gerrit/plugins/checks/testing/CheckerConfigSubject.java
+++ b/java/com/google/gerrit/plugins/checks/testing/CheckerConfigSubject.java
@@ -52,10 +52,8 @@
check("uuid()").that(checker().getUuid()).isEqualTo(expectedUuid);
}
- public OptionalSubject<StringSubject, String> hasNameThat() {
- return check("name()")
- .about(optionals())
- .that(checker().getName(), StandardSubjectBuilder::that);
+ public void hasName(String expectedName) {
+ check("name()").that(checker().getName()).isEqualTo(expectedName);
}
public OptionalSubject<StringSubject, String> hasDescriptionThat() {
diff --git a/javatests/com/google/gerrit/plugins/checks/CheckerCreationTest.java b/javatests/com/google/gerrit/plugins/checks/CheckerCreationTest.java
new file mode 100644
index 0000000..36968d3
--- /dev/null
+++ b/javatests/com/google/gerrit/plugins/checks/CheckerCreationTest.java
@@ -0,0 +1,83 @@
+// Copyright (C) 2019 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.plugins.checks;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.testing.GerritJUnit.assertThrows;
+
+import com.google.gerrit.reviewdb.client.Project;
+import org.junit.Test;
+
+public class CheckerCreationTest {
+ private final CheckerUuid checkerUuid = CheckerUuid.parse("test:my-checker");
+ private final String checkerName = "My Checker";
+ private final Project.NameKey checkerRepository = Project.nameKey("my-repo");
+
+ @Test
+ public void nameCannotBeEmpty() {
+ IllegalStateException thrown =
+ assertThrows(
+ IllegalStateException.class,
+ () ->
+ CheckerCreation.builder()
+ .setCheckerUuid(checkerUuid)
+ .setName("")
+ .setRepository(checkerRepository)
+ .build());
+ assertThat(thrown).hasMessageThat().contains(String.format("checker name cannot be empty"));
+ }
+
+ @Test
+ public void nameCannotBeEmptyAfterTrim() {
+ IllegalStateException thrown =
+ assertThrows(
+ IllegalStateException.class,
+ () ->
+ CheckerCreation.builder()
+ .setCheckerUuid(checkerUuid)
+ .setName(" ")
+ .setRepository(checkerRepository)
+ .build());
+ assertThat(thrown).hasMessageThat().contains(String.format("checker name cannot be empty"));
+ }
+
+ @Test
+ public void repositoryCannotBeEmpty() {
+ IllegalStateException thrown =
+ assertThrows(
+ IllegalStateException.class,
+ () ->
+ CheckerCreation.builder()
+ .setCheckerUuid(checkerUuid)
+ .setName(checkerName)
+ .setRepository(Project.nameKey(""))
+ .build());
+ assertThat(thrown).hasMessageThat().contains(String.format("repository name cannot be empty"));
+ }
+
+ @Test
+ public void repositoryCannotBeEmptyAfterTrim() {
+ IllegalStateException thrown =
+ assertThrows(
+ IllegalStateException.class,
+ () ->
+ CheckerCreation.builder()
+ .setCheckerUuid(checkerUuid)
+ .setName(checkerName)
+ .setRepository(Project.nameKey(" "))
+ .build());
+ assertThat(thrown).hasMessageThat().contains(String.format("repository name cannot be empty"));
+ }
+}
diff --git a/javatests/com/google/gerrit/plugins/checks/CheckerDefinitionTest.java b/javatests/com/google/gerrit/plugins/checks/CheckerDefinitionTest.java
index 9d090ce..f0e967a 100644
--- a/javatests/com/google/gerrit/plugins/checks/CheckerDefinitionTest.java
+++ b/javatests/com/google/gerrit/plugins/checks/CheckerDefinitionTest.java
@@ -50,6 +50,7 @@
private Checker.Builder newChecker() {
return Checker.builder()
+ .setName("My Checker")
.setRepository(Project.nameKey("test-repo"))
.setStatus(CheckerStatus.ENABLED)
.setUuid(CheckerUuid.parse("schema:any-id"))
diff --git a/javatests/com/google/gerrit/plugins/checks/CheckerUpdateTest.java b/javatests/com/google/gerrit/plugins/checks/CheckerUpdateTest.java
new file mode 100644
index 0000000..ae2ed4d
--- /dev/null
+++ b/javatests/com/google/gerrit/plugins/checks/CheckerUpdateTest.java
@@ -0,0 +1,57 @@
+// Copyright (C) 2019 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.plugins.checks;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.testing.GerritJUnit.assertThrows;
+
+import com.google.gerrit.reviewdb.client.Project;
+import org.junit.Test;
+
+public class CheckerUpdateTest {
+ @Test
+ public void nameCannotBeEmpty() {
+ IllegalStateException thrown =
+ assertThrows(
+ IllegalStateException.class, () -> CheckerUpdate.builder().setName("").build());
+ assertThat(thrown).hasMessageThat().contains(String.format("checker name cannot be empty"));
+ }
+
+ @Test
+ public void nameCannotBeEmptyAfterTrim() {
+ IllegalStateException thrown =
+ assertThrows(
+ IllegalStateException.class, () -> CheckerUpdate.builder().setName(" ").build());
+ assertThat(thrown).hasMessageThat().contains(String.format("checker name cannot be empty"));
+ }
+
+ @Test
+ public void repositoryCannotBeEmpty() {
+ IllegalStateException thrown =
+ assertThrows(
+ IllegalStateException.class,
+ () -> CheckerUpdate.builder().setRepository(Project.nameKey("")).build());
+ assertThat(thrown).hasMessageThat().contains(String.format("repository name cannot be empty"));
+ }
+
+ @Test
+ public void repositoryCannotBeEmptyAfterTrim() {
+ IllegalStateException thrown =
+ assertThrows(
+ IllegalStateException.class,
+ () -> CheckerUpdate.builder().setRepository(Project.nameKey(" ")).build());
+ assertThat(thrown).hasMessageThat().contains(String.format("repository name cannot be empty"));
+ }
+}
diff --git a/javatests/com/google/gerrit/plugins/checks/acceptance/api/CreateCheckerIT.java b/javatests/com/google/gerrit/plugins/checks/acceptance/api/CreateCheckerIT.java
index 7514878..fa36005 100644
--- a/javatests/com/google/gerrit/plugins/checks/acceptance/api/CreateCheckerIT.java
+++ b/javatests/com/google/gerrit/plugins/checks/acceptance/api/CreateCheckerIT.java
@@ -78,10 +78,11 @@
Timestamp expectedCreationTimestamp = TestTimeUtil.getCurrentTimestamp();
CheckerInput input = new CheckerInput();
input.uuid = "test:my-checker";
+ input.name = "My Checker";
input.repository = repositoryName.get();
CheckerInfo info = checkersApi.create(input).get();
assertThat(info.uuid).isEqualTo("test:my-checker");
- assertThat(info.name).isNull();
+ assertThat(info.name).isEqualTo("My Checker");
assertThat(info.description).isNull();
assertThat(info.url).isNull();
assertThat(info.repository).isEqualTo(input.repository);
@@ -104,6 +105,7 @@
public void createCheckerWithDescription() throws Exception {
CheckerInput input = new CheckerInput();
input.uuid = "test:my-checker";
+ input.name = "My Checker";
input.description = "some description";
input.repository = allProjects.get();
CheckerInfo info = checkersApi.create(input).get();
@@ -118,6 +120,7 @@
public void createCheckerWithUrl() throws Exception {
CheckerInput input = new CheckerInput();
input.uuid = "test:my-checker";
+ input.name = "My Checker";
input.url = "http://example.com/my-checker";
input.repository = allProjects.get();
CheckerInfo info = checkersApi.create(input).get();
@@ -129,27 +132,24 @@
}
@Test
- public void createCheckerWithName() throws Exception {
+ public void createCheckerWithoutNameFails() throws Exception {
CheckerInput input = new CheckerInput();
input.uuid = "test:my-checker";
- input.name = "my-checker";
input.repository = allProjects.get();
- CheckerInfo info = checkersApi.create(input).get();
- assertThat(info.name).isEqualTo("my-checker");
- PerCheckerOperations perCheckerOps = checkerOperations.checker(info.uuid);
- assertCommit(
- perCheckerOps.commit(), "Create checker", info.created, perCheckerOps.get().getRefState());
+ BadRequestException thrown =
+ assertThrows(BadRequestException.class, () -> checkersApi.create(input));
+ assertThat(thrown).hasMessageThat().contains("name is required");
}
@Test
public void createCheckerNameIsTrimmed() throws Exception {
CheckerInput input = new CheckerInput();
input.uuid = "test:my-checker";
- input.name = " my-checker ";
+ input.name = " My Checker ";
input.repository = allProjects.get();
CheckerInfo info = checkersApi.create(input).get();
- assertThat(info.name).isEqualTo("my-checker");
+ assertThat(info.name).isEqualTo("My Checker");
PerCheckerOperations perCheckerOps = checkerOperations.checker(info.uuid);
assertCommit(
@@ -160,6 +160,7 @@
public void createCheckerDescriptionIsTrimmed() throws Exception {
CheckerInput input = new CheckerInput();
input.uuid = "test:my-checker";
+ input.name = "My Checker";
input.description = " some description ";
input.repository = allProjects.get();
CheckerInfo info = checkersApi.create(input).get();
@@ -174,6 +175,7 @@
public void createCheckerUrlIsTrimmed() throws Exception {
CheckerInput input = new CheckerInput();
input.uuid = "test:my-checker";
+ input.name = "My Checker";
input.url = " http://example.com/my-checker ";
input.repository = allProjects.get();
CheckerInfo info = checkersApi.create(input).get();
@@ -188,6 +190,7 @@
public void createCheckerRepositoryIsTrimmed() throws Exception {
CheckerInput input = new CheckerInput();
input.uuid = "test:my-checker";
+ input.name = "My Checker";
input.repository = " " + allProjects.get() + " ";
CheckerInfo info = checkersApi.create(input).get();
assertThat(info.repository).isEqualTo(allProjects.get());
@@ -212,7 +215,7 @@
public void createCheckersWithSameName() throws Exception {
CheckerInput input = new CheckerInput();
input.uuid = "test:my-checker";
- input.name = "my-checker";
+ input.name = "My Checker";
input.repository = allProjects.get();
CheckerInfo info1 = checkersApi.create(input).get();
assertThat(info1.name).isEqualTo(input.name);
@@ -228,6 +231,7 @@
public void createCheckerWithExistingUuidFails() throws Exception {
CheckerInput input = new CheckerInput();
input.uuid = "test:my-checker";
+ input.name = "My Checker";
input.repository = allProjects.get();
checkersApi.create(input).get();
@@ -239,6 +243,7 @@
@Test
public void createCheckerWithoutUuidFails() throws Exception {
CheckerInput input = new CheckerInput();
+ input.name = "My Checker";
input.repository = allProjects.get();
BadRequestException thrown =
@@ -250,6 +255,7 @@
public void createCheckerWithEmptyUuidFails() throws Exception {
CheckerInput input = new CheckerInput();
input.uuid = "";
+ input.name = "My Checker";
input.repository = allProjects.get();
BadRequestException thrown =
@@ -261,6 +267,7 @@
public void createCheckerWithEmptyUuidAfterTrimFails() throws Exception {
CheckerInput input = new CheckerInput();
input.uuid = " ";
+ input.name = "My Checker";
input.repository = allProjects.get();
BadRequestException thrown =
@@ -272,6 +279,7 @@
public void createCheckerWithInvalidUuidFails() throws Exception {
CheckerInput input = new CheckerInput();
input.uuid = CheckerTestData.INVALID_UUID;
+ input.name = "My Checker";
input.repository = allProjects.get();
BadRequestException thrown =
@@ -283,6 +291,7 @@
public void createCheckerWithoutRepositoryFails() throws Exception {
CheckerInput input = new CheckerInput();
input.uuid = "test:my-checker";
+ input.name = "My Checker";
BadRequestException thrown =
assertThrows(BadRequestException.class, () -> checkersApi.create(input));
@@ -293,6 +302,7 @@
public void createCheckerWithEmptyRepositoryFails() throws Exception {
CheckerInput input = new CheckerInput();
input.uuid = "test:my-checker";
+ input.name = "My Checker";
input.repository = "";
BadRequestException thrown =
@@ -304,6 +314,7 @@
public void createCheckerWithEmptyRepositoryAfterTrimFails() throws Exception {
CheckerInput input = new CheckerInput();
input.uuid = "test:my-checker";
+ input.name = "My Checker";
input.repository = " ";
BadRequestException thrown =
@@ -315,6 +326,7 @@
public void createCheckerWithNonExistingRepositoryFails() throws Exception {
CheckerInput input = new CheckerInput();
input.uuid = "test:my-checker";
+ input.name = "My Checker";
input.repository = "non-existing";
UnprocessableEntityException thrown =
@@ -326,6 +338,7 @@
public void createDisabledChecker() throws Exception {
CheckerInput input = new CheckerInput();
input.uuid = "test:my-checker";
+ input.name = "My Checker";
input.repository = allProjects.get();
input.status = CheckerStatus.DISABLED;
@@ -337,6 +350,7 @@
public void createCheckerWithBlockingConditions() throws Exception {
CheckerInput input = new CheckerInput();
input.uuid = "test:my-checker";
+ input.name = "My Checker";
input.repository = allProjects.get();
input.blocking = ImmutableSet.of(BlockingCondition.STATE_NOT_PASSING);
@@ -348,6 +362,7 @@
public void createCheckerWithQuery() throws Exception {
CheckerInput input = new CheckerInput();
input.uuid = "test:my-checker";
+ input.name = "My Checker";
input.repository = allProjects.get();
input.query = "f:foo";
@@ -359,6 +374,7 @@
public void createCheckerWithEmptyQuery() throws Exception {
CheckerInput input = new CheckerInput();
input.uuid = "test:my-checker";
+ input.name = "My Checker";
input.repository = allProjects.get();
input.query = "";
@@ -370,6 +386,7 @@
public void createCheckerWithEmptyQueryAfterTrim() throws Exception {
CheckerInput input = new CheckerInput();
input.uuid = "test:my-checker";
+ input.name = "My Checker";
input.repository = allProjects.get();
input.query = " ";
@@ -381,6 +398,7 @@
public void createCheckerWithUnsupportedOperatorInQueryFails() throws Exception {
CheckerInput input = new CheckerInput();
input.uuid = "test:my-checker";
+ input.name = "My Checker";
input.repository = allProjects.get();
input.query = CheckerTestData.QUERY_WITH_UNSUPPORTED_OPERATOR;
@@ -395,6 +413,7 @@
public void createCheckerWithInvalidQueryFails() throws Exception {
CheckerInput input = new CheckerInput();
input.uuid = "test:my-checker";
+ input.name = "My Checker";
input.repository = allProjects.get();
input.query = CheckerTestData.INVALID_QUERY;
@@ -407,6 +426,7 @@
public void createCheckerWithTooLongQueryFails() throws Exception {
CheckerInput input = new CheckerInput();
input.uuid = "test:my-checker";
+ input.name = "My Checker";
input.repository = allProjects.get();
input.query = CheckerTestData.longQueryWithSupportedOperators(MAX_INDEX_TERMS * 2);
assertThat(CheckerQuery.clean(input.query)).isEqualTo(input.query);
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 cb3f695..3f1f132 100644
--- a/javatests/com/google/gerrit/plugins/checks/acceptance/api/GetCheckerIT.java
+++ b/javatests/com/google/gerrit/plugins/checks/acceptance/api/GetCheckerIT.java
@@ -255,6 +255,16 @@
}
@Test
+ public void getCheckerWithMissingNameFails() throws Exception {
+ CheckerUuid checkerUuid = checkerOperations.newChecker().create();
+ checkerOperations.checker(checkerUuid).forInvalidation().unsetName().invalidate();
+
+ RestApiException thrown =
+ assertThrows(RestApiException.class, () -> getCheckerInfo(checkerUuid));
+ assertThat(thrown).hasMessageThat().contains("Cannot retrieve checker " + checkerUuid);
+ }
+
+ @Test
public void getCheckerWithMissingRepositoryFails() throws Exception {
CheckerUuid checkerUuid = checkerOperations.newChecker().create();
checkerOperations.checker(checkerUuid).forInvalidation().unsetRepository().invalidate();
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 590f82f..b41d9e8 100644
--- a/javatests/com/google/gerrit/plugins/checks/acceptance/api/ListCheckersIT.java
+++ b/javatests/com/google/gerrit/plugins/checks/acceptance/api/ListCheckersIT.java
@@ -89,6 +89,7 @@
CheckerUuid invalidCheckerUuid5 = checkerOperations.newChecker().create();
CheckerUuid invalidCheckerUuid6 = checkerOperations.newChecker().create();
CheckerUuid invalidCheckerUuid7 = checkerOperations.newChecker().create();
+ CheckerUuid invalidCheckerUuid8 = checkerOperations.newChecker().create();
checkerOperations
.checker(invalidCheckerUuid1)
.forInvalidation()
@@ -102,8 +103,9 @@
.invalidate();
checkerOperations.checker(invalidCheckerUuid4).forInvalidation().invalidStatus().invalidate();
checkerOperations.checker(invalidCheckerUuid5).forInvalidation().unsetUuid().invalidate();
- checkerOperations.checker(invalidCheckerUuid6).forInvalidation().unsetRepository().invalidate();
- checkerOperations.checker(invalidCheckerUuid7).forInvalidation().unsetStatus().invalidate();
+ checkerOperations.checker(invalidCheckerUuid6).forInvalidation().unsetName().invalidate();
+ checkerOperations.checker(invalidCheckerUuid7).forInvalidation().unsetRepository().invalidate();
+ checkerOperations.checker(invalidCheckerUuid8).forInvalidation().unsetStatus().invalidate();
List<CheckerInfo> allCheckers = checkersApi.all();
assertThat(allCheckers).containsExactly(checkerOperations.checker(checkerUuid).asInfo());
diff --git a/javatests/com/google/gerrit/plugins/checks/acceptance/api/ListChecksIT.java b/javatests/com/google/gerrit/plugins/checks/acceptance/api/ListChecksIT.java
index 9650784..816ff5c 100644
--- a/javatests/com/google/gerrit/plugins/checks/acceptance/api/ListChecksIT.java
+++ b/javatests/com/google/gerrit/plugins/checks/acceptance/api/ListChecksIT.java
@@ -77,7 +77,10 @@
String checkerName1 = "Checker One";
CheckerUuid checkerUuid1 =
checkerOperations.newChecker().name(checkerName1).repository(project).create();
- CheckerUuid checkerUuid2 = checkerOperations.newChecker().repository(project).create();
+
+ String checkerName2 = "Checker Two";
+ CheckerUuid checkerUuid2 =
+ checkerOperations.newChecker().name(checkerName2).repository(project).create();
CheckKey checkKey1 = CheckKey.create(project, patchSetId, checkerUuid1);
checkOperations.newCheck(checkKey1).state(CheckState.RUNNING).upsert();
@@ -93,6 +96,7 @@
CheckInfo expectedCheckInfo2 = checkOperations.check(checkKey2).asInfo();
expectedCheckInfo2.repository = project.get();
+ expectedCheckInfo2.checkerName = checkerName2;
expectedCheckInfo2.blocking = ImmutableSet.of();
expectedCheckInfo2.checkerStatus = CheckerStatus.ENABLED;
@@ -105,7 +109,10 @@
String checkerName1 = "Checker One";
CheckerUuid checkerUuid1 =
checkerOperations.newChecker().name(checkerName1).repository(project).create();
- CheckerUuid checkerUuid2 = checkerOperations.newChecker().repository(project).create();
+
+ String checkerName2 = "Checker Two";
+ CheckerUuid checkerUuid2 =
+ checkerOperations.newChecker().name(checkerName2).repository(project).create();
CheckKey checkKey1 = CheckKey.create(project, patchSetId, checkerUuid1);
checkOperations.newCheck(checkKey1).state(CheckState.RUNNING).upsert();
@@ -121,6 +128,7 @@
CheckInfo expectedCheckInfo2 = checkOperations.check(checkKey2).asInfo();
expectedCheckInfo2.repository = project.get();
+ expectedCheckInfo2.checkerName = checkerName2;
expectedCheckInfo2.blocking = ImmutableSet.of();
expectedCheckInfo2.checkerStatus = CheckerStatus.ENABLED;
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 f78fee2..8a2d2d4 100644
--- a/javatests/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImplTest.java
+++ b/javatests/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImplTest.java
@@ -70,7 +70,7 @@
CheckerInfo foundChecker = getCheckerFromServer(checkerUuid);
assertThat(foundChecker.uuid).isEqualTo(checkerUuid.get());
- assertThat(foundChecker.name).isNull();
+ assertThat(foundChecker.name).isNotNull();
assertThat(foundChecker.repository).isEqualTo(allProjects.get());
assertThat(foundChecker.status).isEqualTo(CheckerStatus.ENABLED);
assertThat(foundChecker.query).isEqualTo("status:open");
@@ -257,9 +257,9 @@
CheckerUuid checkerUuid =
checkerOperations.newChecker().name("ABC-789-this-name-must-be-unique").create();
- Optional<String> checkerName = checkerOperations.checker(checkerUuid).get().getName();
+ String checkerName = checkerOperations.checker(checkerUuid).get().getName();
- assertThat(checkerName).hasValue("ABC-789-this-name-must-be-unique");
+ assertThat(checkerName).isEqualTo("ABC-789-this-name-must-be-unique");
}
@Test
@@ -416,8 +416,8 @@
checkerOperations.checker(checkerUuid).forUpdate().name("updated name").update();
- Optional<String> currentName = checkerOperations.checker(checkerUuid).get().getName();
- assertThat(currentName).hasValue("updated name");
+ String currentName = checkerOperations.checker(checkerUuid).get().getName();
+ assertThat(currentName).isEqualTo("updated name");
}
@Test
@@ -591,6 +591,17 @@
}
@Test
+ public void nameCanBeUnset() throws Exception {
+ CheckerUuid checkerUuid = checkerOperations.newChecker().create();
+
+ checkerOperations.checker(checkerUuid).forInvalidation().unsetName().invalidate();
+
+ ConfigInvalidException thrown =
+ assertThrows(ConfigInvalidException.class, () -> checkers.getChecker(checkerUuid));
+ assertThat(thrown).hasMessageThat().contains("checker.name is not set in config file");
+ }
+
+ @Test
public void repositoryCanBeUnset() throws Exception {
CheckerUuid checkerUuid = checkerOperations.newChecker().create();
@@ -670,7 +681,7 @@
Checker checker = checkerOperations.checker(checkerUuid).get();
CheckerInfo checkerInfo = checkerOperations.checker(checkerUuid).asInfo();
assertThat(checkerInfo.uuid).isEqualTo(checker.getUuid().get());
- assertThat(checkerInfo.name).isEqualTo(checker.getName().get());
+ assertThat(checkerInfo.name).isEqualTo(checker.getName());
assertThat(checkerInfo.description).isEqualTo(checker.getDescription().get());
assertThat(checkerInfo.url).isEqualTo(checker.getUrl().get());
assertThat(checkerInfo.created).isEqualTo(checker.getCreated());
@@ -734,6 +745,7 @@
private CheckerInput createArbitraryCheckerInput() {
CheckerInput checkerInput = new CheckerInput();
checkerInput.uuid = "test:my-checker";
+ checkerInput.name = "My Checker";
checkerInput.repository = allProjects.get();
return checkerInput;
}
diff --git a/javatests/com/google/gerrit/plugins/checks/db/CheckerConfigTest.java b/javatests/com/google/gerrit/plugins/checks/db/CheckerConfigTest.java
index 15b85fe..a4d02b1 100644
--- a/javatests/com/google/gerrit/plugins/checks/db/CheckerConfigTest.java
+++ b/javatests/com/google/gerrit/plugins/checks/db/CheckerConfigTest.java
@@ -52,6 +52,7 @@
private TestRepository<?> testRepository;
private final CheckerUuid checkerUuid = CheckerUuid.parse("test:my-checker");
+ private final String checkerName = "My Checker";
private final Project.NameKey checkerRepository = Project.nameKey("my-repo");
private final TimeZone timeZone = TimeZone.getTimeZone("America/Los_Angeles");
@@ -82,23 +83,52 @@
}
@Test
- public void setNameDuringCreation() throws Exception {
- String anotherName = "another-name";
+ public void specifiedCheckerNameIsRespectedForNewChecker() throws Exception {
+ CheckerCreation checkerCreation =
+ getPrefilledCheckerCreationBuilder().setName(checkerName).build();
+ createChecker(checkerCreation);
- CheckerCreation checkerCreation = getPrefilledCheckerCreationBuilder().build();
+ CheckerConfig checkerConfig = loadChecker(checkerUuid);
+ assertThat(checkerConfig).hasName(checkerName);
+ assertThat(checkerConfig).configStringList("name").containsExactly("My Checker");
+ }
+
+ @Test
+ public void nameOfCheckerUpdateOverridesCheckerCreation() throws Exception {
+ String anotherName = "Another Name";
+
+ CheckerCreation checkerCreation =
+ getPrefilledCheckerCreationBuilder().setName(checkerName).build();
CheckerUpdate checkerUpdate = CheckerUpdate.builder().setName(anotherName).build();
createChecker(checkerCreation, checkerUpdate);
CheckerConfig checkerConfig = loadChecker(checkerCreation.getCheckerUuid());
- assertThat(checkerConfig).hasNameThat().value().isEqualTo(anotherName);
+ assertThat(checkerConfig).hasName(anotherName);
assertThat(checkerConfig).configStringList("name").containsExactly(anotherName);
}
@Test
+ public void nameOfNewCheckerMustNotBeEmpty() throws Exception {
+ CheckerCreation checkerCreation =
+ getPrefilledCheckerCreationBuilder().setName("").buildWithoutValidationForTesting();
+ CheckerConfig checkerConfig =
+ CheckerConfig.createForNewChecker(projectName, repository, checkerCreation);
+
+ try (MetaDataUpdate metaDataUpdate = createMetaDataUpdate()) {
+ Throwable thrown = assertThrows(Throwable.class, () -> checkerConfig.commit(metaDataUpdate));
+ assertThat(thrown).hasCauseThat().isInstanceOf(ConfigInvalidException.class);
+ assertThat(thrown)
+ .hasMessageThat()
+ .contains(String.format("Name of the checker %s must be defined", checkerUuid));
+ }
+ }
+
+ @Test
public void descriptionDefaultsToOptionalEmpty() throws Exception {
CheckerCreation checkerCreation =
CheckerCreation.builder()
.setCheckerUuid(checkerUuid)
+ .setName(checkerName)
.setRepository(checkerRepository)
.build();
createChecker(checkerCreation);
@@ -137,6 +167,7 @@
CheckerCreation checkerCreation =
CheckerCreation.builder()
.setCheckerUuid(checkerUuid)
+ .setName(checkerName)
.setRepository(checkerRepository)
.build();
createChecker(checkerCreation);
@@ -202,7 +233,9 @@
@Test
public void repositoryOfNewCheckerMustNotBeEmpty() throws Exception {
CheckerCreation checkerCreation =
- getPrefilledCheckerCreationBuilder().setRepository(Project.nameKey("")).build();
+ getPrefilledCheckerCreationBuilder()
+ .setRepository(Project.nameKey(""))
+ .buildWithoutValidationForTesting();
CheckerConfig checkerConfig =
CheckerConfig.createForNewChecker(projectName, repository, checkerCreation);
@@ -237,6 +270,23 @@
}
@Test
+ public void nameInConfigMayNotBeUndefined() throws Exception {
+ populateCheckerConfig(
+ checkerUuid,
+ "[checker]\n uuid = "
+ + checkerUuid
+ + "\n repository = "
+ + checkerRepository
+ + "\n status = ENABLED");
+
+ ConfigInvalidException thrown =
+ assertThrows(ConfigInvalidException.class, () -> loadChecker(checkerUuid));
+ assertThat(thrown)
+ .hasMessageThat()
+ .contains("checker.name is not set in config file for checker " + checkerUuid);
+ }
+
+ @Test
public void correctCommitMessageForCheckerUpdate() throws Exception {
createArbitraryChecker(checkerUuid);
assertThatCommitMessage(checkerUuid).isEqualTo("Create checker");
@@ -247,31 +297,39 @@
}
@Test
- public void nameCanBeUpdatedAndRemoved() throws Exception {
+ public void nameCanBeUpdated() throws Exception {
CheckerCreation checkerCreation =
CheckerCreation.builder()
.setCheckerUuid(checkerUuid)
+ .setName(checkerName)
.setRepository(checkerRepository)
.build();
createChecker(checkerCreation);
CheckerConfig checkerConfig = loadChecker(checkerUuid);
- assertThat(checkerConfig).hasNameThat().isAbsent();
+ assertThat(checkerConfig).hasName(checkerName);
- String newName = "new-name";
+ String newName = "New Name";
CheckerUpdate checkerUpdate = CheckerUpdate.builder().setName(newName).build();
updateChecker(checkerUuid, checkerUpdate);
checkerConfig = loadChecker(checkerUuid);
- assertThat(checkerConfig).hasNameThat().value().isEqualTo(newName);
+ assertThat(checkerConfig).hasName(newName);
assertThat(checkerConfig).configStringList("name").containsExactly(newName);
+ }
- checkerUpdate = CheckerUpdate.builder().setName("").build();
- updateChecker(checkerUuid, checkerUpdate);
+ @Test
+ public void nameCannotBeRemoved() throws Exception {
+ createArbitraryChecker(checkerUuid);
- checkerConfig = loadChecker(checkerUuid);
- assertThat(checkerConfig).hasNameThat().isAbsent();
- assertThat(checkerConfig).configStringList("name").isEmpty();
+ CheckerUpdate checkerUpdate =
+ CheckerUpdate.builder().setName("").buildWithoutValidationForTesting();
+
+ IOException thrown =
+ assertThrows(IOException.class, () -> updateChecker(checkerUuid, checkerUpdate));
+ assertThat(thrown)
+ .hasMessageThat()
+ .contains(String.format("Name of the checker %s must be defined", checkerUuid));
}
@Test
@@ -325,6 +383,7 @@
CheckerCreation checkerCreation =
CheckerCreation.builder()
.setCheckerUuid(checkerUuid)
+ .setName(checkerName)
.setRepository(checkerRepository)
.build();
createChecker(checkerCreation);
@@ -345,7 +404,9 @@
createArbitraryChecker(checkerUuid);
CheckerUpdate checkerUpdate =
- CheckerUpdate.builder().setRepository(Project.nameKey("")).build();
+ CheckerUpdate.builder()
+ .setRepository(Project.nameKey(""))
+ .buildWithoutValidationForTesting();
IOException thrown =
assertThrows(IOException.class, () -> updateChecker(checkerUuid, checkerUpdate));
@@ -514,7 +575,10 @@
}
private CheckerCreation.Builder getPrefilledCheckerCreationBuilder() {
- return CheckerCreation.builder().setCheckerUuid(checkerUuid).setRepository(checkerRepository);
+ return CheckerCreation.builder()
+ .setCheckerUuid(checkerUuid)
+ .setName(checkerName)
+ .setRepository(checkerRepository);
}
private CheckerConfig createChecker(CheckerCreation checkerCreation) throws Exception {