diff --git a/core/src/main/java/hudson/tasks/junit/CaseResult.java b/core/src/main/java/hudson/tasks/junit/CaseResult.java index 1b18a63d6579969cba309f30b2ee42da2abf891f..15cbbacc85a341dd04c1480be1e544a5b269d86f 100644 --- a/core/src/main/java/hudson/tasks/junit/CaseResult.java +++ b/core/src/main/java/hudson/tasks/junit/CaseResult.java @@ -39,7 +39,6 @@ import static java.util.Collections.emptyList; /** * One test result. - * It is uniquely identified by its className and testName. * * @author Kohsuke Kawaguchi */ @@ -130,10 +129,6 @@ public final class CaseResult extends TestResult implements Comparable results, boolean keepLongStdio, String stdio) { // HUDSON-6516 @@ -517,41 +512,6 @@ public final class CaseResult extends TestResult implements Comparable cases = new ArrayList(); - // transient representation of the cases, which is only used while the SuiteResult is build up initially - private transient Set casesSet = new HashSet(); - private transient hudson.tasks.junit.TestResult parent; SuiteResult(String name, String stdout, String stderr) { @@ -207,16 +204,9 @@ public final class SuiteResult implements Serializable { this.stderr = CaseResult.possiblyTrimStdio(cases, keepLongStdio, stderr); } - /** - * Adds the {@link CaseResult} to this {@link SuiteResult}, if it's not already - * included. - */ /*package*/ void addCase(CaseResult cr) { - boolean added = casesSet.add(cr); - if (added) { - cases.add(cr); - duration += cr.getDuration(); - } + cases.add(cr); + duration += cr.getDuration(); } @Exported(visibility=9) @@ -323,8 +313,6 @@ public final class SuiteResult implements Serializable { return false; // already frozen this.parent = owner; - - casesSet = null; for (CaseResult c : cases) c.freeze(this); return true; diff --git a/core/src/main/java/hudson/tasks/junit/TestResult.java b/core/src/main/java/hudson/tasks/junit/TestResult.java index d5fbda98651aae954510b21ab6af1c1140d8e55a..312af604aaf37d3c037afe6b777fd99c34b075e8 100644 --- a/core/src/main/java/hudson/tasks/junit/TestResult.java +++ b/core/src/main/java/hudson/tasks/junit/TestResult.java @@ -186,27 +186,18 @@ public final class TestResult extends MetaTabulatedResult { private void add(SuiteResult sr) { for (SuiteResult s : suites) { - // A common problem is that people parse TEST-*.xml as well as TESTS-TestSuite.xml - // see http://jenkins.361315.n4.nabble.com/Problem-with-duplicate-build-execution-td371616.html for discussion. - // On the other hand, it's also possible that a TestSuite is split between different files - e.g. in PHPUnit - // See JENKINS-12457 - if(s.getName().equals(sr.getName()) && nullSafeEq(s.getId(),sr.getId())) { - for (CaseResult caseResult : sr.getCases()) { - s.addCase(caseResult); - caseResult.replaceParent(s); - } - return; - } + // a common problem is that people parse TEST-*.xml as well as TESTS-TestSuite.xml + // see http://www.nabble.com/Problem-with-duplicate-build-execution-td17549182.html for discussion + if(s.getName().equals(sr.getName()) && eq(s.getTimestamp(),sr.getTimestamp()) + && eq(s.getId(),sr.getId())) + return; // duplicate } suites.add(sr); duration += sr.getDuration(); } - private boolean nullSafeEq(Object lhs, Object rhs) { - if (lhs == null) { - return rhs == null; - } - return lhs.equals(rhs); + private boolean eq(Object lhs, Object rhs) { + return lhs != null && rhs != null && lhs.equals(rhs); } /** diff --git a/core/src/test/java/hudson/tasks/junit/TestResultTest.java b/core/src/test/java/hudson/tasks/junit/TestResultTest.java index 569c5cf08359485d4483e7475c62ee799ff68c25..67400b4513564ff4b65be51fe4aab6f94b1c43fc 100644 --- a/core/src/test/java/hudson/tasks/junit/TestResultTest.java +++ b/core/src/test/java/hudson/tasks/junit/TestResultTest.java @@ -52,7 +52,7 @@ public class TestResultTest extends TestCase { testResult.parse(getDataFile("eclipse-plugin-test-report.xml")); Collection suites = testResult.getSuites(); - assertEquals("Wrong number of test suites", 15, suites.size()); + assertEquals("Wrong number of test suites", 16, suites.size()); int testCaseCount = 0; for (SuiteResult suite : suites) { testCaseCount += suite.getCases().size(); diff --git a/core/src/test/resources/hudson/tasks/junit/eclipse-plugin-test-report.xml b/core/src/test/resources/hudson/tasks/junit/eclipse-plugin-test-report.xml index 6cd2025b1363c448f7f4aa4308dd794fc9ce9360..5b3e7b774140c445d435e092b52f3984c0e8121f 100644 --- a/core/src/test/resources/hudson/tasks/junit/eclipse-plugin-test-report.xml +++ b/core/src/test/resources/hudson/tasks/junit/eclipse-plugin-test-report.xml @@ -1,6 +1,6 @@ - + @@ -290,7 +290,7 @@ x86_64 ]]> - + @@ -552,7 +552,7 @@ ProjectImportTask: execution finished - + @@ -1703,7 +1703,7 @@ java.lang.NullPointerException - + @@ -5550,7 +5550,7 @@ SEVERE: Message ]]> - + @@ -5981,7 +5981,7 @@ x86_64 - + @@ -6385,7 +6385,7 @@ ORMEXT: Should find 3 mapping ]]> - + @@ -6625,7 +6625,7 @@ x86_64 - + @@ -7216,7 +7216,7 @@ x86_64 - + @@ -7566,7 +7566,7 @@ x86_64 - + @@ -7924,7 +7924,7 @@ x86_64 - + @@ -8602,7 +8602,7 @@ x86_64 - + @@ -8844,7 +8844,7 @@ x86_64 - + @@ -9572,7 +9572,7 @@ Test test.CalculationTest1 finished. - + @@ -10456,7 +10456,7 @@ x86_64 - + @@ -10768,7 +10768,7 @@ x86_64 - +