Merge branch 'stable-3.6' into stable-3.7

* stable-3.6:
  Log publishing of stream events in message_log file

Change-Id: Iea04107d8bfab4627650ec1bd30ba817461df582
diff --git a/src/main/java/com/googlesource/gerrit/plugins/pubsub/Log4jPubsubMessageLogger.java b/src/main/java/com/googlesource/gerrit/plugins/pubsub/Log4jPubsubMessageLogger.java
new file mode 100644
index 0000000..ac3f984
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/pubsub/Log4jPubsubMessageLogger.java
@@ -0,0 +1,38 @@
+// Copyright (C) 2023 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.pubsub;
+
+import com.google.gerrit.extensions.systemstatus.ServerInformation;
+import com.google.gerrit.server.util.PluginLogFile;
+import com.google.gerrit.server.util.SystemLog;
+import com.google.inject.Inject;
+import org.apache.log4j.PatternLayout;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Log4jPubsubMessageLogger extends PluginLogFile {
+  private static final String LOG_NAME = "message_log";
+  private final Logger msgLog;
+
+  @Inject
+  public Log4jPubsubMessageLogger(SystemLog systemLog, ServerInformation serverInfo) {
+    super(systemLog, serverInfo, LOG_NAME, new PatternLayout("[%d{ISO8601}] [%t] %-5p : %m%n"));
+    this.msgLog = LoggerFactory.getLogger(LOG_NAME);
+  }
+
+  public void log(String topic, String event) {
+    msgLog.info("PUBLISH {} {}", topic, event);
+  }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/pubsub/PubSubPublisher.java b/src/main/java/com/googlesource/gerrit/plugins/pubsub/PubSubPublisher.java
index 2a030c9..29d4342 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/pubsub/PubSubPublisher.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/pubsub/PubSubPublisher.java
@@ -46,6 +46,7 @@
   private final String topic;
   private final Publisher publisher;
   private final PubSubConfiguration pubSubProperties;
+  private final Log4jPubsubMessageLogger msgLog;
 
   @Inject
   public PubSubPublisher(
@@ -53,13 +54,15 @@
       PublisherProvider publisherProvider,
       @EventGson Gson gson,
       PubSubPublisherMetrics publisherMetrics,
-      @Assisted String topic)
+      @Assisted String topic,
+      Log4jPubsubMessageLogger msgLog)
       throws IOException {
     this.gson = gson;
     this.publisherMetrics = publisherMetrics;
     this.topic = topic;
     this.publisher = publisherProvider.get(topic);
     this.pubSubProperties = pubSubProperties;
+    this.msgLog = msgLog;
   }
 
   public ListenableFuture<Boolean> publish(Event event) {
@@ -92,6 +95,7 @@
                 messageId, topic, pubsubMessage.getData().toStringUtf8());
 
             publisherMetrics.incrementSucceedToPublishMessage();
+            msgLog.log(topic, pubsubMessage.getData().toStringUtf8());
           }
         },
         MoreExecutors.directExecutor());
diff --git a/src/test/java/com/googlesource/gerrit/plugins/pubsub/PubSubPublisherTest.java b/src/test/java/com/googlesource/gerrit/plugins/pubsub/PubSubPublisherTest.java
index d88f9d4..2c85652 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/pubsub/PubSubPublisherTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/pubsub/PubSubPublisherTest.java
@@ -39,6 +39,7 @@
   @Mock PublisherProvider publisherProviderMock;
   @Mock Publisher publisherMock;
   @Mock PubSubPublisherMetrics pubSubPublisherMetricsMock;
+  @Mock Log4jPubsubMessageLogger msgLog;
 
   private static final String TOPIC = "foo";
   private static final Event eventMessage = new ProjectCreatedEvent();
@@ -52,7 +53,8 @@
             publisherProviderMock,
             OutputFormat.JSON_COMPACT.newGson(),
             pubSubPublisherMetricsMock,
-            TOPIC);
+            TOPIC,
+            msgLog);
   }
 
   @Test
@@ -73,4 +75,18 @@
 
     verify(pubSubPublisherMetricsMock, only()).incrementSucceedToPublishMessage();
   }
+
+  @Test
+  public void shouldUpdateMessageLogFileWhenAsyncPublishSucceeds() {
+    when(publisherMock.publish(any())).thenReturn(ApiFutures.immediateFuture("some-message-id"));
+
+    objectUnderTest.publish(eventMessage);
+
+    verify(msgLog)
+        .log(
+            TOPIC,
+            String.format(
+                "{\"type\":\"%s\",\"event_created_on\":%d}",
+                eventMessage.type, eventMessage.eventCreatedOn));
+  }
 }