Test updating of an invalid code owner config

An invalid config cannot be updated, since we need the parsed config to
apply the updates.

This increases the test coverage for AbstractFileBasedCodeOwnerBackend
from 89.5% to 93.0%.

Signed-off-by: Edwin Kempin <ekempin@google.com>
Change-Id: I603d0d8986b578e8a37b0b8b76306e40097d29b6
diff --git a/javatests/com/google/gerrit/plugins/codeowners/backend/AbstractFileBasedCodeOwnerBackendTest.java b/javatests/com/google/gerrit/plugins/codeowners/backend/AbstractFileBasedCodeOwnerBackendTest.java
index 8874141..fbb6c47 100644
--- a/javatests/com/google/gerrit/plugins/codeowners/backend/AbstractFileBasedCodeOwnerBackendTest.java
+++ b/javatests/com/google/gerrit/plugins/codeowners/backend/AbstractFileBasedCodeOwnerBackendTest.java
@@ -24,11 +24,15 @@
 import com.google.gerrit.exceptions.StorageException;
 import com.google.gerrit.plugins.codeowners.acceptance.AbstractCodeOwnersTest;
 import com.google.gerrit.plugins.codeowners.testing.backend.TestCodeOwnerConfigStorage;
+import com.google.gerrit.plugins.codeowners.util.JgitPath;
 import com.google.gerrit.server.IdentifiedUser;
 import java.nio.file.Paths;
 import java.util.Optional;
+import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.junit.TestRepository;
 import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.junit.Before;
@@ -406,6 +410,48 @@
   }
 
   @Test
+  public void cannotUpdateInvalidCodeOwnerConfig() throws Exception {
+    CodeOwnerConfig.Key codeOwnerConfigKey = CodeOwnerConfig.Key.create(project, "master", "/");
+
+    // create an invalid code owner config
+    try (TestRepository<Repository> testRepo =
+        new TestRepository<>(repoManager.openRepository(codeOwnerConfigKey.project()))) {
+      Ref ref = testRepo.getRepository().exactRef(codeOwnerConfigKey.ref());
+      RevCommit head = testRepo.getRevWalk().parseCommit(ref.getObjectId());
+      testRepo.update(
+          codeOwnerConfigKey.ref(),
+          testRepo
+              .commit()
+              .parent(head)
+              .message("Add invalid test code owner config")
+              .add(JgitPath.of(codeOwnerConfigKey.filePath(getFileName())).get(), "INVALID"));
+    }
+
+    // Try to update the code owner config.
+    StorageException exception =
+        assertThrows(
+            StorageException.class,
+            () ->
+                codeOwnerBackend.upsertCodeOwnerConfig(
+                    codeOwnerConfigKey,
+                    CodeOwnerConfigUpdate.builder()
+                        .setCodeOwnerSetsModification(
+                            CodeOwnerSetModification.addToOnlySet(user.email()))
+                        .build(),
+                    /* currentUser= */ null));
+    assertThat(exception)
+        .hasMessageThat()
+        .isEqualTo(String.format("failed to upsert code owner config %s", codeOwnerConfigKey));
+    assertThat(exception).hasCauseThat().isInstanceOf(ConfigInvalidException.class);
+    assertThat(exception.getCause())
+        .hasMessageThat()
+        .contains(
+            String.format(
+                "invalid code owner config file '/%s' (project = %s, branch = master)",
+                getFileName(), project));
+  }
+
+  @Test
   public void cannotUpdateCodeOwnerConfigInNonExistingBranch() throws Exception {
     CodeOwnerConfig.Key codeOwnerConfigKey =
         CodeOwnerConfig.Key.create(project, "non-existing", "/");
diff --git a/javatests/com/google/gerrit/plugins/codeowners/backend/BUILD b/javatests/com/google/gerrit/plugins/codeowners/backend/BUILD
index cc2d70a..f21c5c1 100644
--- a/javatests/com/google/gerrit/plugins/codeowners/backend/BUILD
+++ b/javatests/com/google/gerrit/plugins/codeowners/backend/BUILD
@@ -38,11 +38,13 @@
         "//java/com/google/gerrit/testing:gerrit-test-util",
         "//lib:guava",
         "//lib:jgit",
+        "//lib:jgit-junit",
         "//lib/truth",
         "//lib/truth:truth-java8-extension",
         "//plugins/code-owners/java/com/google/gerrit/plugins/codeowners/acceptance",
         "//plugins/code-owners/java/com/google/gerrit/plugins/codeowners/backend",
         "//plugins/code-owners/java/com/google/gerrit/plugins/codeowners/testing",
         "//plugins/code-owners/java/com/google/gerrit/plugins/codeowners/testing/backend:testutil",
+        "//plugins/code-owners/java/com/google/gerrit/plugins/codeowners/util",
     ],
 )