Avoid processing internal Gerrit refs

When Gerrit internal refs are updated, the its-base plugin should
not consider them as actionable because they do not necessarily
point to any valid Git commit object.

refs/starred-changes/ and refs/sequences/ are internal and thus
they should always be ignored.

Bug: Issue 11097
Change-Id: Ic5099d67b7bd7e757de8305c4a60ddbbbebf1b0d
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/its/ItsConfig.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/its/ItsConfig.java
index cd125b0..1b06cd6 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/its/ItsConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/its/ItsConfig.java
@@ -21,6 +21,7 @@
 import com.google.gerrit.extensions.api.projects.CommentLinkInfo;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.reviewdb.client.Project.NameKey;
+import com.google.gerrit.reviewdb.client.RefNames;
 import com.google.gerrit.server.config.GerritServerConfig;
 import com.google.gerrit.server.config.PluginConfig;
 import com.google.gerrit.server.config.PluginConfigFactory;
@@ -102,6 +103,10 @@
   }
 
   public boolean isEnabled(Project.NameKey projectNK, String refName) {
+    if (isInternalRef(refName)) {
+      return false;
+    }
+
     ProjectState projectState = projectCache.get(projectNK);
     if (projectState == null) {
       log.error(
@@ -123,6 +128,10 @@
         && isEnabledForBranch(projectState, refName);
   }
 
+  private boolean isInternalRef(String refName) {
+    return RefNames.isNoteDbMetaRef(refName) || refName.startsWith(RefNames.REFS_SEQUENCES);
+  }
+
   private boolean isEnforcedByAnyParentProject(String refName, ProjectState projectState) {
     for (ProjectState parentState : projectState.treeInOrder()) {
       PluginConfig parentCfg = pluginCfgFactory.getFromProjectConfig(parentState, pluginName);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/its/ItsConfigTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/its/ItsConfigTest.java
index 6561d00..aafbf38 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/its/ItsConfigTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/its/ItsConfigTest.java
@@ -20,6 +20,8 @@
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.config.FactoryModule;
 import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.Project.NameKey;
+import com.google.gerrit.reviewdb.client.RefNames;
 import com.google.gerrit.server.config.GerritServerConfig;
 import com.google.gerrit.server.config.PluginConfig;
 import com.google.gerrit.server.config.PluginConfigFactory;
@@ -386,6 +388,48 @@
     assertTrue(itsConfig.isEnabled(event));
   }
 
+  public void testIsDisabledForStarredChangesRefs() {
+    RefUpdatedEvent event =
+        new RefUpdatedEvent() {
+          @Override
+          public String getRefName() {
+            return RefNames.REFS_STARRED_CHANGES + "123";
+          }
+
+          @Override
+          public NameKey getProjectNameKey() {
+            return new Project.NameKey("foo");
+          }
+        };
+
+    ItsConfig itsConfig = createItsConfig();
+
+    replayMocks();
+
+    assertFalse(itsConfig.isEnabled(event));
+  }
+
+  public void testIsDisabledForSequencesRefs() {
+    RefUpdatedEvent event =
+        new RefUpdatedEvent() {
+          @Override
+          public String getRefName() {
+            return RefNames.REFS_SEQUENCES + "changes";
+          }
+
+          @Override
+          public NameKey getProjectNameKey() {
+            return new Project.NameKey("foo");
+          }
+        };
+
+    ItsConfig itsConfig = createItsConfig();
+
+    replayMocks();
+
+    assertFalse(itsConfig.isEnabled(event));
+  }
+
   public void BROKEN_testIsEnabledEventDisabled() {
     String[] branches = {"^refs/heads/testBranch"};
     setupIsEnabled("false", null, branches);