From 5e70d369ddcbec50f38cadd3d362c0c7d833440a Mon Sep 17 00:00:00 2001 From: Arnaud Date: Fri, 9 Jun 2017 07:53:55 +0200 Subject: [PATCH 1/4] expose testData publicly This will allow dependent plugins (like xunit one) to run TestDataPublishers --- src/main/java/hudson/tasks/junit/TestResultAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/hudson/tasks/junit/TestResultAction.java b/src/main/java/hudson/tasks/junit/TestResultAction.java index 75acbffcc..3328d93ef 100644 --- a/src/main/java/hudson/tasks/junit/TestResultAction.java +++ b/src/main/java/hudson/tasks/junit/TestResultAction.java @@ -230,7 +230,7 @@ public List getActions(TestObject object) { return Collections.unmodifiableList(result); } - List getData() { + public List getData() { return testData; } From 8eae591453ca090ac8acfa646391a7a6efd8bf84 Mon Sep 17 00:00:00 2001 From: Arnaud Date: Wed, 14 Jun 2017 22:09:24 +0200 Subject: [PATCH 2/4] switch to public exposition of an addData method --- .../java/hudson/tasks/junit/JUnitResultArchiver.java | 3 +-- src/main/java/hudson/tasks/junit/TestResultAction.java | 9 ++++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/hudson/tasks/junit/JUnitResultArchiver.java b/src/main/java/hudson/tasks/junit/JUnitResultArchiver.java index c3de92b0f..86e86071a 100644 --- a/src/main/java/hudson/tasks/junit/JUnitResultArchiver.java +++ b/src/main/java/hudson/tasks/junit/JUnitResultArchiver.java @@ -177,12 +177,11 @@ public void perform(Run build, FilePath workspace, Launcher launcher, } // TODO: Move into JUnitParser [BUG 3123310] - List data = action.getData(); if (testDataPublishers != null) { for (TestDataPublisher tdp : testDataPublishers) { Data d = tdp.contributeTestData(build, workspace, launcher, listener, result); if (d != null) { - data.add(d); + action.addData(d); } } } diff --git a/src/main/java/hudson/tasks/junit/TestResultAction.java b/src/main/java/hudson/tasks/junit/TestResultAction.java index 3328d93ef..8df40f7ef 100644 --- a/src/main/java/hudson/tasks/junit/TestResultAction.java +++ b/src/main/java/hudson/tasks/junit/TestResultAction.java @@ -230,7 +230,7 @@ public List getActions(TestObject object) { return Collections.unmodifiableList(result); } - public List getData() { + List getData() { return testData; } @@ -238,6 +238,13 @@ public void setData(List testData) { this.testData = testData; } + /** + * Adds a {@link Data} to the collection data associated with this action. + */ + public void addData(Data data) { + this.testData.add(data); + } + /** * Merges an additional test result into this one. */ From d84268fdfbe10a02654e3ca19cc19e3a4cb9a2a7 Mon Sep 17 00:00:00 2001 From: Arnaud Date: Wed, 14 Jun 2017 23:50:23 +0200 Subject: [PATCH 3/4] correct javadoc --- .../java/hudson/tasks/junit/TestResultAction.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/hudson/tasks/junit/TestResultAction.java b/src/main/java/hudson/tasks/junit/TestResultAction.java index 8df40f7ef..948a13ee5 100644 --- a/src/main/java/hudson/tasks/junit/TestResultAction.java +++ b/src/main/java/hudson/tasks/junit/TestResultAction.java @@ -234,12 +234,24 @@ List getData() { return testData; } + /** + * Replaces to collection of test data associated with this action. + * + *

+ * This method will not automatically persist the data at the time of addition. + * + */ public void setData(List testData) { this.testData = testData; } /** - * Adds a {@link Data} to the collection data associated with this action. + * Adds a {@link Data} to the test data associated with this action. + * + *

+ * This method will not automatically persist the data at the time of addition. + * + * @since TODO */ public void addData(Data data) { this.testData.add(data); From 0d53590057d4b9c1febae52877a453eee14f6a08 Mon Sep 17 00:00:00 2001 From: Arnaud Date: Wed, 14 Jun 2017 23:52:13 +0200 Subject: [PATCH 4/4] add needed synchronization --- .../hudson/tasks/junit/TestResultAction.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/main/java/hudson/tasks/junit/TestResultAction.java b/src/main/java/hudson/tasks/junit/TestResultAction.java index 948a13ee5..ddfeb2ffe 100644 --- a/src/main/java/hudson/tasks/junit/TestResultAction.java +++ b/src/main/java/hudson/tasks/junit/TestResultAction.java @@ -222,10 +222,12 @@ public List getActions(TestObject object) { List result = new ArrayList(); // Added check for null testData to avoid NPE from issue 4257. if (testData != null) { - for (Data data : testData) - for (TestAction ta : data.getTestAction(object)) - if (ta != null) - result.add(ta); + synchronized (testData) { + for (Data data : testData) + for (TestAction ta : data.getTestAction(object)) + if (ta != null) + result.add(ta); + } } return Collections.unmodifiableList(result); } @@ -242,7 +244,7 @@ List getData() { * */ public void setData(List testData) { - this.testData = testData; + this.testData = testData; } /** @@ -254,7 +256,9 @@ public void setData(List testData) { * @since TODO */ public void addData(Data data) { - this.testData.add(data); + synchronized (testData) { + this.testData.add(data); + } } /** @@ -277,7 +281,7 @@ void mergeResult(TestResult additionalResult, TaskListener listener) { public static abstract class Data { /** * Returns all TestActions for the testObject. - * + * * @return * Can be empty but never null. The caller must assume that the returned list is read-only. */ @@ -289,10 +293,10 @@ public Object readResolve() { if (testData == null) { testData = new ArrayList(0); } - + return this; } - + private static final Logger logger = Logger.getLogger(TestResultAction.class.getName()); private static final XStream XSTREAM = new XStream2();