From 0fb2029c6cb8b0e65c923f295b8b71edcc39ee6e Mon Sep 17 00:00:00 2001 From: Vasili Gulevich Date: Tue, 2 Apr 2024 09:30:47 +0400 Subject: [PATCH 1/2] Fail Runner if AUT can't be restarted. Also fixed resource formal resource leaks. --- .../eclipse/rcptt/runner/HeadlessRunner.java | 8 ++++-- .../rcptt/runner/util/TestsRunner.java | 28 +++++++++++-------- .../streams/SherlockReportOutputStream.java | 3 +- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/runner/org.eclipse.rcptt.runner/src/org/eclipse/rcptt/runner/HeadlessRunner.java b/runner/org.eclipse.rcptt.runner/src/org/eclipse/rcptt/runner/HeadlessRunner.java index c1a0d8250..aef8cb987 100644 --- a/runner/org.eclipse.rcptt.runner/src/org/eclipse/rcptt/runner/HeadlessRunner.java +++ b/runner/org.eclipse.rcptt.runner/src/org/eclipse/rcptt/runner/HeadlessRunner.java @@ -59,9 +59,11 @@ public int performCoolThings() throws Exception { TestsRunner testsRunner = new TestsRunner(conf, this, new ResultsHandler(conf, runnerOptions.isRestartAUTOnFailures())); - Q7ReportIterator reportIterator = testsRunner.findAndRunTests(); - - reporter.report(reportIterator, this, conf); + try(Q7ReportIterator reportIterator = testsRunner.findAndRunTests()) { + reporter.report(reportIterator, this, conf); + } + testsRunner.throwOnError(); + return testsRunner.getFailedCount(); } diff --git a/runner/org.eclipse.rcptt.runner/src/org/eclipse/rcptt/runner/util/TestsRunner.java b/runner/org.eclipse.rcptt.runner/src/org/eclipse/rcptt/runner/util/TestsRunner.java index f79352351..669b1606f 100644 --- a/runner/org.eclipse.rcptt.runner/src/org/eclipse/rcptt/runner/util/TestsRunner.java +++ b/runner/org.eclipse.rcptt.runner/src/org/eclipse/rcptt/runner/util/TestsRunner.java @@ -22,6 +22,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.concurrent.atomic.AtomicReference; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspace; @@ -68,6 +69,7 @@ public class TestsRunner { private final ResultsHandler resultsHandler; private final AUTsManager auts; private int failedCount = 0; + private AtomicReference error = new AtomicReference<>(null); public int getFailedCount() { return failedCount; @@ -257,21 +259,13 @@ private Q7ReportIterator runTests(final TestSuite[] tests) throws DebugException Assert.isTrue(auts.isClean(), "AUTs manages should not have been used before"); List runnables = Collections.synchronizedList(new ArrayList()); failedCount = 0; - final SherlockReportOutputStream reportWriter; File reportFile = new File(conf.getQ7ReportLocation()); createFolderForFile(reportFile); - try { - reportWriter = new SherlockReportOutputStream( - new BufferedOutputStream(new FileOutputStream(reportFile))); - } catch (FileNotFoundException e1) { - System.out.println("Failed to create report file:" + conf.getQ7ReportLocation()); - HeadlessRunnerPlugin.getDefault().info("Failed to create report file:" + conf.getQ7ReportLocation()); - throw new RuntimeException(e1); - } Set failed = new HashSet(); - try { + try (SherlockReportOutputStream reportWriter = new SherlockReportOutputStream( + new BufferedOutputStream(new FileOutputStream(reportFile)))) { int count = 0; for (final TestSuite suite : tests) { suite.setLimit(conf.limit); @@ -353,6 +347,7 @@ private Q7ReportIterator runTests(final TestSuite[] tests) throws DebugException } } if (!alive) { + error.compareAndSet(null, new AutLaunchFail("AUT is not available", null)); // No alive threads -> finish skipRemaining(runnables, "AUT is not available"); break; @@ -367,6 +362,10 @@ private Q7ReportIterator runTests(final TestSuite[] tests) throws DebugException System.out.println(scenario); } } + } catch (FileNotFoundException e1) { + System.out.println("Failed to create report file:" + conf.getQ7ReportLocation()); + HeadlessRunnerPlugin.getDefault().info("Failed to create report file:" + conf.getQ7ReportLocation()); + throw new RuntimeException(e1); } catch (InterruptedException e) { HeadlessRunnerPlugin.getDefault().info("Execution interrupted"); } @@ -383,8 +382,6 @@ private Q7ReportIterator runTests(final TestSuite[] tests) throws DebugException } auts.removeShutdownHook(); failedCount = failed.size(); - if (reportWriter != null) - reportWriter.close(); TestEngineManager.getInstance().fireTestRunCompleted(); } @@ -436,4 +433,11 @@ private void createFolderForFile(File reportFile) { } } + public void throwOnError() throws Exception { + Exception result = error.get(); + if (result != null) { + throw result; + } + } + } diff --git a/watson/org.eclipse.rcptt.watson.core/src/org/eclipse/rcptt/sherlock/core/streams/SherlockReportOutputStream.java b/watson/org.eclipse.rcptt.watson.core/src/org/eclipse/rcptt/sherlock/core/streams/SherlockReportOutputStream.java index fbc3f7efd..4f4aabba2 100644 --- a/watson/org.eclipse.rcptt.watson.core/src/org/eclipse/rcptt/sherlock/core/streams/SherlockReportOutputStream.java +++ b/watson/org.eclipse.rcptt.watson.core/src/org/eclipse/rcptt/sherlock/core/streams/SherlockReportOutputStream.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.eclipse.rcptt.sherlock.core.streams; +import java.io.Closeable; import java.io.IOException; import java.io.OutputStream; import java.util.zip.ZipEntry; @@ -18,7 +19,7 @@ import org.eclipse.rcptt.sherlock.core.SherlockCore; import org.eclipse.rcptt.sherlock.core.model.sherlock.report.Report; -public class SherlockReportOutputStream { +public class SherlockReportOutputStream implements Closeable { private ZipOutputStream stream; int index = 0; From db0465320750bb17edc9df664f77d1b7ba8a4f9e Mon Sep 17 00:00:00 2001 From: Vasili Gulevich Date: Tue, 2 Apr 2024 23:45:02 +0400 Subject: [PATCH 2/2] Do not suppress runner failures --- releng/Jenkinsfile.groovy | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/releng/Jenkinsfile.groovy b/releng/Jenkinsfile.groovy index 411b1acd3..7d3d42d2c 100644 --- a/releng/Jenkinsfile.groovy +++ b/releng/Jenkinsfile.groovy @@ -220,16 +220,15 @@ $SSH_DEPLOY_CONTAINER_VOLUMES } private void _run_tests(String runner, String dir, String args) { - try { + this.script.warnError(message: "Tests failed") { this.script.sh "mvn clean verify -B -f ${dir}/pom.xml \ -Dmaven.repo.local=${getWorkspace()}/m2 -e \ -Dci-maven-version=2.0.0-SNAPSHOT \ -DexplicitRunner=`readlink -f ${runner}` \ - ${args} || true" + ${args}" this.script.sh "test -f ${dir}/target/results/tests.html" - } finally { - this.script.archiveArtifacts allowEmptyArchive: false, artifacts: "${dir}/target/results/**/*, ${dir}/target/**/*log,${dir}/target/surefire-reports/**" } + this.script.archiveArtifacts allowEmptyArchive: false, artifacts: "${dir}/target/results/**/*, ${dir}/target/**/*log,${dir}/target/surefire-reports/**" } void post_build_actions() {