diff options
author | Jon Marius Venstad <venstad@gmail.com> | 2021-11-17 13:47:38 +0100 |
---|---|---|
committer | Jon Marius Venstad <venstad@gmail.com> | 2021-11-17 13:47:38 +0100 |
commit | 2e228e6836ac35522d517d4218f5e81c23362768 (patch) | |
tree | 8c4f179fa89d3bdb6d5deab5ba2b9e7e59f3c761 /vespa-osgi-testrunner | |
parent | 2839357dea3b20ea4a77c8f41eaca021de8d5fbe (diff) |
Make log available as it comes for JUnit runner
Diffstat (limited to 'vespa-osgi-testrunner')
5 files changed, 31 insertions, 12 deletions
diff --git a/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/JunitRunner.java b/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/JunitRunner.java index 5cc4d8336f2..4e287afa97a 100644 --- a/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/JunitRunner.java +++ b/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/JunitRunner.java @@ -27,9 +27,14 @@ import java.io.IOException; import java.net.URL; import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Optional; +import java.util.Queue; +import java.util.SortedMap; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.ConcurrentSkipListMap; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.logging.Level; @@ -44,6 +49,7 @@ import java.util.stream.Stream; public class JunitRunner extends AbstractComponent implements TestRunner { private static final Logger logger = Logger.getLogger(JunitRunner.class.getName()); + private final SortedMap<Long, LogRecord> logRecords = new ConcurrentSkipListMap<>(); private final BundleContext bundleContext; private final TestRuntimeProvider testRuntimeProvider; private volatile Future<TestReport> execution; @@ -90,6 +96,7 @@ public class JunitRunner extends AbstractComponent implements TestRunner { throw new IllegalStateException("Test execution already in progress"); } try { + logRecords.clear(); testRuntimeProvider.initialize(testConfig); Optional<Bundle> testBundle = findTestBundle(); if (testBundle.isEmpty()) { @@ -106,6 +113,11 @@ public class JunitRunner extends AbstractComponent implements TestRunner { } } + @Override + public Collection<LogRecord> getLog(long after) { + return logRecords.tailMap(after + 1).values(); + } + private static TestReport createReportWithFailedInitialization(Exception exception) { TestReport.Failure failure = new TestReport.Failure("init", exception); return new TestReport.Builder() @@ -175,8 +187,7 @@ public class JunitRunner extends AbstractComponent implements TestRunner { Launcher launcher = LauncherFactory.create(launcherConfig); // Create log listener: - var logLines = new ArrayList<LogRecord>(); - var logListener = VespaJunitLogListener.forBiConsumer((t, m) -> log(logLines, m.get(), t)); + var logListener = VespaJunitLogListener.forBiConsumer((t, m) -> log(logRecords, m.get(), t)); // Create a summary listener: var summaryListener = new SummaryGeneratingListener(); launcher.registerTestExecutionListeners(logListener, summaryListener); @@ -193,14 +204,14 @@ public class JunitRunner extends AbstractComponent implements TestRunner { .withIgnoredCount(report.getTestsSkippedCount()) .withFailedCount(report.getTestsFailedCount()) .withFailures(failures) - .withLogs(logLines) + .withLogs(logRecords.values()) .build(); } - private void log(List<LogRecord> logs, String message, Throwable t) { + private void log(SortedMap<Long, LogRecord> logs, String message, Throwable t) { LogRecord logRecord = new LogRecord(Level.INFO, message); Optional.ofNullable(t).ifPresent(logRecord::setThrown); - logs.add(logRecord); + logs.put(logRecord.getSequenceNumber(), logRecord); } @Override diff --git a/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/TestRunner.java b/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/TestRunner.java index 5ac6a87a89c..76a2be85d4d 100644 --- a/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/TestRunner.java +++ b/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/TestRunner.java @@ -4,6 +4,9 @@ package com.yahoo.vespa.testrunner; import ai.vespa.hosted.api.TestDescriptor; import com.yahoo.vespa.testrunner.legacy.LegacyTestRunner; +import java.util.Collection; +import java.util.logging.LogRecord; + /** * @author mortent */ @@ -11,6 +14,8 @@ public interface TestRunner { void executeTests(TestDescriptor.TestCategory category, byte[] testConfig); + Collection<LogRecord> getLog(long after); + boolean isSupported(); LegacyTestRunner.Status getStatus(); diff --git a/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/TestRunnerHandler.java b/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/TestRunnerHandler.java index 227b2fde44e..a0437f14c98 100644 --- a/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/TestRunnerHandler.java +++ b/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/TestRunnerHandler.java @@ -79,12 +79,7 @@ public class TestRunnerHandler extends LoggingRequestHandler { .map(Long::parseLong) .orElse(-1L); if (useOsgiMode) { - List<LogRecord> logRecords = Optional.ofNullable(junitRunner.getReport()) - .map(TestReport::logLines) - .orElse(Collections.emptyList()).stream() - .filter(record -> record.getSequenceNumber() > fetchRecordsAfter) - .collect(Collectors.toList()); - return new SlimeJsonResponse(logToSlime(logRecords)); + return new SlimeJsonResponse(logToSlime(junitRunner.getLog(fetchRecordsAfter))); } else { return new SlimeJsonResponse(logToSlime(testRunner.getLog(fetchRecordsAfter))); } diff --git a/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/legacy/LegacyTestRunner.java b/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/legacy/LegacyTestRunner.java index 33bfd4bd7c2..80122302d2c 100644 --- a/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/legacy/LegacyTestRunner.java +++ b/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/legacy/LegacyTestRunner.java @@ -15,7 +15,6 @@ public interface LegacyTestRunner { void test(TestProfile testProfile, byte[] config); - // TODO (mortent) : This seems to be duplicated in TesterCloud.Status and expects to have the same values enum Status { NOT_STARTED, RUNNING, FAILURE, ERROR, SUCCESS } diff --git a/vespa-osgi-testrunner/src/test/java/com/yahoo/vespa/testrunner/TestRunnerHandlerTest.java b/vespa-osgi-testrunner/src/test/java/com/yahoo/vespa/testrunner/TestRunnerHandlerTest.java index 70a67edb0b1..ff8adc70806 100644 --- a/vespa-osgi-testrunner/src/test/java/com/yahoo/vespa/testrunner/TestRunnerHandlerTest.java +++ b/vespa-osgi-testrunner/src/test/java/com/yahoo/vespa/testrunner/TestRunnerHandlerTest.java @@ -12,10 +12,12 @@ import org.junit.jupiter.api.Test; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.time.Instant; +import java.util.Collection; import java.util.List; import java.util.concurrent.Executors; import java.util.logging.Level; import java.util.logging.LogRecord; +import java.util.stream.Collectors; import static com.yahoo.jdisc.http.HttpRequest.Method.GET; import static java.nio.charset.StandardCharsets.UTF_8; @@ -141,6 +143,13 @@ public class TestRunnerHandlerTest { } @Override + public Collection<LogRecord> getLog(long after) { + return getReport().logLines().stream() + .filter(entry -> entry.getSequenceNumber() > after) + .collect(Collectors.toList()); + } + + @Override public boolean isSupported() { return true; } |