From af92a497727aad384f87615d808601ea9f52159c Mon Sep 17 00:00:00 2001 From: Tim Jacomb Date: Thu, 24 Sep 2020 10:00:23 +0100 Subject: [PATCH] Add stdout, stderr, stacktrace, fix caseresult loading --- .../java/hudson/tasks/junit/CaseResult.java | 18 +++-- .../hudson/tasks/junit/PackageResult.java | 13 +--- .../storage/TestResultStorageJunitTest.java | 72 ++++++++++++++----- 3 files changed, 69 insertions(+), 34 deletions(-) diff --git a/src/main/java/hudson/tasks/junit/CaseResult.java b/src/main/java/hudson/tasks/junit/CaseResult.java index 3cefc45af..2f709f122 100644 --- a/src/main/java/hudson/tasks/junit/CaseResult.java +++ b/src/main/java/hudson/tasks/junit/CaseResult.java @@ -134,14 +134,24 @@ public CaseResult(SuiteResult parent, String testName, String errorStackTrace, S } @Restricted(Beta.class) - public CaseResult(SuiteResult parent, String className, String testName, String errorDetails, String skippedMessage, float duration) { + public CaseResult( + SuiteResult parent, + String className, + String testName, + String errorDetails, + String skippedMessage, + float duration, + String stdout, + String stderr, + String stacktrace + ) { this.className = className; this.testName = testName; - this.errorStackTrace = null; + this.errorStackTrace = stacktrace; this.errorDetails = errorDetails; this.parent = parent; - this.stdout = null; - this.stderr = null; + this.stdout = stdout; + this.stderr = stderr; this.duration = duration; this.skipped = skippedMessage != null; diff --git a/src/main/java/hudson/tasks/junit/PackageResult.java b/src/main/java/hudson/tasks/junit/PackageResult.java index 9fb4d1ea5..06b6cd73e 100644 --- a/src/main/java/hudson/tasks/junit/PackageResult.java +++ b/src/main/java/hudson/tasks/junit/PackageResult.java @@ -24,12 +24,9 @@ package hudson.tasks.junit; import hudson.model.Run; -import io.jenkins.plugins.junit.storage.FileJunitTestResultStorage; import io.jenkins.plugins.junit.storage.TestResultImpl; -import io.jenkins.plugins.junit.storage.JunitTestResultStorage; import hudson.tasks.test.MetaTabulatedResult; import hudson.tasks.test.TestResult; -import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.export.Exported; @@ -148,15 +145,7 @@ public int getSkipCount() { @Override public Object getDynamic(String name, StaplerRequest req, StaplerResponse rsp) { - JunitTestResultStorage storage = JunitTestResultStorage.find(); - ClassResult result; - if (!(storage instanceof FileJunitTestResultStorage)) { - Run run = Stapler.getCurrentRequest().findAncestorObject(Run.class); - TestResultImpl pluggableStorage = storage.load(run.getParent().getFullName(), run.getNumber()); - result = pluggableStorage.getClassResult(name); - } else { - result = getClassResult(name); - } + ClassResult result = getClassResult(name); if (result != null) { return result; } else { diff --git a/src/test/java/io/jenkins/plugins/junit/storage/TestResultStorageJunitTest.java b/src/test/java/io/jenkins/plugins/junit/storage/TestResultStorageJunitTest.java index 06785a868..571e1a069 100644 --- a/src/test/java/io/jenkins/plugins/junit/storage/TestResultStorageJunitTest.java +++ b/src/test/java/io/jenkins/plugins/junit/storage/TestResultStorageJunitTest.java @@ -67,6 +67,7 @@ import javax.xml.parsers.DocumentBuilderFactory; import jenkins.model.Jenkins; import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; import org.jenkinsci.plugins.database.Database; import org.jenkinsci.plugins.database.GlobalDatabaseConfiguration; import org.jenkinsci.plugins.database.h2.LocalH2Database; @@ -292,7 +293,7 @@ private int getCaseCount(String and) { private List retrieveCaseResult(String whereCondition) { return query(connection -> { - try (PreparedStatement statement = connection.prepareStatement("SELECT suite, package, testname, classname, errordetails, skipped, duration FROM " + Impl.CASE_RESULTS_TABLE + " WHERE job = ? AND build = ? AND " + whereCondition)) { + try (PreparedStatement statement = connection.prepareStatement("SELECT suite, package, testname, classname, errordetails, skipped, duration, stdout, stderr, stacktrace FROM " + Impl.CASE_RESULTS_TABLE + " WHERE job = ? AND build = ? AND " + whereCondition)) { statement.setString(1, job); statement.setInt(2, build); try (ResultSet result = statement.executeQuery()) { @@ -307,11 +308,14 @@ private List retrieveCaseResult(String whereCondition) { String suite = result.getString("suite"); String className = result.getString("classname"); String skipped = result.getString("skipped"); + String stdout = result.getString("stdout"); + String stderr = result.getString("stderr"); + String stacktrace = result.getString("stacktrace"); float duration = result.getFloat("duration"); SuiteResult suiteResult = new SuiteResult(suite, null, null, null); suiteResult.setParent(parent); - CaseResult caseResult = new CaseResult(suiteResult, className, testName, errorDetails, skipped, duration); + CaseResult caseResult = new CaseResult(suiteResult, className, testName, errorDetails, skipped, duration, stdout, stderr, stacktrace); ClassResult classResult = classResults.get(className); if (classResult == null) { classResult = new ClassResult(new PackageResult(new TestResult(this), packageName), className); @@ -331,7 +335,7 @@ private List retrieveCaseResult(String whereCondition) { @Override public List getAllPackageResults() { return query(connection -> { - try (PreparedStatement statement = connection.prepareStatement("SELECT suite, testname, package, classname, errordetails, skipped, duration FROM " + Impl.CASE_RESULTS_TABLE + " WHERE job = ? AND build = ?")) { + try (PreparedStatement statement = connection.prepareStatement("SELECT suite, testname, package, classname, errordetails, skipped, duration, stdout, stderr, stacktrace FROM " + Impl.CASE_RESULTS_TABLE + " WHERE job = ? AND build = ?")) { statement.setString(1, job); statement.setInt(2, build); try (ResultSet result = statement.executeQuery()) { @@ -346,11 +350,14 @@ public List getAllPackageResults() { String suite = result.getString("suite"); String className = result.getString("classname"); String skipped = result.getString("skipped"); + String stdout = result.getString("stdout"); + String stderr = result.getString("stderr"); + String stacktrace = result.getString("stacktrace"); float duration = result.getFloat("duration"); SuiteResult suiteResult = new SuiteResult(suite, null, null, null); suiteResult.setParent(parent); - CaseResult caseResult = new CaseResult(suiteResult, className, testName, errorDetails, skipped, duration); + CaseResult caseResult = new CaseResult(suiteResult, className, testName, errorDetails, skipped, duration, stdout, stderr, stacktrace); PackageResult packageResult = results.get(packageName); if (packageResult == null) { packageResult = new PackageResult(parent, packageName); @@ -437,7 +444,7 @@ public int getCountOfBuildsWithTestResults() { @Override public PackageResult getPackageResult(String packageName) { return query(connection -> { - try (PreparedStatement statement = connection.prepareStatement("SELECT suite, testname, classname, errordetails, skipped, duration FROM " + Impl.CASE_RESULTS_TABLE + " WHERE job = ? AND build = ? AND package = ?")) { + try (PreparedStatement statement = connection.prepareStatement("SELECT suite, testname, classname, errordetails, skipped, duration, stdout, stderr, stacktrace FROM " + Impl.CASE_RESULTS_TABLE + " WHERE job = ? AND build = ? AND package = ?")) { statement.setString(1, job); statement.setInt(2, build); statement.setString(3, packageName); @@ -451,11 +458,14 @@ public PackageResult getPackageResult(String packageName) { String suite = result.getString("suite"); String className = result.getString("classname"); String skipped = result.getString("skipped"); + String stdout = result.getString("stdout"); + String stderr = result.getString("stderr"); + String stacktrace = result.getString("stacktrace"); float duration = result.getFloat("duration"); SuiteResult suiteResult = new SuiteResult(suite, null, null, null); suiteResult.setParent(new TestResult(this)); - CaseResult caseResult = new CaseResult(suiteResult, className, testName, errorDetails, skipped, duration); + CaseResult caseResult = new CaseResult(suiteResult, className, testName, errorDetails, skipped, duration, stdout, stderr, stacktrace); ClassResult classResult = classResults.get(className); if (classResult == null) { @@ -479,7 +489,7 @@ public PackageResult getPackageResult(String packageName) { @Override public ClassResult getClassResult(String name) { return query(connection -> { - try (PreparedStatement statement = connection.prepareStatement("SELECT suite, package, testname, classname, errordetails, skipped, duration FROM " + Impl.CASE_RESULTS_TABLE + " WHERE job = ? AND build = ? AND classname = ?")) { + try (PreparedStatement statement = connection.prepareStatement("SELECT suite, package, testname, classname, errordetails, skipped, duration, stdout, stderr, stacktrace FROM " + Impl.CASE_RESULTS_TABLE + " WHERE job = ? AND build = ? AND classname = ?")) { statement.setString(1, job); statement.setInt(2, build); statement.setString(3, name); @@ -494,6 +504,9 @@ public ClassResult getClassResult(String name) { String suite = result.getString("suite"); String className = result.getString("classname"); String skipped = result.getString("skipped"); + String stdout = result.getString("stdout"); + String stderr = result.getString("stderr"); + String stacktrace = result.getString("stacktrace"); float duration = result.getFloat("duration"); if (classResult == null) { @@ -502,7 +515,7 @@ public ClassResult getClassResult(String name) { SuiteResult suiteResult = new SuiteResult(suite, null, null, null); suiteResult.setParent(parent); - CaseResult caseResult = new CaseResult(suiteResult, className, testName, errorDetails, skipped, duration); + CaseResult caseResult = new CaseResult(suiteResult, className, testName, errorDetails, skipped, duration, stdout, stderr, stacktrace); classResult.add(caseResult); caseResult.setClass(classResult); } @@ -598,7 +611,7 @@ public List getFailedTestsByPackage(String packageName) { private List getByPackage(String packageName, String filter) { return query(connection -> { - try (PreparedStatement statement = connection.prepareStatement("SELECT suite, testname, classname, errordetails, duration, skipped FROM " + Impl.CASE_RESULTS_TABLE + " WHERE job = ? AND build = ? AND package = ? " + filter)) { + try (PreparedStatement statement = connection.prepareStatement("SELECT suite, testname, classname, errordetails, duration, skipped, stdout, stderr, stacktrace FROM " + Impl.CASE_RESULTS_TABLE + " WHERE job = ? AND build = ? AND package = ? " + filter)) { statement.setString(1, job); statement.setInt(2, build); statement.setString(3, packageName); @@ -611,11 +624,14 @@ private List getByPackage(String packageName, String filter) { String suite = result.getString("suite"); String className = result.getString("classname"); String skipped = result.getString("skipped"); + String stdout = result.getString("stdout"); + String stderr = result.getString("stderr"); + String stacktrace = result.getString("stacktrace"); float duration = result.getFloat("duration"); SuiteResult suiteResult = new SuiteResult(suite, null, null, null); suiteResult.setParent(new TestResult(this)); - results.add(new CaseResult(suiteResult, className, testName, errorDetails, skipped, duration)); + results.add(new CaseResult(suiteResult, className, testName, errorDetails, skipped, duration, stdout, stderr, stacktrace)); } return results; } @@ -631,7 +647,7 @@ private List getCaseResults(String column) { @Override public CaseResult getCaseResult(String testName) { return query(connection -> { - try (PreparedStatement statement = connection.prepareStatement("SELECT suite, testname, package, classname, errordetails, skipped, duration FROM " + Impl.CASE_RESULTS_TABLE + " WHERE job = ? AND build = ? AND testname = ?")) { + try (PreparedStatement statement = connection.prepareStatement("SELECT suite, testname, package, classname, errordetails, skipped, duration, stdout, stderr, stacktrace FROM " + Impl.CASE_RESULTS_TABLE + " WHERE job = ? AND build = ? AND testname = ?")) { statement.setString(1, job); statement.setInt(2, build); statement.setString(3, testName); @@ -646,11 +662,14 @@ public CaseResult getCaseResult(String testName) { String suite = result.getString("suite"); String className = result.getString("classname"); String skipped = result.getString("skipped"); + String stdout = result.getString("stdout"); + String stderr = result.getString("stderr"); + String stacktrace = result.getString("stacktrace"); float duration = result.getFloat("duration"); SuiteResult suiteResult = new SuiteResult(suite, null, null, null); suiteResult.setParent(new TestResult(this)); - caseResult = new CaseResult(suiteResult, className, resultTestName, errorDetails, skipped, duration); + caseResult = new CaseResult(suiteResult, className, resultTestName, errorDetails, skipped, duration, stdout, stderr, stacktrace); PackageResult packageResult = new PackageResult(new TestResult(this), packageName); ClassResult classResult = new ClassResult(packageResult, className); classResult.add(caseResult); @@ -670,7 +689,7 @@ public CaseResult getCaseResult(String testName) { @Override public SuiteResult getSuite(String name) { return query(connection -> { - try (PreparedStatement statement = connection.prepareStatement("SELECT testname, package, classname, errordetails, skipped, duration FROM " + Impl.CASE_RESULTS_TABLE + " WHERE job = ? AND build = ? AND suite = ?")) { + try (PreparedStatement statement = connection.prepareStatement("SELECT testname, package, classname, errordetails, skipped, duration, stdout, stderr, stacktrace FROM " + Impl.CASE_RESULTS_TABLE + " WHERE job = ? AND build = ? AND suite = ?")) { statement.setString(1, job); statement.setInt(2, build); statement.setString(3, name); @@ -683,10 +702,13 @@ public SuiteResult getSuite(String name) { String packageName = result.getString("package"); String className = result.getString("classname"); String skipped = result.getString("skipped"); + String stdout = result.getString("stdout"); + String stderr = result.getString("stderr"); + String stacktrace = result.getString("stacktrace"); float duration = result.getFloat("duration"); suiteResult.setParent(parent); - CaseResult caseResult = new CaseResult(suiteResult, className, resultTestName, errorDetails, skipped, duration); + CaseResult caseResult = new CaseResult(suiteResult, className, resultTestName, errorDetails, skipped, duration, stdout, stderr, stacktrace); final PackageResult packageResult = new PackageResult(parent, packageName); packageResult.add(caseResult); ClassResult classResult = new ClassResult(packageResult, className); @@ -806,7 +828,7 @@ private static class RemotePublisherImpl implements RemotePublisher { @Override public void publish(TestResult result, TaskListener listener) throws IOException { try { Connection connection = connectionSupplier.connection(); - try (PreparedStatement statement = connection.prepareStatement("INSERT INTO " + CASE_RESULTS_TABLE + " (job, build, suite, package, className, testName, errorDetails, skipped, duration) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)")) { + try (PreparedStatement statement = connection.prepareStatement("INSERT INTO " + CASE_RESULTS_TABLE + " (job, build, suite, package, className, testName, errorDetails, skipped, duration, stdout, stderr, stacktrace) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")) { int count = 0; for (SuiteResult suiteResult : result.getSuites()) { for (CaseResult caseResult : suiteResult.getCases()) { @@ -828,6 +850,21 @@ private static class RemotePublisherImpl implements RemotePublisher { statement.setNull(8, Types.VARCHAR); } statement.setFloat(9, caseResult.getDuration()); + if (StringUtils.isNotEmpty(caseResult.getStdout())) { + statement.setString(10, caseResult.getStdout()); + } else { + statement.setNull(10, Types.VARCHAR); + } + if (StringUtils.isNotEmpty(caseResult.getStderr())) { + statement.setString(11, caseResult.getStderr()); + } else { + statement.setNull(11, Types.VARCHAR); + } + if (StringUtils.isNotEmpty(caseResult.getErrorStackTrace())) { + statement.setString(12, caseResult.getErrorStackTrace()); + } else { + statement.setNull(12, Types.VARCHAR); + } statement.executeUpdate(); count++; } @@ -878,9 +915,8 @@ static class LocalConnectionSupplier extends ConnectionSupplier { } if (!exists) { try (Statement statement = connection.createStatement()) { - // TODO this and joined tables: errorStackTrace, stdout, stderr, nodeId, enclosingBlocks, enclosingBlockNames, etc. - statement.execute("CREATE TABLE " + CASE_RESULTS_TABLE + "(job varchar(255), build int, suite varchar(255), package varchar(255), className varchar(255), testName varchar(255), errorDetails varchar(255), skipped varchar(255), duration numeric)"); - // TODO indices + // TODO this and joined tables: nodeId, enclosingBlocks, enclosingBlockNames, etc. + statement.execute("CREATE TABLE " + CASE_RESULTS_TABLE + "(job varchar(255), build int, suite varchar(255), package varchar(255), className varchar(255), testName varchar(255), errorDetails varchar(255), skipped varchar(255), duration numeric, stdout varchar(100000), stderr varchar(100000), stacktrace varchar(100000))"); } } }