GEODE-8577: Re-enable PubSubNativeRedisAcceptanceTest (#5847)

- Could not reproduce after ~8000 runs
- Added some debugging to dump 'docker ps' output if a connection cannot
  be obtained.

Authored-by: Jens Deppe <jdeppe@vmware.com>
diff --git a/geode-redis/build.gradle b/geode-redis/build.gradle
index bd332e3..c35fd9b 100644
--- a/geode-redis/build.gradle
+++ b/geode-redis/build.gradle
@@ -54,6 +54,8 @@
   integrationTestImplementation('redis.clients:jedis')
   integrationTestImplementation('io.lettuce:lettuce-core')
   integrationTestImplementation('org.apache.logging.log4j:log4j-core')
+  // This only exists for debugging PubSubNativeRedisAcceptanceTest
+  integrationTestImplementation('org.buildobjects:jproc:2.3.0')
   integrationTestRuntime(project(':geode-log4j'))
 
   acceptanceTestImplementation(sourceSets.integrationTest.output)
@@ -70,6 +72,8 @@
   acceptanceTestImplementation('org.springframework.boot:spring-boot-starter-data-redis')
   acceptanceTestImplementation('org.springframework.session:spring-session-data-redis')
   acceptanceTestImplementation('org.apache.logging.log4j:log4j-core')
+  // This only exists for debugging PubSubNativeRedisAcceptanceTest
+  acceptanceTestImplementation('org.buildobjects:jproc:2.3.0')
 
   distributedTestCompile('org.apache.logging.log4j:log4j-core')
   distributedTestImplementation(project(':geode-dunit'))
diff --git a/geode-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/executor/pubsub/PubSubNativeRedisAcceptanceTest.java b/geode-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/executor/pubsub/PubSubNativeRedisAcceptanceTest.java
index 772ebb1..ce7778f 100644
--- a/geode-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/executor/pubsub/PubSubNativeRedisAcceptanceTest.java
+++ b/geode-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/executor/pubsub/PubSubNativeRedisAcceptanceTest.java
@@ -16,11 +16,9 @@
 package org.apache.geode.redis.internal.executor.pubsub;
 
 import org.junit.ClassRule;
-import org.junit.Ignore;
 
 import org.apache.geode.NativeRedisTestRule;
 
-@Ignore("GEODE-8577")
 public class PubSubNativeRedisAcceptanceTest extends AbstractPubSubIntegrationTest {
   @ClassRule
   public static NativeRedisTestRule redis = new NativeRedisTestRule();
diff --git a/geode-redis/src/commonTest/java/org/apache/geode/NativeRedisTestRule.java b/geode-redis/src/commonTest/java/org/apache/geode/NativeRedisTestRule.java
index 1cb47ed..5d0710d 100644
--- a/geode-redis/src/commonTest/java/org/apache/geode/NativeRedisTestRule.java
+++ b/geode-redis/src/commonTest/java/org/apache/geode/NativeRedisTestRule.java
@@ -17,16 +17,20 @@
 
 import java.io.Serializable;
 
+import org.apache.logging.log4j.Logger;
 import org.junit.rules.ExternalResource;
 import org.junit.rules.RuleChain;
 import org.junit.runner.Description;
 import org.junit.runners.model.Statement;
 import org.testcontainers.containers.GenericContainer;
 
+import org.apache.geode.logging.internal.log4j.api.LogService;
 import org.apache.geode.test.junit.rules.IgnoreOnWindowsRule;
 
 public class NativeRedisTestRule extends ExternalResource implements Serializable {
 
+  private static final Logger logger = LogService.getLogger();
+
   private GenericContainer<?> redisContainer;
   private final RuleChain delegate;
   private final int PORT_TO_EXPOSE = 6379;
@@ -57,6 +61,8 @@
                 .withExposedPorts(PORT_TO_EXPOSE);
 
         redisContainer.start();
+        logger.info("Started redis container with exposed port {} -> {}", PORT_TO_EXPOSE,
+            getPort());
         try {
           base.evaluate(); // This will run the test.
         } finally {
diff --git a/geode-redis/src/integrationTest/java/org/apache/geode/redis/internal/executor/pubsub/AbstractPubSubIntegrationTest.java b/geode-redis/src/integrationTest/java/org/apache/geode/redis/internal/executor/pubsub/AbstractPubSubIntegrationTest.java
index 6e5bf5e..9e3f323 100644
--- a/geode-redis/src/integrationTest/java/org/apache/geode/redis/internal/executor/pubsub/AbstractPubSubIntegrationTest.java
+++ b/geode-redis/src/integrationTest/java/org/apache/geode/redis/internal/executor/pubsub/AbstractPubSubIntegrationTest.java
@@ -17,6 +17,8 @@
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
@@ -32,6 +34,8 @@
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
+import org.buildobjects.process.ProcBuilder;
+import org.buildobjects.process.StreamConsumer;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.ClassRule;
@@ -733,10 +737,31 @@
       }
     }
 
+    runit("docker", "ps", "-a");
+
     throw new RuntimeException("Tried 10 times, but could not get a good connection.",
         lastException);
   }
 
+  // TODO: This exists for debugging some flakiness in this test. If this is fully resolved in the
+  // future, please delete this and the associated dependency in build.gradle
+  private void runit(String command, String... args) {
+    StreamConsumer consumer = stream -> {
+      InputStreamReader inputStreamReader = new InputStreamReader(stream);
+      BufferedReader bufReader = new BufferedReader(inputStreamReader);
+      String line;
+      while ((line = bufReader.readLine()) != null) {
+        System.err.println("::::: " + line);
+      }
+    };
+
+    new ProcBuilder(command)
+        .withArgs(args)
+        .withOutputConsumer(consumer)
+        .withTimeoutMillis(60000)
+        .run();
+  }
+
   int doPublishing(int index, int minimumIterations, AtomicBoolean running) {
     int iterationCount = 0;
     int publishedMessages = 0;