Add unit-test for SubscriberMetrics Change-Id: I2bad9ca746a1e35699619332a97daf320a235365
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetricsTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetricsTest.java new file mode 100644 index 0000000..ead3189 --- /dev/null +++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetricsTest.java
@@ -0,0 +1,98 @@ +// Copyright (C) 2020 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.multisite.consumer; + +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.gerritforge.gerrit.eventbroker.EventMessage; +import com.google.common.base.Suppliers; +import com.google.gerrit.metrics.MetricMaker; +import com.google.gerrit.reviewdb.client.Project; +import com.google.gerrit.server.data.RefUpdateAttribute; +import com.google.gerrit.server.events.RefUpdatedEvent; +import com.google.gerrit.server.extensions.events.GitReferenceUpdated; +import com.googlesource.gerrit.plugins.multisite.ProjectVersionLogger; +import com.googlesource.gerrit.plugins.multisite.SharedRefDatabaseWrapper; +import com.googlesource.gerrit.plugins.multisite.validation.ProjectVersionRefUpdate; +import java.util.Optional; +import java.util.UUID; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class SubscriberMetricsTest { + private static final String A_TEST_PROJECT_NAME = "test-project"; + private static final Project.NameKey A_TEST_PROJECT_NAME_KEY = + Project.nameKey(A_TEST_PROJECT_NAME); + + @Mock private SharedRefDatabaseWrapper sharedRefDb; + @Mock private GitReferenceUpdated gitReferenceUpdated; + @Mock private MetricMaker metricMaker; + @Mock private ProjectVersionLogger verLogger; + @Mock private ProjectVersionRefUpdate projectVersionRefUpdate; + private SubscriberMetrics metrics; + private EventMessage.Header msgHeader; + + @Before + public void setup() throws Exception { + msgHeader = new EventMessage.Header(UUID.randomUUID(), UUID.randomUUID()); + metrics = new SubscriberMetrics(metricMaker, projectVersionRefUpdate, verLogger); + } + + @Test + public void shouldLogProjectVersionWhenReceivingRefUpdatedEventWithoutLag() { + Optional<Long> globalRefDbVersion = Optional.of(System.currentTimeMillis() / 1000); + when(projectVersionRefUpdate.getProjectRemoteVersion(A_TEST_PROJECT_NAME)) + .thenReturn(globalRefDbVersion); + when(projectVersionRefUpdate.getProjectLocalVersion(A_TEST_PROJECT_NAME)) + .thenReturn(globalRefDbVersion); + + EventMessage eventMessage = new EventMessage(msgHeader, newRefUpdateEvent()); + + metrics.updateReplicationStatusMetrics(eventMessage); + + verify(verLogger).log(A_TEST_PROJECT_NAME_KEY, globalRefDbVersion.get(), 0); + } + + @Test + public void shouldLogProjectVersionWhenReceivingRefUpdatedEventWithALag() { + Optional<Long> globalRefDbVersion = Optional.of(System.currentTimeMillis() / 1000); + long replicationLag = 60; + when(projectVersionRefUpdate.getProjectRemoteVersion(A_TEST_PROJECT_NAME)) + .thenReturn(globalRefDbVersion.map(ts -> ts + replicationLag)); + when(projectVersionRefUpdate.getProjectLocalVersion(A_TEST_PROJECT_NAME)) + .thenReturn(globalRefDbVersion); + + EventMessage eventMessage = new EventMessage(msgHeader, newRefUpdateEvent()); + + metrics.updateReplicationStatusMetrics(eventMessage); + + verify(verLogger).log(A_TEST_PROJECT_NAME_KEY, globalRefDbVersion.get(), replicationLag); + } + + private RefUpdatedEvent newRefUpdateEvent() { + RefUpdateAttribute refUpdate = new RefUpdateAttribute(); + refUpdate.project = A_TEST_PROJECT_NAME; + refUpdate.refName = "refs/heads/foo"; + refUpdate.newRev = "591727cfec5174368a7829f79741c41683d84c89"; + RefUpdatedEvent refUpdateEvent = new RefUpdatedEvent(); + refUpdateEvent.refUpdate = Suppliers.ofInstance(refUpdate); + return refUpdateEvent; + } +}