Extract interface from EiffelEventParser

To enable mocking it in tests.
Temporarily keep the name of the implementation to make the diffs more
review-friendly. Rename implementation and interface in follow-up.

Solves: Jira GER-1715
Change-Id: I5b676e052a3799e8f00192c6306eb6313ccf2268
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/Module.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/Module.java
index 28649a0..9f53bee 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/Module.java
@@ -39,6 +39,8 @@
 import com.googlesource.gerrit.plugins.eventseiffel.mapping.EiffelEventFactory;
 import com.googlesource.gerrit.plugins.eventseiffel.mapping.EiffelEventMapper;
 import com.googlesource.gerrit.plugins.eventseiffel.mq.RabbitMqPublisher;
+import com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParser;
+import com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParserIf;
 import com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParsingExecutor;
 import com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParsingQueue;
 import com.googlesource.gerrit.plugins.eventseiffel.rest.RestModule;
@@ -98,6 +100,7 @@
         .in(Scopes.SINGLETON);
     bind(EiffelEventParsingExecutor.Scheduled.class).in(Scopes.SINGLETON);
     bind(EiffelEventParsingExecutor.class).to(EiffelEventParsingExecutor.Scheduled.class);
+    bind(EiffelEventParserIf.class).to(EiffelEventParser.class);
     bind(EiffelEventParsingQueue.class).in(Scopes.SINGLETON);
     bind(EiffelEventHubImpl.class).in(Scopes.SINGLETON);
     bind(EiffelEventHub.class).to(EiffelEventHubImpl.class);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParser.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParser.java
index 34ac69e..df82291 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParser.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParser.java
@@ -59,7 +59,7 @@
 import org.eclipse.jgit.revwalk.RevCommit;
 
 /** Creates and pushes missing Eiffel events to the Eiffel event queue. */
-public class EiffelEventParser {
+public class EiffelEventParser implements EiffelEventParserIf {
   private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private static final int NBR_RETRIES = 3;
@@ -81,6 +81,10 @@
     this.mapper = mapper;
   }
 
+  /* (non-Javadoc)
+   * @see com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParserIf#createAndScheduleSccFromEvent(com.google.gerrit.extensions.events.RevisionCreatedListener.Event)
+   */
+  @Override
   public void createAndScheduleSccFromEvent(Event event) {
     CommitInfo commit = event.getRevision().commit;
     SourceChangeEventKey scc =
@@ -118,31 +122,25 @@
     }
   }
 
-  /**
-   * Creates SCC events for all commits reachable from branch. I.e. create SCCs for already merged
-   * commit that are missing SCCs.
-   *
-   * @param repoName - the repository containing the commits to create events from.
-   * @param targetBranch - used to populate data.gitIdentifier.branch.
+  /* (non-Javadoc)
+   * @see com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParserIf#createAndScheduleSccFromBranch(java.lang.String, java.lang.String)
    */
-  public void createAndScheduleSccFromBranch(String repoName, String targetBranch) {
-    ObjectId tip = getTipOf(repoName, targetBranch);
+  @Override
+  public void createAndScheduleSccFromBranch(String repoName, String branchRef) {
+    ObjectId tip = getTipOf(repoName, branchRef);
     if (tip == null) {
       return;
     }
-    createAndScheduleSccFromCommit(repoName, targetBranch, tip.getName());
+    createAndScheduleSccFromCommit(repoName, branchRef, tip.getName());
   }
 
-  /**
-   * Creates SCC events for all commits reachable from commit.
-   *
-   * @param repoName - the repository containing the commits to create events from.
-   * @param targetBranch  - used to populate data.gitIdentifier.branch.
-   * @param commit - create events from commits reachable from commit.
+  /* (non-Javadoc)
+   * @see com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParserIf#createAndScheduleSccFromCommit(java.lang.String, java.lang.String, java.lang.String)
    */
-  public void createAndScheduleSccFromCommit(String repoName, String targetBranch, String commit) {
+  @Override
+  public void createAndScheduleSccFromCommit(String repoName, String branchRef, String commit) {
 
-    SourceChangeEventKey scc = SourceChangeEventKey.sccKey(repoName, targetBranch, commit);
+    SourceChangeEventKey scc = SourceChangeEventKey.sccKey(repoName, branchRef, commit);
     try {
       createAndScheduleMissingSccs(scc);
     } catch (IOException
@@ -154,15 +152,23 @@
     }
   }
 
-  public void createAndScheduleMissingScssFromBranch(String repoName, String branch) {
-    ObjectId tip = getTipOf(repoName, branch);
+  /* (non-Javadoc)
+   * @see com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParserIf#createAndScheduleMissingScssFromBranch(java.lang.String, java.lang.String)
+   */
+  @Override
+  public void createAndScheduleMissingScssFromBranch(String repoName, String branchRef) {
+    ObjectId tip = getTipOf(repoName, branchRef);
     if (tip == null) {
       return;
     }
-    SourceChangeEventKey scs = SourceChangeEventKey.scsKey(repoName, branch, tip.getName());
+    SourceChangeEventKey scs = SourceChangeEventKey.scsKey(repoName, branchRef, tip.getName());
     createAndScheduleMissingScss(scs, null, null, null);
   }
 
+  /* (non-Javadoc)
+   * @see com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParserIf#createAndScheduleMissingScss(com.googlesource.gerrit.plugins.eventseiffel.eiffel.SourceChangeEventKey, java.lang.String, com.google.gerrit.extensions.common.AccountInfo, java.lang.Long)
+   */
+  @Override
   public void createAndScheduleMissingScss(
       SourceChangeEventKey scs,
       String commitSha1TransactionEnd,
@@ -224,32 +230,36 @@
     }
   }
 
+  /* (non-Javadoc)
+   * @see com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParserIf#createAndScheduleArtc(java.lang.String, java.lang.String, java.lang.Long, boolean)
+   */
+  @Override
   public void createAndScheduleArtc(
-      String projectName, String tagName, Long creationTime, boolean force) {
+      String repoName, String tagName, Long creationTime, boolean force) {
     try {
       CompositionDefinedEventKey cd =
-          CompositionDefinedEventKey.create(mapper.tagCompositionName(projectName), tagName);
+          CompositionDefinedEventKey.create(mapper.tagCompositionName(repoName), tagName);
       Optional<UUID> oldCdId = eventHub.getExistingId(cd);
       if (oldCdId.isEmpty() || force) {
-        createAndScheduleCd(projectName, tagName, creationTime, force);
+        createAndScheduleCd(repoName, tagName, creationTime, force);
         Optional<UUID> cdId = eventHub.getExistingId(cd);
         if (cdId.isPresent() && !cdId.equals(oldCdId)) {
-          pushToHub(mapper.toArtc(projectName, tagName, creationTime, cdId.get()), force);
+          pushToHub(mapper.toArtc(repoName, tagName, creationTime, cdId.get()), force);
           if (oldCdId.isPresent()) {
             logger.atInfo().log(
-                "Event Artc has been forcibly created for: %s, %s", projectName, tagName);
+                "Event Artc has been forcibly created for: %s, %s", repoName, tagName);
           } else {
-            logger.atFine().log("Event Artc has been created for: %s, %s", projectName, tagName);
+            logger.atFine().log("Event Artc has been created for: %s, %s", repoName, tagName);
           }
         }
       } else {
         /* Artc event has already been created */
         logger.atWarning().log(
-            "Event Artc has already been created for: %s, %s", projectName, tagName);
+            "Event Artc has already been created for: %s, %s", repoName, tagName);
       }
     } catch (EiffelEventIdLookupException | InterruptedException e) {
       logger.atSevere().withCause(e).log(
-          "Event creation failed for: %s, %s to Artc", projectName, tagName);
+          "Event creation failed for: %s, %s to Artc", repoName, tagName);
     }
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserIf.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserIf.java
new file mode 100644
index 0000000..94aa921
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserIf.java
@@ -0,0 +1,74 @@
+// Copyright (C) 2022 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.googlesource.gerrit.plugins.eventseiffel.parsing;
+
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.events.RevisionCreatedListener.Event;
+import com.googlesource.gerrit.plugins.eventseiffel.eiffel.SourceChangeEventKey;
+
+public interface EiffelEventParserIf {
+
+  void createAndScheduleSccFromEvent(Event event);
+
+  /**
+   * Creates SCC events for all commits reachable from branchRef. I.e. create SCCs for already
+   * merged commit that are missing SCCs.
+   *
+   * @param repoName - Name of the repository where the branch exists.
+   * @param branchRef - Creates missing events for all commits reachable from branch.
+   */
+  void createAndScheduleSccFromBranch(String repoName, String branchRef);
+
+  /**
+   * Creates SCC events for all commits reachable from commit.
+   *
+   * @param repoName - Name of the repository were the commits exists.
+   * @param branchRef - Ref of the branch to create events for.
+   * @param commit - Creates missing events for all commits reachable from commit.
+   */
+  void createAndScheduleSccFromCommit(String repoName, String branchRef, String commit);
+
+  /**
+   * Creates missing SCS events for repoName, branch.
+   *
+   * @param repoName - Name of the repository where the branch exists.
+   * @param branchRef - Creates missing events for all commits reachable from branchRef.
+   */
+  void createAndScheduleMissingScssFromBranch(String repoName, String branchRef);
+
+  /**
+   * Creates missing SCS events for a submit transaction. submitter and submittedAt is set for all
+   * events created within the submit transaction, i.e. not reachable from commitSha1TransactionEnd.
+   *
+   * @param scs - key for the event that shuold be created, together with parents.
+   * @param commitSha1TransactionEnd - tip before submit transaction.
+   * @param submitter - The submitter
+   * @param submittedAt - When the commit was submitted.
+   */
+  void createAndScheduleMissingScss(
+      SourceChangeEventKey scs,
+      String commitSha1TransactionEnd,
+      AccountInfo submitter,
+      Long submittedAt);
+
+  /**
+   * Creates missing ARTC for a tag, together with CD and (if missing) SCS for referenced commit.
+   *
+   * @param repoName - Name of the repository were the tag exists.
+   * @param tagName - The name of the tag.
+   * @param creationTime - The time at which the tag was created.
+   * @param force - Whether existing events should be replaced or not.
+   */
+  void createAndScheduleArtc(String repoName, String tagName, Long creationTime, boolean force);
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueue.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueue.java
index c5d10b8..b457b6f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueue.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueue.java
@@ -36,12 +36,12 @@
   private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private volatile EiffelEventParsingExecutor pool;
-  private final EiffelEventParser eventParser;
+  private final EiffelEventParserIf eventParser;
   private final ConcurrentHashMap<EventParsingWorker, ScheduledFuture<?>> pending =
       new ConcurrentHashMap<>();
 
   @Inject
-  public EiffelEventParsingQueue(EiffelEventParsingExecutor pool, EiffelEventParser eventParser) {
+  public EiffelEventParsingQueue(EiffelEventParsingExecutor pool, EiffelEventParserIf eventParser) {
     this.pool = pool;
     this.eventParser = eventParser;
   }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/EiffelEventsTestModule.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/EiffelEventsTestModule.java
index 3b839dc..579f3b6 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/EiffelEventsTestModule.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/EiffelEventsTestModule.java
@@ -25,6 +25,8 @@
 import com.googlesource.gerrit.plugins.eventseiffel.config.EventMappingConfig;
 import com.googlesource.gerrit.plugins.eventseiffel.eiffel.api.EventStorage;
 import com.googlesource.gerrit.plugins.eventseiffel.mapping.EiffelEventFactory;
+import com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParser;
+import com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParserIf;
 import com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParsingExecutor;
 import com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParsingQueue;
 import org.junit.Ignore;
@@ -42,7 +44,7 @@
     bind(EiffelEventParsingExecutor.class).to(EiffelEventParsingExecutor.Direct.class);
     bind(TestEventPublisher.class).in(Scopes.SINGLETON);
     bind(EiffelEventHub.Consumer.class).to(TestEventPublisher.class);
-
+    bind(EiffelEventParserIf.class).to(EiffelEventParser.class);
     bind(EiffelEventParsingQueue.class);
     bind(EiffelEventFactory.class).toProvider(TestEventFactoryProvider.class);
 
diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserIT.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserIT.java
index 0c6a3fd..d2d87eb 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserIT.java
@@ -342,7 +342,7 @@
       bind(EiffelEventHub.class).to(TestEventHub.class);
       bind(EventMappingConfig.class).toProvider(EventMappingConfig.Provider.class);
       bind(EiffelEventMapper.class);
-      bind(EiffelEventParser.class);
+      bind(EiffelEventParserIf.class).to(EiffelEventParser.class);
       bind(EiffelConfig.class).toProvider(EiffelConfig.Provider.class).in(Scopes.SINGLETON);
       bind(EiffelEventFactory.class)
           .toProvider(EiffelEventFactory.Provider.class)