This is an automated email from the ASF dual-hosted git repository.

dcapwell pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git


The following commit(s) were added to refs/heads/trunk by this push:
     new bf6a82ec82 
SSTableLoaderEncryptionOptionsTest#bulkLoaderSuccessfullyStreamsOverSslWithDeprecatedSslStoragePort
 failing on missing stdout content
bf6a82ec82 is described below

commit bf6a82ec82277ac9f20117cce8635be83ea56010
Author: David Capwell <dcapw...@apache.org>
AuthorDate: Tue Aug 26 17:04:22 2025 -0700

    
SSTableLoaderEncryptionOptionsTest#bulkLoaderSuccessfullyStreamsOverSslWithDeprecatedSslStoragePort
 failing on missing stdout content
    
    patch by David Capwell; reviewed by Caleb Rackliffe for CASSANDRA-20698
---
 .../test/SSTableLoaderEncryptionOptionsTest.java   |  2 +-
 .../org/apache/cassandra/tools/ToolRunner.java     | 58 ++++++++++++++++++++--
 2 files changed, 55 insertions(+), 5 deletions(-)

diff --git 
a/test/distributed/org/apache/cassandra/distributed/test/SSTableLoaderEncryptionOptionsTest.java
 
b/test/distributed/org/apache/cassandra/distributed/test/SSTableLoaderEncryptionOptionsTest.java
index ea3c980586..305788f30b 100644
--- 
a/test/distributed/org/apache/cassandra/distributed/test/SSTableLoaderEncryptionOptionsTest.java
+++ 
b/test/distributed/org/apache/cassandra/distributed/test/SSTableLoaderEncryptionOptionsTest.java
@@ -109,7 +109,7 @@ public class SSTableLoaderEncryptionOptionsTest extends 
AbstractEncryptionOption
     public void 
bulkLoaderSuccessfullyStreamsOverSslWithDeprecatedSslStoragePort() throws 
Throwable
     {
         File sstables_to_upload = prepareSstablesForUpload();
-        ToolRunner.ToolResult tool = ToolRunner.invokeClass(BulkLoader.class,
+        ToolRunner.ToolResult tool = ToolRunner.invokeClass(BulkLoader.class, 
true,
                                                             "--nodes", NODES,
                                                             "--port", 
Integer.toString(NATIVE_PORT),
                                                             "--storage-port", 
Integer.toString(STORAGE_PORT),
diff --git a/test/unit/org/apache/cassandra/tools/ToolRunner.java 
b/test/unit/org/apache/cassandra/tools/ToolRunner.java
index cb2e5b06bd..3d4d4588fd 100644
--- a/test/unit/org/apache/cassandra/tools/ToolRunner.java
+++ b/test/unit/org/apache/cassandra/tools/ToolRunner.java
@@ -43,6 +43,10 @@ import com.google.common.base.Throwables;
 import com.google.common.collect.ImmutableList;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.core.OutputStreamAppender;
+import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
+import ch.qos.logback.classic.spi.ILoggingEvent;
 
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.distributed.api.IInstance;
@@ -271,15 +275,25 @@ public class ToolRunner
 
     public static ToolResult invokeClass(String klass,  String... args)
     {
-        return invokeClass(klass, null, args);
+        return invokeClass(klass, null, false, args);
     }
 
     public static ToolResult invokeClass(Class<?> klass,  String... args)
     {
-        return invokeClass(klass.getName(), null, args);
+        return invokeClass(klass.getName(), null, false, args);
+    }
+
+    public static ToolResult invokeClass(Class<?> klass, boolean 
captureLogging, String... args)
+    {
+        return invokeClass(klass.getName(), null, captureLogging, args);
     }
 
     public static ToolResult invokeClass(String klass, InputStream stdin, 
String... args)
+    {
+        return invokeClass(klass, stdin, false, args);
+    }
+
+    public static ToolResult invokeClass(String klass, InputStream stdin, 
boolean captureLogging, String... args)
     {
         List<String> allArgs = new ArrayList<>();
         allArgs.add(klass);
@@ -294,13 +308,12 @@ public class ToolRunner
             }
         };
 
-        Pair<Integer, ToolResult> res = invokeSupplier(runMe, stdin);
+        Pair<Integer, ToolResult> res = invokeSupplier(runMe, stdin, 
captureLogging);
         return new ToolResult(allArgs,
                               res.right.getExitCode() == -1 ? -1 : res.left,
                               res.right.getStdout(),
                               res.right.getStderr(),
                               res.right.getException());
-
     }
 
     public static ToolResult invokeNodetoolJvmDtestIsolated(IInstance node, 
String... args)
@@ -399,6 +412,11 @@ public class ToolRunner
     }
 
     public static <T> Pair<T, ToolResult> invokeSupplier(Supplier<T> runMe, 
InputStream stdin)
+    {
+        return invokeSupplier(runMe, stdin, false);
+    }
+
+    public static <T> Pair<T, ToolResult> invokeSupplier(Supplier<T> runMe, 
InputStream stdin, boolean captureLogging)
     {
         PrintStream originalSysOut = System.out;
         PrintStream originalSysErr = System.err;
@@ -410,6 +428,10 @@ public class ToolRunner
 
         System.setIn(stdin == null ? originalSysIn : stdin);
 
+        Runnable loggerCleanup = null;
+        if (captureLogging)
+            loggerCleanup = registerLoggerAppender(out);
+
         T res = null;
         try(PrintStream newOut = new PrintStream(out); PrintStream newErr = 
new PrintStream(err))
         {
@@ -434,9 +456,37 @@ public class ToolRunner
             System.setOut(originalSysOut);
             System.setErr(originalSysErr);
             System.setIn(originalSysIn);
+
+            if (captureLogging)
+                loggerCleanup.run();
         }
     }
 
+    private static Runnable registerLoggerAppender(ByteArrayOutputStream out)
+    {
+        LoggerContext context = (LoggerContext) 
LoggerFactory.getILoggerFactory();
+        ch.qos.logback.classic.Logger rootLogger = 
context.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME);
+
+        OutputStreamAppender<ILoggingEvent> logAppender = new 
OutputStreamAppender<>();
+        logAppender.setContext(context);
+        logAppender.setName("ToolRunnerCapture");
+
+        PatternLayoutEncoder encoder = new PatternLayoutEncoder();
+        encoder.setContext(context);
+        encoder.setPattern("%msg%n");
+        encoder.start();
+
+        logAppender.setEncoder(encoder);
+        logAppender.setOutputStream(out);
+        logAppender.start();
+
+        rootLogger.addAppender(logAppender);
+        return () -> {
+            rootLogger.detachAppender(logAppender);
+            logAppender.stop();
+        };
+    }
+
     public static Builder builder(List<String> args)
     {
         return new Builder(args);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org
For additional commands, e-mail: commits-h...@cassandra.apache.org

Reply via email to