Implement isOptionEnabled for project + branch level

Google-bug-id: b/369431612
Release-Notes: skip
Change-Id: I2e99bb13235e6be6003504b135f4dba4d25b07fc
diff --git a/java/com/google/gerrit/plugins/codeowners/validation/SkipCodeOwnerConfigValidationPushOption.java b/java/com/google/gerrit/plugins/codeowners/validation/SkipCodeOwnerConfigValidationPushOption.java
index 316da14..049cf11 100644
--- a/java/com/google/gerrit/plugins/codeowners/validation/SkipCodeOwnerConfigValidationPushOption.java
+++ b/java/com/google/gerrit/plugins/codeowners/validation/SkipCodeOwnerConfigValidationPushOption.java
@@ -18,6 +18,8 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableListMultimap;
+import com.google.gerrit.entities.BranchNameKey;
+import com.google.gerrit.entities.Project;
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.restapi.AuthException;
 import com.google.gerrit.plugins.codeowners.backend.ChangedFiles;
@@ -79,6 +81,14 @@
         && hasModifiedCodeOwnerConfigFiles(changeNotes);
   }
 
+  // TODO: Extend check to contain hasModifiedCodeOwnerConfigFiles as well
+  // Callers would need to specify the list of files for that.
+  @Override
+  public boolean isOptionEnabled(Project.NameKey project, BranchNameKey branch) {
+    return !codeOwnersPluginConfiguration.getProjectConfig(project).isDisabled(branch.branch())
+        && canSkipCodeOwnerConfigValidation();
+  }
+
   private boolean hasModifiedCodeOwnerConfigFiles(ChangeNotes changeNotes) {
     CodeOwnerBackend codeOwnerBackend =
         codeOwnersPluginConfiguration
diff --git a/javatests/com/google/gerrit/plugins/codeowners/acceptance/api/SkipCodeOwnerConfigValidationPushOptionIT.java b/javatests/com/google/gerrit/plugins/codeowners/acceptance/api/SkipCodeOwnerConfigValidationPushOptionIT.java
index dd2cf9d..8b2c6bf 100644
--- a/javatests/com/google/gerrit/plugins/codeowners/acceptance/api/SkipCodeOwnerConfigValidationPushOptionIT.java
+++ b/javatests/com/google/gerrit/plugins/codeowners/acceptance/api/SkipCodeOwnerConfigValidationPushOptionIT.java
@@ -73,12 +73,21 @@
     Change.Id changeId = createChangeWithCodeOwnerConfigFile(project);
     ValidationOptionInfos validationOptionsInfos =
         gApi.changes().id(project.get(), changeId.get()).getValidationOptions();
+    ValidationOptionInfos branchValidationOptionInfos =
+        gApi.projects().name(project.get()).branch("refs/heads/master").getValidationOptions();
     assertThat(validationOptionsInfos.validationOptions)
         .isEqualTo(
             ImmutableList.of(
                 new ValidationOptionInfo(
                     "code-owners~" + SkipCodeOwnerConfigValidationPushOption.NAME,
                     SkipCodeOwnerConfigValidationPushOption.DESCRIPTION)));
+
+    assertThat(branchValidationOptionInfos.validationOptions)
+        .isEqualTo(
+            ImmutableList.of(
+                new ValidationOptionInfo(
+                    "code-owners~" + SkipCodeOwnerConfigValidationPushOption.NAME,
+                    SkipCodeOwnerConfigValidationPushOption.DESCRIPTION)));
   }
 
   @Test
@@ -95,12 +104,21 @@
     Change.Id changeId = createChangeWithCodeOwnerConfigFile(project);
     ValidationOptionInfos validationOptionsInfos =
         gApi.changes().id(project.get(), changeId.get()).getValidationOptions();
+    ValidationOptionInfos branchValidationOptionInfos =
+        gApi.projects().name(project.get()).branch("refs/heads/master").getValidationOptions();
     assertThat(validationOptionsInfos.validationOptions)
         .isEqualTo(
             ImmutableList.of(
                 new ValidationOptionInfo(
                     "code-owners~" + SkipCodeOwnerConfigValidationPushOption.NAME,
                     SkipCodeOwnerConfigValidationPushOption.DESCRIPTION)));
+
+    assertThat(branchValidationOptionInfos.validationOptions)
+        .isEqualTo(
+            ImmutableList.of(
+                new ValidationOptionInfo(
+                    "code-owners~" + SkipCodeOwnerConfigValidationPushOption.NAME,
+                    SkipCodeOwnerConfigValidationPushOption.DESCRIPTION)));
   }
 
   @Test
@@ -113,7 +131,10 @@
     Change.Id changeId = createChangeWithCodeOwnerConfigFile(project);
     ValidationOptionInfos validationOptionsInfos =
         gApi.changes().id(project.get(), changeId.get()).getValidationOptions();
+    ValidationOptionInfos branchValidationOptionInfos =
+        gApi.projects().name(project.get()).branch("refs/heads/master").getValidationOptions();
     assertThat(validationOptionsInfos.validationOptions).isEmpty();
+    assertThat(branchValidationOptionInfos.validationOptions).isEmpty();
   }
 
   @GerritConfig(name = "plugin.code-owners.disabled", value = "true")
@@ -123,7 +144,10 @@
     Change.Id changeId = createChangeWithCodeOwnerConfigFile(project);
     ValidationOptionInfos validationOptionsInfos =
         gApi.changes().id(project.get(), changeId.get()).getValidationOptions();
+    ValidationOptionInfos branchValidationOptionInfos =
+        gApi.projects().name(project.get()).branch("refs/heads/master").getValidationOptions();
     assertThat(validationOptionsInfos.validationOptions).isEmpty();
+    assertThat(branchValidationOptionInfos.validationOptions).isEmpty();
   }
 
   @GerritConfig(name = "plugin.code-owners.disabledBranch", value = "refs/heads/master")
@@ -133,7 +157,10 @@
     Change.Id changeId = createChangeWithCodeOwnerConfigFile(project, "master");
     ValidationOptionInfos validationOptionsInfos =
         gApi.changes().id(project.get(), changeId.get()).getValidationOptions();
+    ValidationOptionInfos branchValidationOptionInfos =
+        gApi.projects().name(project.get()).branch("refs/heads/master").getValidationOptions();
     assertThat(validationOptionsInfos.validationOptions).isEmpty();
+    assertThat(branchValidationOptionInfos.validationOptions).isEmpty();
   }
 
   @Test
@@ -142,7 +169,15 @@
     Change.Id changeId = changeOperations.newChange().project(project).create();
     ValidationOptionInfos validationOptionsInfos =
         gApi.changes().id(project.get(), changeId.get()).getValidationOptions();
+    ValidationOptionInfos branchValidationOptionInfos =
+        gApi.projects().name(project.get()).branch("refs/heads/master").getValidationOptions();
     assertThat(validationOptionsInfos.validationOptions).isEmpty();
+    assertThat(branchValidationOptionInfos.validationOptions)
+        .isEqualTo(
+            ImmutableList.of(
+                new ValidationOptionInfo(
+                    "code-owners~" + SkipCodeOwnerConfigValidationPushOption.NAME,
+                    SkipCodeOwnerConfigValidationPushOption.DESCRIPTION)));
   }
 
   private Change.Id createChangeWithCodeOwnerConfigFile(Project.NameKey project) throws Exception {