diff options
author | Jon Marius Venstad <venstad@gmail.com> | 2021-11-17 14:13:01 +0100 |
---|---|---|
committer | Jon Marius Venstad <venstad@gmail.com> | 2021-11-17 14:13:01 +0100 |
commit | 9474bc887920ed2a080548d416da4751c065f789 (patch) | |
tree | effdee02dbcdb850bf6478c347a4b062ff2da5f3 /vespa-osgi-testrunner | |
parent | bcd400f728dd80ad4d1100efc67b0a86d6b40360 (diff) |
Unify test runner interfaces and simplify
Diffstat (limited to 'vespa-osgi-testrunner')
5 files changed, 54 insertions, 101 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 4e287afa97a..d1acc4faf0f 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 @@ -11,7 +11,6 @@ import com.yahoo.component.AbstractComponent; import com.yahoo.io.IOUtils; import com.yahoo.jdisc.application.OsgiFramework; import com.yahoo.vespa.defaults.Defaults; -import com.yahoo.vespa.testrunner.legacy.LegacyTestRunner; import org.junit.jupiter.engine.JupiterTestEngine; import org.junit.platform.engine.discovery.DiscoverySelectors; import org.junit.platform.launcher.Launcher; @@ -26,14 +25,11 @@ import org.osgi.framework.BundleContext; 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; @@ -90,8 +86,18 @@ public class JunitRunner extends AbstractComponent implements TestRunner { credentialsRoot.ifPresent(root -> System.setProperty("vespa.test.credentials.root", root)); } + private static TestDescriptor.TestCategory toCategory(TestRunner.Suite testProfile) { + switch(testProfile) { + case SYSTEM_TEST: return TestDescriptor.TestCategory.systemtest; + case STAGING_SETUP_TEST: return TestDescriptor.TestCategory.stagingsetuptest; + case STAGING_TEST: return TestDescriptor.TestCategory.stagingtest; + case PRODUCTION_TEST: return TestDescriptor.TestCategory.productiontest; + default: throw new RuntimeException("Unknown test profile: " + testProfile.name()); + } + } + @Override - public void executeTests(TestDescriptor.TestCategory category, byte[] testConfig) { + public void test(TestRunner.Suite suite, byte[] testConfig) { if (execution != null && ! execution.isDone()) { throw new IllegalStateException("Test execution already in progress"); } @@ -107,7 +113,7 @@ public class JunitRunner extends AbstractComponent implements TestRunner { if (testDescriptor.isEmpty()) { throw new RuntimeException("Could not find test descriptor"); } - execution = CompletableFuture.supplyAsync(() -> launchJunit(loadClasses(testBundle.get(), testDescriptor.get(), category))); + execution = CompletableFuture.supplyAsync(() -> launchJunit(loadClasses(testBundle.get(), testDescriptor.get(), toCategory(suite)))); } catch (Exception e) { execution = CompletableFuture.completedFuture(createReportWithFailedInitialization(e)); } @@ -220,20 +226,20 @@ public class JunitRunner extends AbstractComponent implements TestRunner { } @Override - public LegacyTestRunner.Status getStatus() { - if (execution == null) return LegacyTestRunner.Status.NOT_STARTED; - if (!execution.isDone()) return LegacyTestRunner.Status.RUNNING; + public TestRunner.Status getStatus() { + if (execution == null) return TestRunner.Status.NOT_STARTED; + if (!execution.isDone()) return TestRunner.Status.RUNNING; try { TestReport report = execution.get(); if (report.isSuccess()) { - return LegacyTestRunner.Status.SUCCESS; + return TestRunner.Status.SUCCESS; } else { - return LegacyTestRunner.Status.FAILURE; + return TestRunner.Status.FAILURE; } } catch (InterruptedException|ExecutionException e) { logger.log(Level.WARNING, "Error while getting test report", e); // Return FAILURE to enforce getting the test report from the caller. - return LegacyTestRunner.Status.FAILURE; + return TestRunner.Status.FAILURE; } } 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 76a2be85d4d..db489f5aa3d 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 @@ -1,25 +1,31 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. 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 jonmv * @author mortent */ public interface TestRunner { - void executeTests(TestDescriptor.TestCategory category, byte[] testConfig); - Collection<LogRecord> getLog(long after); - boolean isSupported(); + Status getStatus(); + + void test(Suite suite, byte[] config); + + default boolean isSupported() { return true; } + + default TestReport getReport() { return null; } - LegacyTestRunner.Status getStatus(); + enum Status { + NOT_STARTED, RUNNING, FAILURE, ERROR, SUCCESS + } - TestReport getReport(); + enum Suite { + SYSTEM_TEST, STAGING_SETUP_TEST, STAGING_TEST, PRODUCTION_TEST + } }
\ No newline at end of file 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 5c7bb1ccbd3..f3104ee2e0c 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 @@ -1,7 +1,6 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.testrunner; -import ai.vespa.hosted.api.TestDescriptor; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.inject.Inject; @@ -13,7 +12,6 @@ import com.yahoo.exception.ExceptionUtils; import com.yahoo.slime.Cursor; import com.yahoo.slime.JsonFormat; import com.yahoo.slime.Slime; -import com.yahoo.vespa.testrunner.legacy.LegacyTestRunner; import com.yahoo.yolean.Exceptions; import java.io.ByteArrayOutputStream; @@ -37,16 +35,12 @@ public class TestRunnerHandler extends LoggingRequestHandler { private static final String CONTENT_TYPE_APPLICATION_JSON = "application/json"; - private final TestRunner junitRunner; - private final LegacyTestRunner testRunner; - private final boolean useOsgiMode; + private final TestRunner testRunner; @Inject - public TestRunnerHandler(Executor executor, TestRunner junitRunner, LegacyTestRunner testRunner) { + public TestRunnerHandler(Executor executor, TestRunner junitRunner, TestRunner testRunner) { super(executor); - this.junitRunner = junitRunner; - this.testRunner = testRunner; - this.useOsgiMode = junitRunner.isSupported(); + this.testRunner = junitRunner.isSupported() ? junitRunner : testRunner; } @Override @@ -72,25 +66,16 @@ public class TestRunnerHandler extends LoggingRequestHandler { long fetchRecordsAfter = Optional.ofNullable(request.getProperty("after")) .map(Long::parseLong) .orElse(-1L); - if (useOsgiMode) { - return new SlimeJsonResponse(logToSlime(junitRunner.getLog(fetchRecordsAfter))); - } else { - return new SlimeJsonResponse(logToSlime(testRunner.getLog(fetchRecordsAfter))); - } + return new SlimeJsonResponse(logToSlime(testRunner.getLog(fetchRecordsAfter))); } else if (path.equals("/tester/v1/status")) { - if (useOsgiMode) { - log.info("Responding with status " + junitRunner.getStatus()); - return new Response(junitRunner.getStatus().name()); - } else { - log.info("Responding with status " + testRunner.getStatus()); - return new Response(testRunner.getStatus().name()); - } + log.info("Responding with status " + testRunner.getStatus()); + return new Response(testRunner.getStatus().name()); } else if (path.equals("/tester/v1/report")) { - if (useOsgiMode) { - return new SlimeJsonResponse(toSlime(junitRunner.getReport())); - } else { + TestReport report = testRunner.getReport(); + if (report == null) return new EmptyResponse(200); - } + + return new SlimeJsonResponse(toSlime(report)); } return new Response(Status.NOT_FOUND, "Not found: " + request.getUri().getPath()); } @@ -99,31 +84,15 @@ public class TestRunnerHandler extends LoggingRequestHandler { final String path = request.getUri().getPath(); if (path.startsWith("/tester/v1/run/")) { String type = lastElement(path); - LegacyTestRunner.Suite testSuite = LegacyTestRunner.Suite.valueOf(type.toUpperCase() + "_TEST"); + TestRunner.Suite testSuite = TestRunner.Suite.valueOf(type.toUpperCase() + "_TEST"); byte[] config = request.getData().readAllBytes(); - if (useOsgiMode) { - junitRunner.executeTests(categoryFromProfile(testSuite), config); - log.info("Started tests of type " + type + " and status is " + junitRunner.getStatus()); - return new Response("Successfully started " + type + " tests"); - } else { - testRunner.test(testSuite, config); - log.info("Started tests of type " + type + " and status is " + testRunner.getStatus()); - return new Response("Successfully started " + type + " tests"); - } + testRunner.test(testSuite, config); + log.info("Started tests of type " + type + " and status is " + testRunner.getStatus()); + return new Response("Successfully started " + type + " tests"); } return new Response(Status.NOT_FOUND, "Not found: " + request.getUri().getPath()); } - TestDescriptor.TestCategory categoryFromProfile(LegacyTestRunner.Suite testProfile) { - switch(testProfile) { - case SYSTEM_TEST: return TestDescriptor.TestCategory.systemtest; - case STAGING_SETUP_TEST: return TestDescriptor.TestCategory.stagingsetuptest; - case STAGING_TEST: return TestDescriptor.TestCategory.stagingtest; - case PRODUCTION_TEST: return TestDescriptor.TestCategory.productiontest; - default: throw new RuntimeException("Unknown test profile: " + testProfile.name()); - } - } - private static String lastElement(String path) { if (path.endsWith("/")) path = path.substring(0, path.length() - 1); 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 deleted file mode 100644 index fc25f7de6e5..00000000000 --- a/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/legacy/LegacyTestRunner.java +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.testrunner.legacy; - -import java.util.Collection; -import java.util.logging.LogRecord; - -/** - * @author mortent - */ -public interface LegacyTestRunner { - - Collection<LogRecord> getLog(long after); - - Status getStatus(); - - void test(Suite suite, byte[] config); - - enum Status { - NOT_STARTED, RUNNING, FAILURE, ERROR, SUCCESS - } - - enum Suite { - SYSTEM_TEST, STAGING_SETUP_TEST, STAGING_TEST, PRODUCTION_TEST - } - -}
\ No newline at end of file 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 ff8adc70806..a78dc077446 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 @@ -1,11 +1,9 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.testrunner; -import ai.vespa.hosted.api.TestDescriptor; import com.yahoo.container.jdisc.HttpRequest; import com.yahoo.container.jdisc.HttpResponse; import com.yahoo.test.json.JsonTestHelper; -import com.yahoo.vespa.testrunner.legacy.LegacyTestRunner; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -50,7 +48,7 @@ public class TestRunnerHandlerTest { testRunnerHandler = new TestRunnerHandler( Executors.newSingleThreadExecutor(), - new MockJunitRunner(LegacyTestRunner.Status.SUCCESS, testReport), + new MockJunitRunner(TestRunner.Status.SUCCESS, testReport), null); } @@ -98,7 +96,7 @@ public class TestRunnerHandlerTest { HttpResponse response = testRunnerHandler.handle(HttpRequest.createTestRequest("http://localhost:1234/tester/v1/report", GET)); ByteArrayOutputStream out = new ByteArrayOutputStream(); response.render(out); - assertEquals("{}", out.toString(UTF_8)); + assertEquals("", out.toString(UTF_8)); } } @@ -106,7 +104,7 @@ public class TestRunnerHandlerTest { public void usesLegacyTestRunnerWhenNotSupported() throws IOException { TestRunner testRunner = mock(TestRunner.class); when(testRunner.isSupported()).thenReturn(false); - LegacyTestRunner legacyTestRunner = mock(LegacyTestRunner.class); + TestRunner legacyTestRunner = mock(TestRunner.class); when(legacyTestRunner.getLog(anyLong())).thenReturn(List.of(logRecord("Legacy log message"))); testRunnerHandler = new TestRunnerHandler( @@ -129,18 +127,17 @@ public class TestRunnerHandlerTest { private static class MockJunitRunner implements TestRunner { - private final LegacyTestRunner.Status status; + private final TestRunner.Status status; private final TestReport testReport; - public MockJunitRunner(LegacyTestRunner.Status status, TestReport testReport) { + public MockJunitRunner(TestRunner.Status status, TestReport testReport) { this.status = status; this.testReport = testReport; } @Override - public void executeTests(TestDescriptor.TestCategory category, byte[] testConfig) { - } + public void test(Suite suite, byte[] testConfig) { } @Override public Collection<LogRecord> getLog(long after) { @@ -155,7 +152,7 @@ public class TestRunnerHandlerTest { } @Override - public LegacyTestRunner.Status getStatus() { + public TestRunner.Status getStatus() { return status; } @@ -165,4 +162,5 @@ public class TestRunnerHandlerTest { } } + } |