diff options
author | Jon Marius Venstad <venstad@gmail.com> | 2021-12-03 10:07:05 +0100 |
---|---|---|
committer | Jon Marius Venstad <venstad@gmail.com> | 2021-12-03 10:07:05 +0100 |
commit | 68847a31fd792ce7c1df90d4552980d8fd43253f (patch) | |
tree | 745d9cf9a5d7c4eca1058ba562f4e936801615cd | |
parent | 7cc3980cf2b38da62f06444e2785cc752eacf75c (diff) |
Move ANSI to HTML to separate class, and simplify
7 files changed, 77 insertions, 48 deletions
diff --git a/vespa-osgi-testrunner/pom.xml b/vespa-osgi-testrunner/pom.xml index 045ac050e4b..de1b5b4024b 100644 --- a/vespa-osgi-testrunner/pom.xml +++ b/vespa-osgi-testrunner/pom.xml @@ -58,6 +58,12 @@ <scope>compile</scope> </dependency> <dependency> + <groupId>org.fusesource.jansi</groupId> + <artifactId>jansi</artifactId> + <version>1.18</version> + <scope>compile</scope> + </dependency> + <dependency> <groupId>com.yahoo.vespa</groupId> <artifactId>config-provisioning</artifactId> <version>${project.version}</version> diff --git a/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/HtmlLogger.java b/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/HtmlLogger.java new file mode 100644 index 00000000000..7a05cbf74fd --- /dev/null +++ b/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/HtmlLogger.java @@ -0,0 +1,35 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.testrunner; + +import org.fusesource.jansi.HtmlAnsiOutputStream; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.util.logging.Level; +import java.util.logging.LogRecord; + +import static java.nio.charset.StandardCharsets.UTF_8; + +/** + * Converts ANSI output to HTML-safe log records + * + * @author jonmv + */ +public class HtmlLogger { + + public static final Level HTML = new Level("html", 1) { }; + + private final ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + private final PrintStream formatter = new PrintStream(new HtmlAnsiOutputStream(buffer)); + + public LogRecord toLog(String line) { + if (line.length() > 1 << 13) + line = line.substring(0, 1 << 13) + " ... (this log entry was truncated due to size)"; + + buffer.reset(); + formatter.print(line); + formatter.flush(); + return new LogRecord(HTML, buffer.toString(UTF_8)); //.replaceAll(" ", " ")); + } + +} diff --git a/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/VespaCliTestRunner.java b/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/VespaCliTestRunner.java index 6405904cd91..f131292597c 100644 --- a/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/VespaCliTestRunner.java +++ b/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/VespaCliTestRunner.java @@ -84,13 +84,10 @@ public class VespaCliTestRunner implements TestRunner { try { TestConfig testConfig = TestConfig.fromJson(config); process = testRunProcessBuilder(suite, testConfig).start(); - BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); - in.lines().forEach(line -> { - if (line.length() > 1 << 13) - line = line.substring(0, 1 << 13) + " ... (this log entry was truncated due to size)"; - log(Level.INFO, line, null); - }); + HtmlLogger htmlLogger = new HtmlLogger(); + BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); + in.lines().forEach(line -> log(htmlLogger.toLog(line))); status.set(process.waitFor() == 0 ? SUCCESS : process.waitFor() == 3 ? FAILURE : ERROR); } catch (Exception e) { @@ -139,6 +136,10 @@ public class VespaCliTestRunner implements TestRunner { private void log(Level level, String message, Throwable thrown) { LogRecord record = new LogRecord(level, message); record.setThrown(thrown); + log(record); + } + + private void log(LogRecord record) { logger.log(record); log.put(record.getSequenceNumber(), record); } diff --git a/vespa-osgi-testrunner/src/test/java/com/yahoo/vespa/testrunner/HtmlLoggerTest.java b/vespa-osgi-testrunner/src/test/java/com/yahoo/vespa/testrunner/HtmlLoggerTest.java new file mode 100644 index 00000000000..c230bac9dce --- /dev/null +++ b/vespa-osgi-testrunner/src/test/java/com/yahoo/vespa/testrunner/HtmlLoggerTest.java @@ -0,0 +1,24 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.testrunner; + +import org.fusesource.jansi.Ansi; +import org.junit.jupiter.api.Test; + +import java.util.logging.LogRecord; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * @author jonmv + */ +class HtmlLoggerTest { + + @Test + void testConversionToHtml() { + LogRecord html = new HtmlLogger().toLog(Ansi.ansi().fg(Ansi.Color.RED).a("</body>Hello!").reset().toString()); + assertEquals("html", html.getLevel().getName()); + assertEquals("<span style=\"color: red;\"></body>Hello!</span>", + html.getMessage()); + } + +} diff --git a/vespa-testrunner-components/pom.xml b/vespa-testrunner-components/pom.xml index 2f563748836..4b4b0cfa92c 100644 --- a/vespa-testrunner-components/pom.xml +++ b/vespa-testrunner-components/pom.xml @@ -42,12 +42,6 @@ </dependency> <dependency> - <groupId>org.fusesource.jansi</groupId> - <artifactId>jansi</artifactId> - <version>1.18</version> - </dependency> - - <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> diff --git a/vespa-testrunner-components/src/main/java/com/yahoo/vespa/hosted/testrunner/TestRunner.java b/vespa-testrunner-components/src/main/java/com/yahoo/vespa/hosted/testrunner/TestRunner.java index 83cfd0030a0..69296c23fa0 100644 --- a/vespa-testrunner-components/src/main/java/com/yahoo/vespa/hosted/testrunner/TestRunner.java +++ b/vespa-testrunner-components/src/main/java/com/yahoo/vespa/hosted/testrunner/TestRunner.java @@ -3,15 +3,11 @@ package com.yahoo.vespa.hosted.testrunner; import com.google.inject.Inject; import com.yahoo.vespa.defaults.Defaults; -import org.fusesource.jansi.AnsiOutputStream; -import org.fusesource.jansi.HtmlAnsiOutputStream; +import com.yahoo.vespa.testrunner.HtmlLogger; -import java.io.BufferedOutputStream; import java.io.BufferedReader; -import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStreamReader; -import java.io.PrintStream; import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; @@ -29,7 +25,6 @@ import java.util.logging.Logger; import java.util.stream.Collectors; import java.util.stream.Stream; -import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.logging.Level.SEVERE; /** @@ -39,7 +34,6 @@ import static java.util.logging.Level.SEVERE; public class TestRunner implements com.yahoo.vespa.testrunner.TestRunner { private static final Logger logger = Logger.getLogger(TestRunner.class.getName()); - private static final Level HTML = new Level("html", 1) { }; private static final Path vespaHome = Paths.get(Defaults.getDefaults().vespaHome()); private static final String settingsXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<settings xmlns=\"http://maven.apache.org/SETTINGS/1.0.0\"\n" + @@ -150,26 +144,17 @@ public class TestRunner implements com.yahoo.vespa.testrunner.TestRunner { } boolean success; - try (ByteArrayOutputStream logBuffer = new ByteArrayOutputStream(); - PrintStream logPlainFormatter = new PrintStream(new AnsiOutputStream(logBuffer)); - PrintStream logFormatter = new PrintStream(new HtmlAnsiOutputStream(logBuffer))){ + try { writeTestApplicationPom(testProfile); Files.write(configFile, testConfig); Files.write(settingsFile, settingsXml.getBytes()); Process mavenProcess = builder.start(); BufferedReader in = new BufferedReader(new InputStreamReader(mavenProcess.getInputStream())); + HtmlLogger htmlLogger = new HtmlLogger(); in.lines().forEach(line -> { - logFormatter.print(line); - String message = logBuffer.toString(UTF_8); - if (message.length() > 1 << 13) { - logBuffer.reset(); - logPlainFormatter.print(line); // Avoid HTML since we don't know what we'll strip here. - message = logBuffer.toString(UTF_8).substring(0, 1 << 13) + " ... (this log entry was truncated due to size)"; - } - LogRecord record = new LogRecord(HTML, message); - log.put(record.getSequenceNumber(), record); - logBuffer.reset(); + LogRecord html = htmlLogger.toLog(line); + log.put(html.getSequenceNumber(), html); }); success = mavenProcess.waitFor() == 0; } diff --git a/vespa-testrunner-components/src/test/java/com/yahoo/vespa/hosted/testrunner/TestRunnerTest.java b/vespa-testrunner-components/src/test/java/com/yahoo/vespa/hosted/testrunner/TestRunnerTest.java index 752ca6103d1..2b2c30790c9 100644 --- a/vespa-testrunner-components/src/test/java/com/yahoo/vespa/hosted/testrunner/TestRunnerTest.java +++ b/vespa-testrunner-components/src/test/java/com/yahoo/vespa/hosted/testrunner/TestRunnerTest.java @@ -44,22 +44,6 @@ public class TestRunnerTest { } @Test - public void ansiCodesAreConvertedToHtml() throws InterruptedException { - TestRunner runner = new TestRunner(artifactsPath, testPath, configFile, settingsFile, - __ -> new ProcessBuilder("echo", Ansi.ansi().fg(Ansi.Color.RED).a("Hello!").reset().toString())); - runner.test(SYSTEM_TEST, new byte[0]); - while (runner.getStatus() == TestRunner.Status.RUNNING) { - Thread.sleep(10); - } - Iterator<LogRecord> log = runner.getLog(-1).iterator(); - log.next(); - LogRecord record = log.next(); - assertEquals("<span style=\"color: red;\">Hello!</span>", record.getMessage()); - assertEquals(0, runner.getLog(record.getSequenceNumber()).size()); - assertEquals(TestRunner.Status.SUCCESS, runner.getStatus()); - } - - @Test public void noTestJarIsAFailure() throws InterruptedException, IOException { Files.delete(artifactsPath.resolve("my-tests.jar")); TestRunner runner = new TestRunner(artifactsPath, testPath, configFile, settingsFile, |