From 5e9c28a903b9e574c5a2e6d6520b2ebcdd54315f Mon Sep 17 00:00:00 2001 From: Mohammad Azim Khan Date: Fri, 22 Jul 2016 15:34:13 +0100 Subject: [PATCH 1/8] Enhancement for build custom fields --- .../testlink/AbstractTestLinkBuilder.java | 19 ++++++++---- .../plugins/testlink/TestLinkBuilder.java | 31 ++++++++++++++----- .../testlink/TestLinkBuilder/config.jelly | 6 +++- .../TestLinkBuilder/config.properties | 1 + .../TestLinkBuilder/config_es.properties | 1 + .../TestLinkBuilder/config_pt.properties | 1 + src/main/webapp/help-buildCustomFields.html | 11 +++++++ .../plugins/testlink/TestTestLinkBuilder.java | 11 +++++-- 8 files changed, 63 insertions(+), 18 deletions(-) create mode 100644 src/main/webapp/help-buildCustomFields.html diff --git a/src/main/java/hudson/plugins/testlink/AbstractTestLinkBuilder.java b/src/main/java/hudson/plugins/testlink/AbstractTestLinkBuilder.java index 1bb189d..60ba321 100644 --- a/src/main/java/hudson/plugins/testlink/AbstractTestLinkBuilder.java +++ b/src/main/java/hudson/plugins/testlink/AbstractTestLinkBuilder.java @@ -58,6 +58,10 @@ public class AbstractTestLinkBuilder extends Builder { * The name of the Build. */ protected String buildName; + /** + * The Build custom fields. + */ + protected String buildCustomFields; /** * The platform name. */ @@ -133,7 +137,7 @@ public class AbstractTestLinkBuilder extends Builder { * Create a AbstractTestLinkBuilder. */ public AbstractTestLinkBuilder(String testLinkName, String testProjectName, String testPlanName, - String platformName, String buildName, String customFields, String testPlanCustomFields, List singleBuildSteps, + String platformName, String buildName, String buildCustomFields, String customFields, String testPlanCustomFields, List singleBuildSteps, List beforeIteratingAllTestCasesBuildSteps, List iterativeBuildSteps, List afterIteratingAllTestCasesBuildSteps, Boolean transactional, Boolean failedTestsMarkBuildAsFailure, Boolean failIfNoResults, Boolean failOnNotRun, @@ -144,6 +148,7 @@ public AbstractTestLinkBuilder(String testLinkName, String testProjectName, Stri this.testPlanName = testPlanName; this.platformName = platformName; this.buildName = buildName; + this.buildCustomFields = buildCustomFields; this.customFields = customFields; this.testPlanCustomFields = testPlanCustomFields; this.singleBuildSteps = singleBuildSteps; @@ -162,12 +167,12 @@ public AbstractTestLinkBuilder(String testLinkName, String testProjectName, Stri * @deprecated to add test plan custom fields */ public AbstractTestLinkBuilder(String testLinkName, String testProjectName, String testPlanName, - String platformName, String buildName, String customFields, List singleBuildSteps, + String platformName, String buildName, String buildCustomFields, String customFields, List singleBuildSteps, List beforeIteratingAllTestCasesBuildSteps, List iterativeBuildSteps, List afterIteratingAllTestCasesBuildSteps, Boolean transactional, Boolean failedTestsMarkBuildAsFailure, Boolean failIfNoResults, Boolean failOnNotRun, List resultSeekers) { - this(testLinkName, testProjectName, testPlanName, platformName, buildName, customFields, + this(testLinkName, testProjectName, testPlanName, platformName, buildName, buildCustomFields, customFields, /*testPlanCustomFields*/ null, singleBuildSteps, beforeIteratingAllTestCasesBuildSteps, iterativeBuildSteps, afterIteratingAllTestCasesBuildSteps, transactional, failedTestsMarkBuildAsFailure, failIfNoResults, failOnNotRun, resultSeekers); @@ -181,8 +186,8 @@ public AbstractTestLinkBuilder(String testLinkName, String testProjectName, Stri * @param testPlanName TestLink Test Plan name. * @param platformName TestLink Platform name. * @param buildName TestLink Build name. + * @param buildCustomFields TestLink Build custom fields. * @param customFields TestLink comma-separated list of Custom Fields. - * @param keyCustomField Key custom field. * @param singleBuildSteps List of build steps to execute once for all automated test cases. * @param beforeIteratingAllTestCasesBuildSteps Command executed before iterating all test cases. * @param iterativeBuildSteps List of build steps to execute for each Automated Test Case. @@ -194,13 +199,13 @@ public AbstractTestLinkBuilder(String testLinkName, String testProjectName, Stri * @deprecated */ public AbstractTestLinkBuilder(String testLinkName, String testProjectName, String testPlanName, - String platformName, String buildName, String customFields, Boolean executionStatusNotRun, + String platformName, String buildName, String buildCustomFields, String customFields, Boolean executionStatusNotRun, Boolean executionStatusPassed, Boolean executionStatusFailed, Boolean executionStatusBlocked, List singleBuildSteps, List beforeIteratingAllTestCasesBuildSteps, List iterativeBuildSteps, List afterIteratingAllTestCasesBuildSteps, Boolean transactional, Boolean failedTestsMarkBuildAsFailure, Boolean failIfNoResults, Boolean failOnNotRun, List resultSeekers) { - this(testLinkName, testProjectName, testPlanName, platformName, buildName, customFields, + this(testLinkName, testProjectName, testPlanName, platformName, buildName, buildCustomFields, customFields, /*testPlanCustomFields*/ null, singleBuildSteps, beforeIteratingAllTestCasesBuildSteps, iterativeBuildSteps, afterIteratingAllTestCasesBuildSteps, transactional, failedTestsMarkBuildAsFailure, failIfNoResults, failOnNotRun, resultSeekers); @@ -226,6 +231,8 @@ public String getBuildName() { return this.buildName; } + public String getBuildCustomFields() { return this.buildCustomFields; } + public String getCustomFields() { return this.customFields; } diff --git a/src/main/java/hudson/plugins/testlink/TestLinkBuilder.java b/src/main/java/hudson/plugins/testlink/TestLinkBuilder.java index bc3a428..879cf06 100644 --- a/src/main/java/hudson/plugins/testlink/TestLinkBuilder.java +++ b/src/main/java/hudson/plugins/testlink/TestLinkBuilder.java @@ -28,6 +28,7 @@ import java.net.URL; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -90,7 +91,7 @@ public TestLinkBuilder(String testLinkName, String testProjectName, List afterIteratingAllTestCasesBuildSteps, Boolean transactional, Boolean failedTestsMarkBuildAsFailure, Boolean failIfNoResults, List resultSeekers) { - this(testLinkName, testProjectName, testPlanName, buildName, + this(testLinkName, testProjectName, testPlanName, buildName, null, null, customFields, executionStatusNotRun, executionStatusPassed, executionStatusFailed, executionStatusBlocked, singleBuildSteps, beforeIteratingAllTestCasesBuildSteps, iterativeBuildSteps, @@ -112,7 +113,7 @@ public TestLinkBuilder(String testLinkName, String testProjectName, List afterIteratingAllTestCasesBuildSteps, Boolean transactional, Boolean failedTestsMarkBuildAsFailure, Boolean failIfNoResults, Boolean failOnNotRun, List resultSeekers) { - super(testLinkName, testProjectName, testPlanName, buildName, null, + super(testLinkName, testProjectName, testPlanName, buildName, null, null, customFields, executionStatusNotRun, executionStatusPassed, executionStatusFailed, executionStatusBlocked, singleBuildSteps, beforeIteratingAllTestCasesBuildSteps, iterativeBuildSteps, @@ -125,7 +126,7 @@ public TestLinkBuilder(String testLinkName, String testProjectName, * @deprecated to add test plan custom fields */ public TestLinkBuilder(String testLinkName, String testProjectName, - String testPlanName, String platformName, String buildName, String customFields, + String testPlanName, String platformName, String buildName, String buildCustomFields, String customFields, Boolean executionStatusNotRun, Boolean executionStatusPassed, Boolean executionStatusFailed, Boolean executionStatusBlocked, List singleBuildSteps, @@ -134,7 +135,7 @@ public TestLinkBuilder(String testLinkName, String testProjectName, List afterIteratingAllTestCasesBuildSteps, Boolean transactional, Boolean failedTestsMarkBuildAsFailure, Boolean failIfNoResults, Boolean failOnNotRun, List resultSeekers) { - super(testLinkName, testProjectName, testPlanName, platformName, buildName, + super(testLinkName, testProjectName, testPlanName, platformName, buildName, buildCustomFields, customFields, singleBuildSteps, beforeIteratingAllTestCasesBuildSteps, iterativeBuildSteps, afterIteratingAllTestCasesBuildSteps, transactional, failedTestsMarkBuildAsFailure, failIfNoResults, failOnNotRun, resultSeekers); @@ -142,7 +143,8 @@ public TestLinkBuilder(String testLinkName, String testProjectName, @DataBoundConstructor public TestLinkBuilder(String testLinkName, String testProjectName, - String testPlanName, String platformName, String buildName, String customFields, String testPlanCustomFields, + String testPlanName, String platformName, String buildName, + String buildCustomFields, String customFields, String testPlanCustomFields, Boolean executionStatusNotRun, Boolean executionStatusPassed, Boolean executionStatusFailed, Boolean executionStatusBlocked, List singleBuildSteps, @@ -151,7 +153,7 @@ public TestLinkBuilder(String testLinkName, String testProjectName, List afterIteratingAllTestCasesBuildSteps, Boolean transactional, Boolean failedTestsMarkBuildAsFailure, Boolean failIfNoResults, Boolean failOnNotRun, List resultSeekers) { - super(testLinkName, testProjectName, testPlanName, platformName, buildName, + super(testLinkName, testProjectName, testPlanName, platformName, buildName, buildCustomFields, customFields, testPlanCustomFields, singleBuildSteps, beforeIteratingAllTestCasesBuildSteps, iterativeBuildSteps, afterIteratingAllTestCasesBuildSteps, transactional, failedTestsMarkBuildAsFailure, failIfNoResults, failOnNotRun, resultSeekers); @@ -194,6 +196,8 @@ public boolean perform(AbstractBuild build, Launcher launcher, build.getEnvironment(listener), getPlatformName()); final String buildName = TestLinkHelper.expandVariable(build.getBuildVariableResolver(), build.getEnvironment(listener), getBuildName()); + final String buildCustomFields = TestLinkHelper.expandVariable(build.getBuildVariableResolver(), + build.getEnvironment(listener), getBuildCustomFields()); final String buildNotes = Messages.TestLinkBuilder_Build_Notes(); if(LOGGER.isLoggable(Level.FINE)) { LOGGER.log(Level.FINE, "TestLink project name: ["+testProjectName+"]"); @@ -201,9 +205,10 @@ public boolean perform(AbstractBuild build, Launcher launcher, LOGGER.log(Level.FINE, "TestLink platform name: ["+platformName+"]"); LOGGER.log(Level.FINE, "TestLink build name: ["+buildName+"]"); LOGGER.log(Level.FINE, "TestLink build notes: ["+buildNotes+"]"); + LOGGER.log(Level.FINE, "TestLink build Custom Fields: ["+buildCustomFields+"]"); } // TestLink Site object - testLinkSite = this.getTestLinkSite(testLinkUrl, testLinkDevKey, testProjectName, testPlanName, platformName, buildName, buildNotes); + testLinkSite = this.getTestLinkSite(testLinkUrl, testLinkDevKey, testProjectName, testPlanName, platformName, buildName, buildCustomFields, buildNotes); if (StringUtils.isNotBlank(platformName) && testLinkSite.getPlatform() == null) listener.getLogger().println(Messages.TestLinkBuilder_PlatformNotFound(platformName)); @@ -325,7 +330,7 @@ private TestCaseWrapper[] transform(TestCase[] testCases) { */ public TestLinkSite getTestLinkSite(String testLinkUrl, String testLinkDevKey, String testProjectName, String testPlanName, String platformName, - String buildName, String buildNotes) throws MalformedURLException { + String buildName, String buildCustomFields, String buildNotes) throws MalformedURLException { final TestLinkAPI api; final URL url = new URL(testLinkUrl); api = new TestLinkAPI(url, testLinkDevKey); @@ -344,7 +349,17 @@ public TestLinkSite getTestLinkSite(String testLinkUrl, String testLinkDevKey, } } + /* Extract custom fields and values */ + java.util.Map cfs = new HashMap(); + for (String part: buildCustomFields.split(",")) { + String[] cf = part.split(":"); + String name = cf[0].replaceAll("\\s+", ""); + String value = cf[1].replaceAll("\\s+", ""); + cfs.put(name, value); + } + final Build build = api.createBuild(testPlan.getId(), buildName, buildNotes); + api.updateBuildCustomFields(build.getId(), testProject.getId(), testPlan.getId(), cfs); return new TestLinkSite(api, testProject, testPlan, platform, build); } diff --git a/src/main/resources/hudson/plugins/testlink/TestLinkBuilder/config.jelly b/src/main/resources/hudson/plugins/testlink/TestLinkBuilder/config.jelly index bca4008..479add1 100644 --- a/src/main/resources/hudson/plugins/testlink/TestLinkBuilder/config.jelly +++ b/src/main/resources/hudson/plugins/testlink/TestLinkBuilder/config.jelly @@ -24,7 +24,11 @@ - + + + + + diff --git a/src/main/resources/hudson/plugins/testlink/TestLinkBuilder/config.properties b/src/main/resources/hudson/plugins/testlink/TestLinkBuilder/config.properties index d5b9d21..ad2209c 100644 --- a/src/main/resources/hudson/plugins/testlink/TestLinkBuilder/config.properties +++ b/src/main/resources/hudson/plugins/testlink/TestLinkBuilder/config.properties @@ -3,6 +3,7 @@ Test\ Project\ Name=Test Project Name Test\ Plan\ Name=Test Plan Name Platform\ Name=Platform Name Build\ Name=Build Name +Build\ Custom\ Fields\ Values=Build Custom Fields Values Custom\ Fields=Custom Fields Test\ Plan\ Custom\ Fields=Test Plan Custom Fields Key\ Custom\ Field=Key Custom Field diff --git a/src/main/resources/hudson/plugins/testlink/TestLinkBuilder/config_es.properties b/src/main/resources/hudson/plugins/testlink/TestLinkBuilder/config_es.properties index bf41081..5dee8d9 100644 --- a/src/main/resources/hudson/plugins/testlink/TestLinkBuilder/config_es.properties +++ b/src/main/resources/hudson/plugins/testlink/TestLinkBuilder/config_es.properties @@ -3,6 +3,7 @@ Test\ Project\ Name=Nombre del Proyecto de Pruebas Test\ Plan\ Name=Nombre del Plan de Pruebas Platform\ Name=Nombre de la Plataforma Build\ Name=Nombre del Build +Build\ Custom\ Fields\ Values=Construir valores de campos personalizados Custom\ Fields=Campos personalizados Key\ Custom\ Field=Campo customizado chave para testes automatizados do TestLink Execution\ Status=Execution Status diff --git a/src/main/resources/hudson/plugins/testlink/TestLinkBuilder/config_pt.properties b/src/main/resources/hudson/plugins/testlink/TestLinkBuilder/config_pt.properties index 3db0262..1725fc9 100644 --- a/src/main/resources/hudson/plugins/testlink/TestLinkBuilder/config_pt.properties +++ b/src/main/resources/hudson/plugins/testlink/TestLinkBuilder/config_pt.properties @@ -3,6 +3,7 @@ Test\ Project\ Name=Nome do Projeto de Testes Test\ Plan\ Name=Nome do Plano de Testes Platform\ Name=Nome da Plataforma Build\ Name=Nome do Build +Build\ Custom\ Fields\ Values=Construir valores personalizados Campos Custom\ Fields=Campos customizados Key\ Custom\ Field=Campo customizado chave para testes automatizados do TestLink Single\ Test\ Build\ Steps=Build Steps únicos diff --git a/src/main/webapp/help-buildCustomFields.html b/src/main/webapp/help-buildCustomFields.html new file mode 100644 index 0000000..406e4ba --- /dev/null +++ b/src/main/webapp/help-buildCustomFields.html @@ -0,0 +1,11 @@ +
+

+ Give a list of custom fields values for build. +

+

+ Example: compiler:gcc, build_os:Windows +

+

You can use environment variables in this field. For example: + build_$BUILD_ID will be converted to something like + build_YYYY-MM-DD_HH-MI-SS.

+
\ No newline at end of file diff --git a/src/test/java/hudson/plugins/testlink/TestTestLinkBuilder.java b/src/test/java/hudson/plugins/testlink/TestTestLinkBuilder.java index 054c873..82f6baa 100644 --- a/src/test/java/hudson/plugins/testlink/TestTestLinkBuilder.java +++ b/src/test/java/hudson/plugins/testlink/TestTestLinkBuilder.java @@ -60,7 +60,7 @@ public class TestTestLinkBuilder { @Before public void setUp() throws Exception { - builder = new TestLinkBuilder("No testlink", "No project", "No plan", "No platform", "No build", + builder = new TestLinkBuilder("No testlink", "No project", "No plan", "No platform", "No build", "Not build custom field", "class, time, sample-job-$BUILD_ID", "host, user",Boolean.FALSE, Boolean.FALSE, Boolean.FALSE, Boolean.FALSE, null, null, null, null, Boolean.FALSE, Boolean.FALSE, Boolean.FALSE, Boolean.FALSE, null); } @@ -89,7 +89,7 @@ public void testListOfCustomFields() { @Test public void testNull() { builder = new TestLinkBuilder(null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null); + null, null, null, null, null, null, null, null); assertNotNull(builder); @@ -103,6 +103,8 @@ public void testNull() { assertNull(builder.getBuildName()); + assertNull(builder.getBuildCustomFields()); + assertNull(builder.getSingleBuildSteps()); assertNull(builder.getBeforeIteratingAllTestCasesBuildSteps()); @@ -133,7 +135,7 @@ public void testGetters() { List singleBuildSteps = new ArrayList(); singleBuildSteps.add(shell); - builder = new TestLinkBuilder("No testlink", "No project", "No plan", "No platform", "No build", "class, time", + builder = new TestLinkBuilder("No testlink", "No project", "No plan", "No platform", "No build", "No build custom fields", "class, time", "host, user", Boolean.FALSE, Boolean.FALSE, Boolean.FALSE, Boolean.FALSE, singleBuildSteps, null, null, null, Boolean.FALSE, Boolean.FALSE, Boolean.FALSE, Boolean.FALSE, null); @@ -157,6 +159,9 @@ public void testGetters() { assertNotNull(builder.getBuildName()); assertEquals(builder.getBuildName(), "No build"); + assertNotNull(builder.getBuildCustomFields()); + assertEquals(builder.getBuildCustomFields(), "No build custom fields"); + assertNotNull(builder.getSingleBuildSteps()); assertEquals(builder.getSingleBuildSteps(), singleBuildSteps); assertEquals(builder.getSingleBuildSteps().size(), 1); From 98c329570f3aafc2825b142318ca04a9fc3d6daa Mon Sep 17 00:00:00 2001 From: Mohammad Azim Khan Date: Mon, 1 Aug 2016 11:40:09 +0100 Subject: [PATCH 2/8] Feature to parser custom fields from Junit.xml and update in TestLink --- .../testlink/TestLinkJunitWrapper.java | 155 ++++++++++++++++++ .../hudson/plugins/testlink/TestLinkSite.java | 2 +- .../JUnitCaseClassNameResultSeeker.java | 18 +- .../testlink/result/TestCaseWrapper.java | 10 +- .../plugins/testlink/TestTestLinkSite.java | 9 +- 5 files changed, 184 insertions(+), 10 deletions(-) create mode 100644 src/main/java/hudson/plugins/testlink/TestLinkJunitWrapper.java diff --git a/src/main/java/hudson/plugins/testlink/TestLinkJunitWrapper.java b/src/main/java/hudson/plugins/testlink/TestLinkJunitWrapper.java new file mode 100644 index 0000000..8450464 --- /dev/null +++ b/src/main/java/hudson/plugins/testlink/TestLinkJunitWrapper.java @@ -0,0 +1,155 @@ +/* + * The MIT License + * + * Copyright (c) <2011> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package hudson.plugins.testlink; + +import hudson.tasks.junit.JUnitParser; +import hudson.tasks.junit.TestResult; +import hudson.model.Run; +import hudson.FilePath; +import hudson.Launcher; +import hudson.model.TaskListener; +import java.io.File; +import java.io.IOException; +import java.io.PrintStream; +import java.util.Map; +import java.util.HashMap; + +import org.apache.tools.ant.types.FileSet; +import org.apache.tools.ant.DirectoryScanner; +import hudson.Util; +import jenkins.MasterToSlaveFileCallable; +import hudson.remoting.VirtualChannel; +import org.dom4j.io.SAXReader; +import hudson.util.io.ParserConfigurator; +import org.dom4j.Document; +import org.dom4j.Element; +import java.util.List; +import java.util.Iterator; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Created by azikha01 on 29/07/2016. + */ +public class TestLinkJunitWrapper extends JUnitParser { + private Map> customFields = null; + private PrintStream logger = null; + private static final Logger LOGGER = Logger.getLogger("hudson.plugins.testlink"); + + public TestLinkJunitWrapper(boolean keepLongStdio, boolean allowEmptyResults) { + super(keepLongStdio, allowEmptyResults); + } + + public TestResult parseResult(String testResultLocations, Run build, FilePath workspace, Launcher launcher, TaskListener listener) throws InterruptedException, IOException { + + logger = listener.getLogger(); + TestResult r = super.parseResult(testResultLocations, build, workspace, launcher, listener); + + /* Second parse of files to find Test Case custom field values */ + this.customFields = (Map>)workspace.act(new TestLinkJunitWrapper.ParseResultCallable(testResultLocations, logger)); + Iterator it = customFields.entrySet().iterator(); + while (it.hasNext()){ + Map.Entry pair = (Map.Entry)it.next(); + logger.println("Test Case " + pair.getKey()); + Map cfs = (Map)pair.getValue(); + Iterator itt = cfs.entrySet().iterator(); + while (itt.hasNext()) { + Map.Entry pairr = (Map.Entry)itt.next(); + logger.println("\tCustom field = " + pairr.getKey() + " value = " + pairr.getValue()); + } + } + return r; + } + + private static final class ParseResultCallable extends MasterToSlaveFileCallable>> { + private final String testResults; + private final PrintStream logger; + + private ParseResultCallable(String testResults, PrintStream logger) { + this.testResults = testResults; + this.logger = logger; + } + + public Map> invoke(File ws, VirtualChannel channel) throws IOException { + FileSet fs = Util.createFileSet(ws, this.testResults); + DirectoryScanner ds = fs.getDirectoryScanner(); + Map> customFields = new HashMap>(); + String[] files = ds.getIncludedFiles(); + if(files.length > 0) { + String[] reportFiles = ds.getIncludedFiles(); + File baseDir = ds.getBasedir(); + + int len$ = reportFiles.length; + + for(int f = 0; f < len$; ++f) { + String value = reportFiles[f]; + File reportFile = new File(baseDir, value); + + try { + this.parseCustomFields(reportFile, customFields); + } catch (org.dom4j.DocumentException e) { + throw new IOException(e); + } + } + + } + + return customFields; + } + + private void parseCustomFields (File reportFile, Map> customFields) throws org.dom4j.DocumentException { + String xmlReport = reportFile.getName(); + SAXReader saxReader = new SAXReader(); + Document result = saxReader.read(reportFile); + Element root = result.getRootElement(); + List testCases = root.elements("testcase"); + + for(Iterator stdout = testCases.iterator(); stdout.hasNext();) { + Element tc = (Element)stdout.next(); + String m = tc.attributeValue("classname"); + Map cfs = new HashMap(); + // Get other attributes and extract custom fields + List children = tc.elements(); + for (Iterator child = children.iterator(); child.hasNext();){ + // get tag and text + Element childe = (Element)child.next(); + // exclude Junit defined names like error, failure, stdin, stdout + if (childe.getName().equals("skipped") || + childe.getName().equals("error") || + childe.getName().equals("failure") || + childe.getName().equals("system-out") || + childe.getName().equals("system-err") + ) { + continue; + } + cfs.put(childe.getName(), childe.getText()); + // what should we do with these custom fields + customFields.put(m, cfs); + } + } + } + } + + public Map> getCustomFields (){ return customFields;} +} diff --git a/src/main/java/hudson/plugins/testlink/TestLinkSite.java b/src/main/java/hudson/plugins/testlink/TestLinkSite.java index 342f251..eb38b35 100644 --- a/src/main/java/hudson/plugins/testlink/TestLinkSite.java +++ b/src/main/java/hudson/plugins/testlink/TestLinkSite.java @@ -217,7 +217,7 @@ public int updateTestCase(TestCaseWrapper testCase) { null, // bug id platformId, // platform id platformName, // platform name - null, // custom fields + testCase.getCustomFieldsExecutionValues(), // custom fields null); switch(testCase.getExecutionStatus()) { diff --git a/src/main/java/hudson/plugins/testlink/result/JUnitCaseClassNameResultSeeker.java b/src/main/java/hudson/plugins/testlink/result/JUnitCaseClassNameResultSeeker.java index d5ece19..b21d963 100644 --- a/src/main/java/hudson/plugins/testlink/result/JUnitCaseClassNameResultSeeker.java +++ b/src/main/java/hudson/plugins/testlink/result/JUnitCaseClassNameResultSeeker.java @@ -27,6 +27,7 @@ import hudson.Launcher; import hudson.model.BuildListener; import hudson.model.AbstractBuild; +import hudson.plugins.testlink.TestLinkJunitWrapper; import hudson.plugins.testlink.TestLinkSite; import hudson.plugins.testlink.util.Messages; import hudson.tasks.junit.JUnitParser; @@ -63,7 +64,7 @@ public class JUnitCaseClassNameResultSeeker extends AbstractJUnitResultSeeker { /** * @param includePattern Include pattern used when looking for results * @param keyCustomField Key custom field to match against the results - * @param attachJunitXML Bit that enables attaching result file to TestLink + * @param attachJUnitXML Bit that enables attaching result file to TestLink */ @DataBoundConstructor public JUnitCaseClassNameResultSeeker(String includePattern, String keyCustomField, boolean attachJUnitXML, boolean includeNotes) { @@ -90,9 +91,11 @@ public String getDisplayName() { public void seek(TestCaseWrapper[] automatedTestCases, AbstractBuild build, Launcher launcher, BuildListener listener, TestLinkSite testlink) throws ResultSeekerException { listener.getLogger().println( Messages.Results_JUnit_LookingForTestClasses() ); // i18n try { - final JUnitParser parser = new JUnitParser(false); - final TestResult testResult = parser.parse(this.includePattern, build, launcher, listener); - + listener.getLogger().println("invoking TestLinkJunitWrapper"); + final TestLinkJunitWrapper parser = new TestLinkJunitWrapper(false, false); + final TestResult testResult = parser.parseResult(this.includePattern, build, build.getWorkspace(), launcher, listener); + final Map> customfields = parser.getCustomFields(); + for(final SuiteResult suiteResult : testResult.getSuites()) { final List caseResults = this.filter(suiteResult.getCases()); @@ -109,7 +112,11 @@ public void seek(TestCaseWrapper[] automatedTestCases, AbstractBuild build //final ExecutionStatus previousStatus = automatedTestCase.getCustomFieldAndStatus().get(value); final ExecutionStatus status = this.getExecutionStatus(caseResult); automatedTestCase.addCustomFieldAndStatus(value, status); - + Map cfs = customfields.get(caseResult.getClassName()); + if (cfs != null && cfs.size() > 0){ + automatedTestCase.setCustomFieldExecutionValue(cfs); + } + if(this.isIncludeNotes()) { final String notes = this.getJUnitNotes(caseResult, build.number); automatedTestCase.appendNotes(notes); @@ -221,3 +228,4 @@ private String getJUnitNotes( CaseResult testCase , int buildNumber) } } + diff --git a/src/main/java/hudson/plugins/testlink/result/TestCaseWrapper.java b/src/main/java/hudson/plugins/testlink/result/TestCaseWrapper.java index 70ef2a2..9856e3a 100644 --- a/src/main/java/hudson/plugins/testlink/result/TestCaseWrapper.java +++ b/src/main/java/hudson/plugins/testlink/result/TestCaseWrapper.java @@ -74,6 +74,11 @@ public class TestCaseWrapper implements Serializable { */ private TestCase testCase; + /** + * Custom Field execution values + */ + private Map customFieldsExecutionValues = null; + public TestCaseWrapper() { this(new TestCase()); } @@ -147,7 +152,7 @@ public ExecutionStatus getExecutionStatus() { /** * Calculates the new value of this wrapped test case execution status, * given a number of custom fields. - * @param numberOfCustomFields + * @param keyCustomFieldName * @return new value of this wrapped test case execution status */ public ExecutionStatus getExecutionStatus(String keyCustomFieldName) { @@ -308,4 +313,7 @@ public void setFullExternalId(String fullExternalId) { this.testCase.setFullExternalId(fullExternalId); } + public void setCustomFieldExecutionValue(Map cfs) {this.customFieldsExecutionValues = cfs;} + + public Map getCustomFieldsExecutionValues(){return this.customFieldsExecutionValues;} } diff --git a/src/test/java/hudson/plugins/testlink/TestTestLinkSite.java b/src/test/java/hudson/plugins/testlink/TestTestLinkSite.java index 3705ffb..f7a8b61 100644 --- a/src/test/java/hudson/plugins/testlink/TestTestLinkSite.java +++ b/src/test/java/hudson/plugins/testlink/TestTestLinkSite.java @@ -16,6 +16,7 @@ import static org.mockito.Mockito.when; import hudson.plugins.testlink.result.TestCaseWrapper; +import org.hamcrest.core.StringContains; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; @@ -33,6 +34,8 @@ import br.eti.kinoshita.testlinkjavaapi.model.TestPlan; import br.eti.kinoshita.testlinkjavaapi.model.TestProject; +import java.util.HashMap; + @RunWith(MockitoJUnitRunner.class) public class TestTestLinkSite { @@ -86,7 +89,7 @@ public void testUpdateTestCaseWithPassedStatus() { verify(api) .reportTCResult(3, 4, 2, status, 1, "build-name", "notes", null, null, null, "platform", - null, null); + new HashMap(), null); Report report = testLinkSite.getReport(); assertThat(report.getPassed(), is(1)); assertThat(report.getFailed(), is(0)); @@ -106,7 +109,7 @@ public void testUpdateTestCaseWithFailedStatus() { verify(api) .reportTCResult(3, 4, 2, status, 1, "build-name", "notes", null, null, null, "platform", - null, null); + new HashMap(), null); Report report = testLinkSite.getReport(); assertThat(report.getPassed(), is(0)); assertThat(report.getFailed(), is(1)); @@ -126,7 +129,7 @@ public void testUpdateTestCaseWithBlockedStatus() { verify(api) .reportTCResult(3, 4, 2, status, 1, "build-name", "notes", null, null, null, "platform", - null, null); + new HashMap(), null); Report report = testLinkSite.getReport(); assertThat(report.getPassed(), is(0)); assertThat(report.getFailed(), is(0)); From a07127266f50e1c4d45d3a10660b41c9c75df786 Mon Sep 17 00:00:00 2001 From: Mohammad Azim Khan Date: Thu, 13 Oct 2016 11:57:50 +0100 Subject: [PATCH 3/8] Pipeline steps implementation --- .gitignore | 1 + pom.xml | 7 +- .../TestLinkCreateBuildExecution.java | 95 +++++++++++++ .../pipeline/TestLinkCreateBuildStep.java | 128 +++++++++++++++++ .../TestLinkDownloadTestPlanExecution.java | 134 ++++++++++++++++++ .../TestLinkDownloadTestPlanStep.java | 80 +++++++++++ .../TestLinkUploadTestResultsExecution.java | 91 ++++++++++++ .../TestLinkUploadTestResultsStep.java | 134 ++++++++++++++++++ .../TestLinkCreateBuildStep/config.jelly | 29 ++++ .../TestLinkDownloadTestPlanStep/config.jelly | 17 +++ 10 files changed, 715 insertions(+), 1 deletion(-) create mode 100644 src/main/java/hudson/plugins/testlink/pipeline/TestLinkCreateBuildExecution.java create mode 100644 src/main/java/hudson/plugins/testlink/pipeline/TestLinkCreateBuildStep.java create mode 100644 src/main/java/hudson/plugins/testlink/pipeline/TestLinkDownloadTestPlanExecution.java create mode 100644 src/main/java/hudson/plugins/testlink/pipeline/TestLinkDownloadTestPlanStep.java create mode 100644 src/main/java/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsExecution.java create mode 100644 src/main/java/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsStep.java create mode 100644 src/main/resources/hudson/plugins/testlink/pipeline/TestLinkCreateBuildStep/config.jelly create mode 100644 src/main/resources/hudson/plugins/testlink/pipeline/TestLinkDownloadTestPlanStep/config.jelly diff --git a/.gitignore b/.gitignore index 0fb04fd..8d9883a 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ target/ inject-tests/ test-output *~ +.idea diff --git a/pom.xml b/pom.xml index a6ec475..3bd5dac 100644 --- a/pom.xml +++ b/pom.xml @@ -270,7 +270,7 @@ br.eti.kinoshita testlink-java-api - 1.9.14-0 + 1.9.14-1-SNAPSHOT org.hamcrest @@ -306,6 +306,11 @@ junit 1.11 + + org.jenkins-ci.plugins.workflow + workflow-step-api + 2.4 + diff --git a/src/main/java/hudson/plugins/testlink/pipeline/TestLinkCreateBuildExecution.java b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkCreateBuildExecution.java new file mode 100644 index 0000000..55c9f8b --- /dev/null +++ b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkCreateBuildExecution.java @@ -0,0 +1,95 @@ +package hudson.plugins.testlink.pipeline; + +import com.google.inject.Inject; +import hudson.AbortException; +import hudson.Launcher; +import hudson.console.ConsoleNote; +import hudson.model.*; +import hudson.plugins.testlink.TestLinkBuilder; +import hudson.plugins.testlink.TestLinkBuilderDescriptor; +import hudson.plugins.testlink.TestLinkInstallation; +import hudson.plugins.testlink.TestLinkSite; +import hudson.plugins.testlink.result.ResultSeeker; +import hudson.plugins.testlink.util.TestLinkHelper; +import hudson.tasks.BuildStep; +import org.apache.tools.ant.taskdefs.Parallel; +import org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution; +import org.jenkinsci.plugins.workflow.steps.StepContextParameter; + +import java.io.IOException; +import java.io.PrintStream; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by azikha01 on 11/10/2016. + */ +public class TestLinkCreateBuildExecution extends AbstractSynchronousNonBlockingStepExecution{ + + @Inject + private transient TestLinkCreateBuildStep config; + + @StepContextParameter + private transient TaskListener listener; + + @StepContextParameter + private transient Launcher launcher; + + @StepContextParameter + private transient Run build; + + @Override + protected Void run() throws Exception{ + listener.getLogger().println(config.getTestLinkName() + " \n" + + config.getTestProjectName() + " \n" + + config.getTestPlanName() + " \n" + + config.getTestPlanCustomFields() + " \n" + + config.getBuildName() + " \n" + + config.getBuildCustomFields() + " \n" + + config.getCustomFields() + " \n" + + config.getTestProjectName() + " \n" + ); + + TestLinkBuilderDescriptor DESCRIPTOR = new TestLinkBuilderDescriptor(); + final TestLinkInstallation installation = DESCRIPTOR + .getInstallationByTestLinkName(config.getTestLinkName()); + if (installation == null) { + throw new AbortException("Failed to find TestLink installation: " + config.getTestLinkName()); + } + TestLinkHelper.setTestLinkJavaAPIProperties(installation.getTestLinkJavaAPIProperties(), listener); + + final TestLinkSite testLinkSite; + final String testLinkUrl = installation.getUrl(); + final String testLinkDevKey = installation.getDevKey(); + + TestLinkBuilder builder = new TestLinkBuilder(config.getTestLinkName(), + config.getTestProjectName(), + config.getTestPlanName(), + config.getPlatformName(), + config.getBuildName(), + config.getBuildCustomFields(), + config.getCustomFields(), + config.getTestPlanCustomFields(), + false, + false, + false, + false, + new ArrayList(), + new ArrayList(), + new ArrayList(), + new ArrayList(), + false, true, false, false, new ArrayList< ResultSeeker>() + ); + builder.getTestLinkSite(testLinkUrl, + testLinkDevKey, + config.getTestProjectName(), + config.getTestPlanName(), + config.getPlatformName(), + config.getBuildName(), + config.getBuildCustomFields(), + config.getBuildNotes()); + + return null; + } +} diff --git a/src/main/java/hudson/plugins/testlink/pipeline/TestLinkCreateBuildStep.java b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkCreateBuildStep.java new file mode 100644 index 0000000..619160a --- /dev/null +++ b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkCreateBuildStep.java @@ -0,0 +1,128 @@ +package hudson.plugins.testlink.pipeline; + +import java.io.Serializable; + +import hudson.Extension; +import org.jenkinsci.plugins.workflow.steps.AbstractStepImpl; +import org.jenkinsci.plugins.workflow.steps.AbstractStepDescriptorImpl; +import org.kohsuke.stapler.DataBoundConstructor; +import org.kohsuke.stapler.DataBoundSetter; + +import static hudson.plugins.testlink.pipeline.TestLinkCreateBuildStep.DescriptorImpl.STEP_NAME; + +/** + * Created by azikha01 on 11/10/2016. + */ +public class TestLinkCreateBuildStep extends AbstractStepImpl implements Serializable { + private static final long serialVersionUID = 1L; + + /* --- Step properties --- */ + /** + * The name of the TestLink installation. + */ + @DataBoundSetter + private String testLinkName = "(Default)"; + /** + * The name of the Test Project. + */ + @DataBoundSetter + private String testProjectName = null; + /** + * The name of the Test Plan. + */ + @DataBoundSetter + private String testPlanName = null; + /** + * The name of the Build. + */ + @DataBoundSetter + private String buildName = null; + /** + * The Build custom fields. + */ + @DataBoundSetter + private String buildCustomFields = null; + /** + * The platform name. + */ + @DataBoundSetter + private String platformName = null; + /** + * Comma separated list of custom fields to download from TestLink. + */ + @DataBoundSetter + private String customFields = null; + + /** + * Comma separated list of test plan custom fields to download from TestLink. + */ + @DataBoundSetter + private String testPlanCustomFields = null; + + /** + * Build Notes + */ + @DataBoundSetter + private String buildNotes = null; + + @DataBoundConstructor + public TestLinkCreateBuildStep(){ + + } + + public String getTestLinkName(){ + return testLinkName; + } + + public String getTestProjectName(){ + return testProjectName; + } + + public String getTestPlanName(){ + return testPlanName; + } + + public String getBuildName(){ + return buildName; + } + + public String getBuildCustomFields(){ + return buildCustomFields; + } + + public String getPlatformName() { + return platformName; + } + + public String getCustomFields(){ + return customFields; + } + + public String getTestPlanCustomFields(){ + return testPlanCustomFields; + } + + public String getBuildNotes(){ + return buildNotes; + } + + @Extension + public static final class DescriptorImpl extends AbstractStepDescriptorImpl { + public static final String STEP_NAME = "testLinkCreateBuild"; + + public DescriptorImpl(){ + super(TestLinkCreateBuildExecution.class); + + } + + @Override + public String getFunctionName(){ + return STEP_NAME; + } + + @Override + public String getDisplayName(){ + return STEP_NAME; + } + } +} diff --git a/src/main/java/hudson/plugins/testlink/pipeline/TestLinkDownloadTestPlanExecution.java b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkDownloadTestPlanExecution.java new file mode 100644 index 0000000..ee86e81 --- /dev/null +++ b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkDownloadTestPlanExecution.java @@ -0,0 +1,134 @@ +package hudson.plugins.testlink.pipeline; + +import br.eti.kinoshita.testlinkjavaapi.TestLinkAPI; +import br.eti.kinoshita.testlinkjavaapi.constants.ExecutionStatus; +import br.eti.kinoshita.testlinkjavaapi.constants.ExecutionType; +import br.eti.kinoshita.testlinkjavaapi.constants.ResponseDetails; +import br.eti.kinoshita.testlinkjavaapi.constants.TestCaseDetails; +import br.eti.kinoshita.testlinkjavaapi.model.*; +import com.google.inject.Inject; +import com.thoughtworks.xstream.io.json.JsonWriter; +import hudson.AbortException; +import hudson.Launcher; +import hudson.model.Run; +import hudson.model.TaskListener; +import hudson.plugins.testlink.TestLinkBuilder; +import hudson.plugins.testlink.TestLinkBuilderDescriptor; +import hudson.plugins.testlink.TestLinkInstallation; +import hudson.plugins.testlink.TestLinkSite; +import hudson.plugins.testlink.result.ResultSeeker; +import hudson.plugins.testlink.util.TestLinkHelper; +import hudson.tasks.BuildStep; +import jdk.nashorn.internal.ir.debug.JSONWriter; +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; +import org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution; +import org.jenkinsci.plugins.workflow.steps.StepContextParameter; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.Writer; +import java.net.URL; +import java.util.ArrayList; + +/** + * Created by azikha01 on 11/10/2016. + */ +public class TestLinkDownloadTestPlanExecution extends AbstractSynchronousNonBlockingStepExecution{ + + @Inject + private transient TestLinkDownloadTestPlanStep config; + + @StepContextParameter + private transient TaskListener listener; + + @StepContextParameter + private transient Launcher launcher; + + @StepContextParameter + private transient Run build; + + @Override + protected Void run() throws Exception{ + if (!(new File(config.getTestPlanFileName())).isAbsolute()){ + throw new Exception("Test plan path not absolute: " + config.getTestPlanFileName()); + } + TestLinkBuilderDescriptor DESCRIPTOR = new TestLinkBuilderDescriptor(); + final TestLinkInstallation installation = DESCRIPTOR + .getInstallationByTestLinkName(config.getTestLinkName()); + if (installation == null) { + throw new AbortException("Failed to find TestLink installation: " + config.getTestLinkName()); + } + TestLinkHelper.setTestLinkJavaAPIProperties(installation.getTestLinkJavaAPIProperties(), listener); + + final TestLinkSite testLinkSite; + final String testLinkUrl = installation.getUrl(); + final String testLinkDevKey = installation.getDevKey(); + + final URL url = new URL(testLinkUrl); + TestLinkAPI api = new TestLinkAPI(url, testLinkDevKey); + final TestProject testProject = api.getTestProjectByName(config.getTestProjectName()); + final TestPlan testPlan = api.getTestPlanByName(config.getTestPlanName(), config.getTestProjectName()); + + String [] parts = config.getCustomFields().split(","); + String [] customFields = new String[parts.length]; + for (int i = 0; i < parts.length; i++){ + customFields[i] = parts[i].trim(); + } + + JSONObject testPlanJson = new JSONObject(); + testPlanJson.put("name", testPlan.getName()); + testPlanJson.put("id", testPlan.getId()); + testPlanJson.put("project_name", testProject.getName()); + testPlanJson.put("project_id", testProject.getId()); + + JSONArray testCasesJson = new JSONArray(); + + final TestCase[] testCases = api.getTestCasesForTestPlan( + testPlan.getId(), + null, + null, + null, + null, + null, + null, + null, // execute status + ExecutionType.AUTOMATED, + Boolean.TRUE, + TestCaseDetails.FULL); + + for( final TestCase testCase : testCases ) { + JSONObject testCaseJson = new JSONObject(); + testCaseJson.put("name", testCase.getName()); + testCaseJson.put("id", testCase.getId()); + JSONArray customFieldsJson = new JSONArray(); + + testCase.setTestProjectId(testProject.getId()); + testCase.setExecutionStatus(ExecutionStatus.NOT_RUN); + if (customFields != null) { + for(String customFieldName : customFields) { + final CustomField customField = api.getTestCaseCustomFieldDesignValue( + testCase.getId(), + null, /* testCaseExternalId */ + testCase.getVersion(), + testProject.getId(), + customFieldName, + ResponseDetails.FULL); + testCase.getCustomFields().add(customField); + JSONObject customFieldJson = new JSONObject(); + customFieldJson.put("name", customField.getName()); + customFieldJson.put("value", customField.getValue()); + customFieldsJson.add(customFieldJson); + } + testCaseJson.put("custom_fields", customFieldsJson); + } + listener.getLogger().println("Test Case: " + testCase.toString()); + testCasesJson.add(testCaseJson); + } + testPlanJson.put("test_cases", testCasesJson); + testPlanJson.write(new FileWriter(config.getTestPlanFileName())); + + return null; + } +} diff --git a/src/main/java/hudson/plugins/testlink/pipeline/TestLinkDownloadTestPlanStep.java b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkDownloadTestPlanStep.java new file mode 100644 index 0000000..4c172d7 --- /dev/null +++ b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkDownloadTestPlanStep.java @@ -0,0 +1,80 @@ +package hudson.plugins.testlink.pipeline; + +import hudson.Extension; +import org.jenkinsci.plugins.workflow.steps.AbstractStepDescriptorImpl; +import org.jenkinsci.plugins.workflow.steps.AbstractStepImpl; +import org.kohsuke.stapler.DataBoundConstructor; +import org.kohsuke.stapler.DataBoundSetter; + +import java.io.Serializable; + +/** + * Created by azikha01 on 11/10/2016. + */ +public class TestLinkDownloadTestPlanStep extends AbstractStepImpl implements Serializable { + private static final long serialVersionUID = 1L; + + /* --- Step properties --- */ + /** + * The name of the TestLink installation. + */ + @DataBoundSetter + private String testLinkName = "(Default)"; + /** + * The name of the Test Project. + */ + @DataBoundSetter + private String testProjectName = null; + /** + * The name of the Test Plan. + */ + @DataBoundSetter + private String testPlanName = null; + + @DataBoundSetter + private String customFields = null; + + @DataBoundSetter + private String testPlanFileName = null; + + @DataBoundConstructor + public TestLinkDownloadTestPlanStep(){ + + } + + public String getTestLinkName(){ + return testLinkName; + } + + public String getTestProjectName(){ + return testProjectName; + } + + public String getTestPlanName(){ + return testPlanName; + } + + public String getCustomFields(){ return customFields; } + + public String getTestPlanFileName() {return testPlanFileName; } + + @Extension + public static final class DescriptorImpl extends AbstractStepDescriptorImpl { + public static final String STEP_NAME = "testLinkDownloadTestPlan"; + + public DescriptorImpl(){ + super(TestLinkDownloadTestPlanExecution.class); + + } + + @Override + public String getFunctionName(){ + return STEP_NAME; + } + + @Override + public String getDisplayName(){ + return STEP_NAME; + } + } +} diff --git a/src/main/java/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsExecution.java b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsExecution.java new file mode 100644 index 0000000..2cd8a03 --- /dev/null +++ b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsExecution.java @@ -0,0 +1,91 @@ +package hudson.plugins.testlink.pipeline; + +import com.google.inject.Inject; +import hudson.AbortException; +import hudson.Launcher; +import hudson.model.Run; +import hudson.model.TaskListener; +import hudson.plugins.testlink.TestLinkBuilder; +import hudson.plugins.testlink.TestLinkBuilderDescriptor; +import hudson.plugins.testlink.TestLinkInstallation; +import hudson.plugins.testlink.TestLinkSite; +import hudson.plugins.testlink.result.ResultSeeker; +import hudson.plugins.testlink.util.TestLinkHelper; +import hudson.tasks.BuildStep; +import org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution; +import org.jenkinsci.plugins.workflow.steps.StepContextParameter; + +import java.util.ArrayList; + +/** + * Created by azikha01 on 11/10/2016. + */ +public class TestLinkUploadTestResultsExecution extends AbstractSynchronousNonBlockingStepExecution{ + + @Inject + private transient TestLinkUploadTestResultsStep config; + + @StepContextParameter + private transient TaskListener listener; + + @StepContextParameter + private transient Launcher launcher; + + @StepContextParameter + private transient Run build; + + @Override + protected Void run() throws Exception{ + listener.getLogger().println(config.getTestLinkName() + " \n" + + config.getTestProjectName() + " \n" + + config.getTestPlanName() + " \n" + + config.getTestPlanCustomFields() + " \n" + + config.getBuildName() + " \n" + + config.getBuildCustomFields() + " \n" + + config.getCustomFields() + " \n" + + config.getTestProjectName() + " \n" + + config.getResultsFilePath() + " \n" + ); + + TestLinkBuilderDescriptor DESCRIPTOR = new TestLinkBuilderDescriptor(); + final TestLinkInstallation installation = DESCRIPTOR + .getInstallationByTestLinkName(config.getTestLinkName()); + if (installation == null) { + throw new AbortException("Failed to find TestLink installation: " + config.getTestLinkName()); + } + TestLinkHelper.setTestLinkJavaAPIProperties(installation.getTestLinkJavaAPIProperties(), listener); + + final TestLinkSite testLinkSite; + final String testLinkUrl = installation.getUrl(); + final String testLinkDevKey = installation.getDevKey(); + + TestLinkBuilder builder = new TestLinkBuilder(config.getTestLinkName(), + config.getTestProjectName(), + config.getTestPlanName(), + config.getPlatformName(), + config.getBuildName(), + config.getBuildCustomFields(), + config.getCustomFields(), + config.getTestPlanCustomFields(), + false, + false, + false, + false, + new ArrayList(), + new ArrayList(), + new ArrayList(), + new ArrayList(), + false, true, false, false, new ArrayList< ResultSeeker>() + ); + testLinkSite = builder.getTestLinkSite(testLinkUrl, + testLinkDevKey, + config.getTestProjectName(), + config.getTestPlanName(), + config.getPlatformName(), + config.getBuildName(), + config.getBuildCustomFields(), + config.getBuildNotes()); + + return null; + } +} diff --git a/src/main/java/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsStep.java b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsStep.java new file mode 100644 index 0000000..8767ae7 --- /dev/null +++ b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsStep.java @@ -0,0 +1,134 @@ +package hudson.plugins.testlink.pipeline; + +import hudson.Extension; +import org.jenkinsci.plugins.workflow.steps.AbstractStepDescriptorImpl; +import org.jenkinsci.plugins.workflow.steps.AbstractStepImpl; +import org.kohsuke.stapler.DataBoundConstructor; +import org.kohsuke.stapler.DataBoundSetter; + +import java.io.Serializable; + +/** + * Created by azikha01 on 11/10/2016. + */ +public class TestLinkUploadTestResultsStep extends AbstractStepImpl implements Serializable { + private static final long serialVersionUID = 1L; + + /* --- Step properties --- */ + /** + * The name of the TestLink installation. + */ + @DataBoundSetter + private String testLinkName = "(Default)"; + /** + * The name of the Test Project. + */ + @DataBoundSetter + private String testProjectName = null; + /** + * The name of the Test Plan. + */ + @DataBoundSetter + private String testPlanName = null; + /** + * The name of the Build. + */ + @DataBoundSetter + private String buildName = null; + /** + * The Build custom fields. + */ + @DataBoundSetter + private String buildCustomFields = null; + /** + * The platform name. + */ + @DataBoundSetter + private String platformName = null; + /** + * Comma separated list of custom fields to download from TestLink. + */ + @DataBoundSetter + private String customFields = null; + + /** + * Comma separated list of test plan custom fields to download from TestLink. + */ + @DataBoundSetter + private String testPlanCustomFields = null; + + /** + * Build Notes + */ + @DataBoundSetter + private String buildNotes = null; + + /** + * Test results file (Junit.xml) path + */ + @DataBoundSetter + private String resultsFilePath = null; + + @DataBoundConstructor + public TestLinkUploadTestResultsStep(){ + + } + + public String getTestLinkName(){ + return testLinkName; + } + + public String getTestProjectName(){ + return testProjectName; + } + + public String getTestPlanName(){ + return testPlanName; + } + + public String getBuildName(){ + return buildName; + } + + public String getBuildCustomFields(){ + return buildCustomFields; + } + + public String getPlatformName() { + return platformName; + } + + public String getCustomFields(){ + return customFields; + } + + public String getTestPlanCustomFields(){ + return testPlanCustomFields; + } + + public String getBuildNotes(){ + return buildNotes; + } + + public String getResultsFilePath() { return resultsFilePath; } + + @Extension + public static final class DescriptorImpl extends AbstractStepDescriptorImpl { + public static final String STEP_NAME = "testLinkUploadTestResults"; + + public DescriptorImpl(){ + super(TestLinkUploadTestResultsExecution.class); + + } + + @Override + public String getFunctionName(){ + return STEP_NAME; + } + + @Override + public String getDisplayName(){ + return STEP_NAME; + } + } +} diff --git a/src/main/resources/hudson/plugins/testlink/pipeline/TestLinkCreateBuildStep/config.jelly b/src/main/resources/hudson/plugins/testlink/pipeline/TestLinkCreateBuildStep/config.jelly new file mode 100644 index 0000000..8bb4319 --- /dev/null +++ b/src/main/resources/hudson/plugins/testlink/pipeline/TestLinkCreateBuildStep/config.jelly @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/hudson/plugins/testlink/pipeline/TestLinkDownloadTestPlanStep/config.jelly b/src/main/resources/hudson/plugins/testlink/pipeline/TestLinkDownloadTestPlanStep/config.jelly new file mode 100644 index 0000000..ff9f700 --- /dev/null +++ b/src/main/resources/hudson/plugins/testlink/pipeline/TestLinkDownloadTestPlanStep/config.jelly @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + From d9f37647613994e10c3814a550e2d0a64dd80f9a Mon Sep 17 00:00:00 2001 From: Mohammad Azim Khan Date: Fri, 28 Oct 2016 11:34:27 +0100 Subject: [PATCH 4/8] Using abstract base class Run instead of AbstractBuild for usage accross GUI Builder and Pipeline step --- .../plugins/testlink/TestLinkBuilder.java | 2 +- .../testlink/TestLinkJunitWrapper.java | 8 ++- .../TestLinkCreateBuildExecution.java | 2 - .../TestLinkDownloadTestPlanExecution.java | 2 - .../TestLinkUploadTestResultsExecution.java | 49 ++++++++++++++++--- .../TestLinkUploadTestResultsStep.java | 12 ++++- .../result/AbstractJUnitResultSeeker.java | 10 ++-- .../AbstractTAPFileNameResultSeeker.java | 24 +++++---- .../result/AbstractTestNGResultSeeker.java | 9 ++-- .../JUnitCaseClassNameResultSeeker.java | 10 ++-- .../result/JUnitCaseNameResultSeeker.java | 9 ++-- .../result/JUnitMethodNameResultSeeker.java | 9 ++-- .../result/JUnitSuiteNameResultSeeker.java | 9 ++-- .../plugins/testlink/result/ResultSeeker.java | 12 ++--- ...APFileNameMultiTestPointsResultSeeker.java | 7 ++- .../result/TAPFileNameResultSeeker.java | 8 ++- .../result/TestNGClassNameResultSeeker.java | 8 +-- ...ethodNameDataProviderNameResultSeeker.java | 8 +-- .../result/TestNGMethodNameResultSeeker.java | 8 +-- .../result/TestNGSuiteNameResultSeeker.java | 8 +-- .../config.jelly | 35 +++++++++++++ .../testlink/result/ResultSeekerTestCase.java | 2 +- 22 files changed, 169 insertions(+), 82 deletions(-) create mode 100644 src/main/resources/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsStep/config.jelly diff --git a/src/main/java/hudson/plugins/testlink/TestLinkBuilder.java b/src/main/java/hudson/plugins/testlink/TestLinkBuilder.java index 879cf06..3e0fff8 100644 --- a/src/main/java/hudson/plugins/testlink/TestLinkBuilder.java +++ b/src/main/java/hudson/plugins/testlink/TestLinkBuilder.java @@ -262,7 +262,7 @@ public boolean perform(AbstractBuild build, Launcher launcher, if(getResultSeekers() != null) { for (ResultSeeker resultSeeker : getResultSeekers()) { LOGGER.log(Level.INFO, "Seeking test results. Using: " + resultSeeker.getDescriptor().getDisplayName()); - resultSeeker.seek(automatedTestCases, build, launcher, listener, testLinkSite); + resultSeeker.seek(automatedTestCases, build, build.getWorkspace(), launcher, listener, testLinkSite); } } } catch (ResultSeekerException trse) { diff --git a/src/main/java/hudson/plugins/testlink/TestLinkJunitWrapper.java b/src/main/java/hudson/plugins/testlink/TestLinkJunitWrapper.java index 8450464..223a84e 100644 --- a/src/main/java/hudson/plugins/testlink/TestLinkJunitWrapper.java +++ b/src/main/java/hudson/plugins/testlink/TestLinkJunitWrapper.java @@ -67,7 +67,7 @@ public TestResult parseResult(String testResultLocations, Run build, FileP TestResult r = super.parseResult(testResultLocations, build, workspace, launcher, listener); /* Second parse of files to find Test Case custom field values */ - this.customFields = (Map>)workspace.act(new TestLinkJunitWrapper.ParseResultCallable(testResultLocations, logger)); + this.customFields = (Map>)workspace.act(new TestLinkJunitWrapper.ParseResultCallable(testResultLocations)); Iterator it = customFields.entrySet().iterator(); while (it.hasNext()){ Map.Entry pair = (Map.Entry)it.next(); @@ -82,13 +82,11 @@ public TestResult parseResult(String testResultLocations, Run build, FileP return r; } - private static final class ParseResultCallable extends MasterToSlaveFileCallable>> { + private static class ParseResultCallable extends MasterToSlaveFileCallable>> { private final String testResults; - private final PrintStream logger; - private ParseResultCallable(String testResults, PrintStream logger) { + private ParseResultCallable(String testResults) { this.testResults = testResults; - this.logger = logger; } public Map> invoke(File ws, VirtualChannel channel) throws IOException { diff --git a/src/main/java/hudson/plugins/testlink/pipeline/TestLinkCreateBuildExecution.java b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkCreateBuildExecution.java index 55c9f8b..bf69b9c 100644 --- a/src/main/java/hudson/plugins/testlink/pipeline/TestLinkCreateBuildExecution.java +++ b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkCreateBuildExecution.java @@ -10,7 +10,6 @@ import hudson.plugins.testlink.TestLinkInstallation; import hudson.plugins.testlink.TestLinkSite; import hudson.plugins.testlink.result.ResultSeeker; -import hudson.plugins.testlink.util.TestLinkHelper; import hudson.tasks.BuildStep; import org.apache.tools.ant.taskdefs.Parallel; import org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution; @@ -57,7 +56,6 @@ protected Void run() throws Exception{ if (installation == null) { throw new AbortException("Failed to find TestLink installation: " + config.getTestLinkName()); } - TestLinkHelper.setTestLinkJavaAPIProperties(installation.getTestLinkJavaAPIProperties(), listener); final TestLinkSite testLinkSite; final String testLinkUrl = installation.getUrl(); diff --git a/src/main/java/hudson/plugins/testlink/pipeline/TestLinkDownloadTestPlanExecution.java b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkDownloadTestPlanExecution.java index ee86e81..e1ebdd1 100644 --- a/src/main/java/hudson/plugins/testlink/pipeline/TestLinkDownloadTestPlanExecution.java +++ b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkDownloadTestPlanExecution.java @@ -17,7 +17,6 @@ import hudson.plugins.testlink.TestLinkInstallation; import hudson.plugins.testlink.TestLinkSite; import hudson.plugins.testlink.result.ResultSeeker; -import hudson.plugins.testlink.util.TestLinkHelper; import hudson.tasks.BuildStep; import jdk.nashorn.internal.ir.debug.JSONWriter; import net.sf.json.JSONArray; @@ -60,7 +59,6 @@ protected Void run() throws Exception{ if (installation == null) { throw new AbortException("Failed to find TestLink installation: " + config.getTestLinkName()); } - TestLinkHelper.setTestLinkJavaAPIProperties(installation.getTestLinkJavaAPIProperties(), listener); final TestLinkSite testLinkSite; final String testLinkUrl = installation.getUrl(); diff --git a/src/main/java/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsExecution.java b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsExecution.java index 2cd8a03..c2243cd 100644 --- a/src/main/java/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsExecution.java +++ b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsExecution.java @@ -1,26 +1,30 @@ package hudson.plugins.testlink.pipeline; +import br.eti.kinoshita.testlinkjavaapi.model.TestCase; +import br.eti.kinoshita.testlinkjavaapi.util.TestLinkAPIException; import com.google.inject.Inject; import hudson.AbortException; +import hudson.FilePath; import hudson.Launcher; import hudson.model.Run; import hudson.model.TaskListener; -import hudson.plugins.testlink.TestLinkBuilder; -import hudson.plugins.testlink.TestLinkBuilderDescriptor; -import hudson.plugins.testlink.TestLinkInstallation; -import hudson.plugins.testlink.TestLinkSite; +import hudson.plugins.testlink.*; +import hudson.plugins.testlink.result.JUnitCaseClassNameResultSeeker; import hudson.plugins.testlink.result.ResultSeeker; -import hudson.plugins.testlink.util.TestLinkHelper; +import hudson.plugins.testlink.result.ResultSeekerException; +import hudson.plugins.testlink.result.TestCaseWrapper; import hudson.tasks.BuildStep; import org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution; import org.jenkinsci.plugins.workflow.steps.StepContextParameter; +import java.io.Serializable; import java.util.ArrayList; +import java.util.List; /** * Created by azikha01 on 11/10/2016. */ -public class TestLinkUploadTestResultsExecution extends AbstractSynchronousNonBlockingStepExecution{ +public class TestLinkUploadTestResultsExecution extends AbstractSynchronousNonBlockingStepExecution { @Inject private transient TestLinkUploadTestResultsStep config; @@ -34,6 +38,9 @@ public class TestLinkUploadTestResultsExecution extends AbstractSynchronousNonBl @StepContextParameter private transient Run build; + @StepContextParameter + private transient FilePath workspace; + @Override protected Void run() throws Exception{ listener.getLogger().println(config.getTestLinkName() + " \n" + @@ -44,7 +51,7 @@ protected Void run() throws Exception{ config.getBuildCustomFields() + " \n" + config.getCustomFields() + " \n" + config.getTestProjectName() + " \n" + - config.getResultsFilePath() + " \n" + config.getResultsFilePattern() + " \n" ); TestLinkBuilderDescriptor DESCRIPTOR = new TestLinkBuilderDescriptor(); @@ -53,7 +60,6 @@ protected Void run() throws Exception{ if (installation == null) { throw new AbortException("Failed to find TestLink installation: " + config.getTestLinkName()); } - TestLinkHelper.setTestLinkJavaAPIProperties(installation.getTestLinkJavaAPIProperties(), listener); final TestLinkSite testLinkSite; final String testLinkUrl = installation.getUrl(); @@ -86,6 +92,33 @@ protected Void run() throws Exception{ config.getBuildCustomFields(), config.getBuildNotes()); + ArrayList customFieldsList = new ArrayList(); + for (String cf : config.getCustomFields().split(",")){ + customFieldsList.add(cf.trim()); + } + String [] customFieldArray = new String[customFieldsList.size()]; + for (int i = 0; i < customFieldsList.size(); i++){ + customFieldArray[i] = customFieldsList.get(i); + } + TestCase[] testCases = testLinkSite.getAutomatedTestCases(customFieldArray); + List automatedTestCases = new ArrayList(); + for(TestCase testCase : testCases) { + TestCaseWrapper wrapper = new TestCaseWrapper(testCase); + automatedTestCases.add(wrapper); + } + TestCaseWrapper[] automatedTestCaseWrapper = automatedTestCases.toArray(new TestCaseWrapper[0]); + try { + ResultSeeker rs = new JUnitCaseClassNameResultSeeker(config.getResultsFilePattern(), + config.getKeyCustomField(), false, true); + rs.seek(automatedTestCaseWrapper, build, workspace, launcher, listener, testLinkSite); + } catch (ResultSeekerException trse) { + trse.printStackTrace(listener.fatalError(trse.getMessage())); + throw new AbortException(trse.getMessage()); + } catch (TestLinkAPIException tlae) { + tlae.printStackTrace(listener.fatalError(tlae.getMessage())); + throw new AbortException(tlae.getMessage()); + } + return null; } } diff --git a/src/main/java/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsStep.java b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsStep.java index 8767ae7..7ce09a3 100644 --- a/src/main/java/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsStep.java +++ b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsStep.java @@ -67,7 +67,13 @@ public class TestLinkUploadTestResultsStep extends AbstractStepImpl implements S * Test results file (Junit.xml) path */ @DataBoundSetter - private String resultsFilePath = null; + private String resultsFilePattern = null; + + /** + * Test results file (Junit.xml) path + */ + @DataBoundSetter + private String keyCustomField = null; @DataBoundConstructor public TestLinkUploadTestResultsStep(){ @@ -110,7 +116,9 @@ public String getBuildNotes(){ return buildNotes; } - public String getResultsFilePath() { return resultsFilePath; } + public String getResultsFilePattern() { return resultsFilePattern; } + + public String getKeyCustomField() { return keyCustomField; } @Extension public static final class DescriptorImpl extends AbstractStepDescriptorImpl { diff --git a/src/main/java/hudson/plugins/testlink/result/AbstractJUnitResultSeeker.java b/src/main/java/hudson/plugins/testlink/result/AbstractJUnitResultSeeker.java index 6125877..b66f114 100644 --- a/src/main/java/hudson/plugins/testlink/result/AbstractJUnitResultSeeker.java +++ b/src/main/java/hudson/plugins/testlink/result/AbstractJUnitResultSeeker.java @@ -26,6 +26,8 @@ import java.io.File; import java.io.IOException; +import hudson.FilePath; +import hudson.model.*; import org.jenkinsci.remoting.Role; import org.jenkinsci.remoting.RoleChecker; import org.jenkinsci.remoting.RoleSensitive; @@ -34,9 +36,6 @@ import br.eti.kinoshita.testlinkjavaapi.model.Attachment; import br.eti.kinoshita.testlinkjavaapi.util.TestLinkAPIException; import hudson.FilePath.FileCallable; -import hudson.model.AbstractBuild; -import hudson.model.BuildListener; -import hudson.model.Result; import hudson.plugins.testlink.TestLinkSite; import hudson.plugins.testlink.util.Messages; import hudson.remoting.VirtualChannel; @@ -78,14 +77,13 @@ public boolean isAttachJUnitXML() { return attachJUnitXML; } - protected void handleResult(TestCaseWrapper automatedTestCase, AbstractBuild build, BuildListener listener, TestLinkSite testlink, final SuiteResult suiteResult) { + protected void handleResult(TestCaseWrapper automatedTestCase, Run build, FilePath workspace, TaskListener listener, TestLinkSite testlink, final SuiteResult suiteResult) { if(automatedTestCase.getExecutionStatus(this.keyCustomField) != ExecutionStatus.NOT_RUN) { try { - listener.getLogger().println( Messages.TestLinkBuilder_Update_AutomatedTestCases() ); final int executionId = testlink.updateTestCase(automatedTestCase); if(executionId > 0 && this.isAttachJUnitXML()) { - Attachment attachment = build.getWorkspace().act( new FileCallable() { + Attachment attachment = workspace.act( new FileCallable() { private static final long serialVersionUID = -5411683541842375558L; diff --git a/src/main/java/hudson/plugins/testlink/result/AbstractTAPFileNameResultSeeker.java b/src/main/java/hudson/plugins/testlink/result/AbstractTAPFileNameResultSeeker.java index 07d903d..a55c652 100644 --- a/src/main/java/hudson/plugins/testlink/result/AbstractTAPFileNameResultSeeker.java +++ b/src/main/java/hudson/plugins/testlink/result/AbstractTAPFileNameResultSeeker.java @@ -11,6 +11,7 @@ import java.util.Map.Entry; import java.util.Set; +import hudson.model.*; import org.jenkinsci.remoting.Role; import org.jenkinsci.remoting.RoleChecker; import org.jenkinsci.remoting.RoleSensitive; @@ -30,9 +31,6 @@ import hudson.FilePath; import hudson.FilePath.FileCallable; import hudson.Launcher; -import hudson.model.AbstractBuild; -import hudson.model.BuildListener; -import hudson.model.Result; import hudson.plugins.testlink.TestLinkSite; import hudson.remoting.VirtualChannel; @@ -104,11 +102,11 @@ public void setCompareFullPath(Boolean compareFullPath) { * hudson.plugins.testlink.result.Report) */ @Override - public void seek(final TestCaseWrapper[] automatedTestCases, AbstractBuild build, Launcher launcher, - final BuildListener listener, TestLinkSite testlink) throws ResultSeekerException { + public void seek(final TestCaseWrapper[] automatedTestCases, Run build, FilePath workspace, Launcher launcher, + final TaskListener listener, TestLinkSite testlink) throws ResultSeekerException { try { - final Map testSets = build.getWorkspace().act( + final Map testSets = workspace.act( new FilePath.FileCallable>() { private static final long serialVersionUID = 1L; @@ -154,7 +152,7 @@ public void checkRoles(RoleChecker roleChecker) throws SecurityException { tapFileNameWithoutExtension.lastIndexOf('.')); } if (tapFileNameWithoutExtension.equals(value)) { - this.updateTestCase(testSets, key, automatedTestCase, value, build, listener, testlink); + this.updateTestCase(testSets, key, automatedTestCase, value, build, workspace, listener, testlink); } } } @@ -167,7 +165,7 @@ public void checkRoles(RoleChecker roleChecker) throws SecurityException { } protected void updateTestCase(Map testSets, String key, TestCaseWrapper automatedTestCase, - String value, AbstractBuild build, BuildListener listener, TestLinkSite testlink) { + String value, Run build, FilePath workspace, TaskListener listener, TestLinkSite testlink) { final ExecutionStatus status = this.getExecutionStatus(testSets.get(key)); automatedTestCase.addCustomFieldAndStatus(value, status); @@ -176,11 +174,11 @@ protected void updateTestCase(Map testSets, String key, TestCas automatedTestCase.appendNotes(notes); } - this.handleResult(automatedTestCase, build, listener, testlink, status, testSets, key); + this.handleResult(automatedTestCase, build, workspace, listener, testlink, status, testSets, key); } - protected void handleResult(TestCaseWrapper automatedTestCase, final AbstractBuild build, - BuildListener listener, TestLinkSite testlink, ExecutionStatus status, final Map testSets, + protected void handleResult(TestCaseWrapper automatedTestCase, final Run build, FilePath workspace, + TaskListener listener, TestLinkSite testlink, ExecutionStatus status, final Map testSets, final String key) { if (automatedTestCase.getExecutionStatus(this.keyCustomField) != ExecutionStatus.NOT_RUN) { String platform = this.retrievePlatform(testSets.get(key)); @@ -190,8 +188,8 @@ protected void handleResult(TestCaseWrapper automatedTestCase, final AbstractBui final int executionId = testlink.updateTestCase(automatedTestCase); if (executionId > 0 && this.isAttachTAPStream()) { - final String remoteWs = build.getWorkspace().getRemote(); - List attachments = build.getWorkspace().act(new FileCallable>() { + final String remoteWs = workspace.getRemote(); + List attachments = workspace.act(new FileCallable>() { private static final long serialVersionUID = -5411683541842375558L; diff --git a/src/main/java/hudson/plugins/testlink/result/AbstractTestNGResultSeeker.java b/src/main/java/hudson/plugins/testlink/result/AbstractTestNGResultSeeker.java index e95afb9..6adebb7 100644 --- a/src/main/java/hudson/plugins/testlink/result/AbstractTestNGResultSeeker.java +++ b/src/main/java/hudson/plugins/testlink/result/AbstractTestNGResultSeeker.java @@ -23,10 +23,9 @@ */ package hudson.plugins.testlink.result; +import hudson.FilePath; import hudson.FilePath.FileCallable; -import hudson.model.BuildListener; -import hudson.model.Result; -import hudson.model.AbstractBuild; +import hudson.model.*; import hudson.plugins.testlink.TestLinkSite; import hudson.remoting.VirtualChannel; @@ -86,13 +85,13 @@ public boolean isMarkSkippedTestAsBlocked() { return markSkippedTestAsBlocked; } - protected void handleResult(TestCaseWrapper automatedTestCase, AbstractBuild build, BuildListener listener, TestLinkSite testlink, ExecutionStatus status, final Suite suiteResult) { + protected void handleResult(TestCaseWrapper automatedTestCase, Run build, FilePath workspace, TaskListener listener, TestLinkSite testlink, ExecutionStatus status, final Suite suiteResult) { if(automatedTestCase.getExecutionStatus(this.keyCustomField) != ExecutionStatus.NOT_RUN) { try { final int executionId = testlink.updateTestCase(automatedTestCase); if(executionId > 0 && this.isAttachTestNGXML()) { - Attachment attachment = build.getWorkspace().act( new FileCallable() { + Attachment attachment = workspace.act( new FileCallable() { private static final long serialVersionUID = -5411683541842375558L; diff --git a/src/main/java/hudson/plugins/testlink/result/JUnitCaseClassNameResultSeeker.java b/src/main/java/hudson/plugins/testlink/result/JUnitCaseClassNameResultSeeker.java index b21d963..fb258f6 100644 --- a/src/main/java/hudson/plugins/testlink/result/JUnitCaseClassNameResultSeeker.java +++ b/src/main/java/hudson/plugins/testlink/result/JUnitCaseClassNameResultSeeker.java @@ -24,9 +24,12 @@ package hudson.plugins.testlink.result; import hudson.Extension; +import hudson.FilePath; import hudson.Launcher; import hudson.model.BuildListener; import hudson.model.AbstractBuild; +import hudson.model.Run; +import hudson.model.TaskListener; import hudson.plugins.testlink.TestLinkJunitWrapper; import hudson.plugins.testlink.TestLinkSite; import hudson.plugins.testlink.util.Messages; @@ -88,12 +91,11 @@ public String getDisplayName() { * @see hudson.plugins.testlink.result.ResultSeeker#seekAndUpdate(hudson.plugins.testlink.result.TestCaseWrapper[], hudson.model.AbstractBuild, hudson.Launcher, hudson.model.BuildListener, hudson.plugins.testlink.TestLinkSite, hudson.plugins.testlink.result.Report) */ @Override - public void seek(TestCaseWrapper[] automatedTestCases, AbstractBuild build, Launcher launcher, BuildListener listener, TestLinkSite testlink) throws ResultSeekerException { + public void seek(TestCaseWrapper[] automatedTestCases, Run build, FilePath workspace, Launcher launcher, TaskListener listener, TestLinkSite testlink) throws ResultSeekerException { listener.getLogger().println( Messages.Results_JUnit_LookingForTestClasses() ); // i18n try { - listener.getLogger().println("invoking TestLinkJunitWrapper"); final TestLinkJunitWrapper parser = new TestLinkJunitWrapper(false, false); - final TestResult testResult = parser.parseResult(this.includePattern, build, build.getWorkspace(), launcher, listener); + final TestResult testResult = parser.parseResult(this.includePattern, build, workspace, launcher, listener); final Map> customfields = parser.getCustomFields(); for(final SuiteResult suiteResult : testResult.getSuites()) { @@ -129,7 +131,7 @@ public void seek(TestCaseWrapper[] automatedTestCases, AbstractBuild build // Here we update testlink with our findings for(Map.Entry entry : classNameTestCase.entrySet()) { - super.handleResult(entry.getValue(), build, listener, testlink, suiteResult); + super.handleResult(entry.getValue(), build, workspace, listener, testlink, suiteResult); } } diff --git a/src/main/java/hudson/plugins/testlink/result/JUnitCaseNameResultSeeker.java b/src/main/java/hudson/plugins/testlink/result/JUnitCaseNameResultSeeker.java index c00abd1..a8a548d 100644 --- a/src/main/java/hudson/plugins/testlink/result/JUnitCaseNameResultSeeker.java +++ b/src/main/java/hudson/plugins/testlink/result/JUnitCaseNameResultSeeker.java @@ -24,9 +24,12 @@ package hudson.plugins.testlink.result; import hudson.Extension; +import hudson.FilePath; import hudson.Launcher; import hudson.model.BuildListener; import hudson.model.AbstractBuild; +import hudson.model.Run; +import hudson.model.TaskListener; import hudson.plugins.testlink.TestLinkSite; import hudson.plugins.testlink.util.Messages; import hudson.tasks.junit.JUnitParser; @@ -81,11 +84,11 @@ public String getDisplayName() { * @see hudson.plugins.testlink.result.ResultSeeker#seekAndUpdate(hudson.plugins.testlink.result.TestCaseWrapper[], hudson.model.AbstractBuild, hudson.Launcher, hudson.model.BuildListener, hudson.plugins.testlink.TestLinkSite, hudson.plugins.testlink.result.Report) */ @Override - public void seek(TestCaseWrapper[] automatedTestCases, AbstractBuild build, Launcher launcher, BuildListener listener, TestLinkSite testlink) throws ResultSeekerException { + public void seek(TestCaseWrapper[] automatedTestCases, Run build, FilePath workspace, Launcher launcher, TaskListener listener, TestLinkSite testlink) throws ResultSeekerException { listener.getLogger().println( Messages.Results_JUnit_LookingForTestCases() ); // i18n try { final JUnitParser parser = new JUnitParser(false); - final TestResult testResult = parser.parse(this.includePattern, build, launcher, listener); + final TestResult testResult = parser.parseResult(this.includePattern, build, workspace, launcher, listener); for(SuiteResult suiteResult : testResult.getSuites()) { for(CaseResult caseResult : suiteResult.getCases()) { @@ -100,7 +103,7 @@ public void seek(TestCaseWrapper[] automatedTestCases, AbstractBuild build final String notes = this.getJUnitNotes(caseResult, build.number); automatedTestCase.appendNotes(notes); } - super.handleResult(automatedTestCase, build, listener, testlink, suiteResult); + super.handleResult(automatedTestCase, build, workspace, listener, testlink, suiteResult); } } } diff --git a/src/main/java/hudson/plugins/testlink/result/JUnitMethodNameResultSeeker.java b/src/main/java/hudson/plugins/testlink/result/JUnitMethodNameResultSeeker.java index feca1f0..c550dbb 100644 --- a/src/main/java/hudson/plugins/testlink/result/JUnitMethodNameResultSeeker.java +++ b/src/main/java/hudson/plugins/testlink/result/JUnitMethodNameResultSeeker.java @@ -24,9 +24,12 @@ package hudson.plugins.testlink.result; import hudson.Extension; +import hudson.FilePath; import hudson.Launcher; import hudson.model.BuildListener; import hudson.model.AbstractBuild; +import hudson.model.Run; +import hudson.model.TaskListener; import hudson.plugins.testlink.TestLinkSite; import hudson.plugins.testlink.util.Messages; import hudson.tasks.junit.JUnitParser; @@ -82,11 +85,11 @@ public String getDisplayName() { * @see hudson.plugins.testlink.result.ResultSeeker#seekAndUpdate(hudson.plugins.testlink.result.TestCaseWrapper[], hudson.model.AbstractBuild, hudson.Launcher, hudson.model.BuildListener, hudson.plugins.testlink.TestLinkSite, hudson.plugins.testlink.result.Report) */ @Override - public void seek(TestCaseWrapper[] automatedTestCases, AbstractBuild build, Launcher launcher, BuildListener listener, TestLinkSite testlink) throws ResultSeekerException { + public void seek(TestCaseWrapper[] automatedTestCases, Run build, FilePath workspace, Launcher launcher, TaskListener listener, TestLinkSite testlink) throws ResultSeekerException { listener.getLogger().println( Messages.Results_JUnit_LookingForTestMethods() ); // i18n try { final JUnitParser parser = new JUnitParser(false); - final TestResult testResult = parser.parse(this.includePattern, build, launcher, listener); + final TestResult testResult = parser.parseResult(this.includePattern, build, workspace, launcher, listener); for(final SuiteResult suiteResult : testResult.getSuites()) { for(CaseResult caseResult : suiteResult.getCases()) { @@ -102,7 +105,7 @@ public void seek(TestCaseWrapper[] automatedTestCases, AbstractBuild build final String notes = this.getJUnitNotes(caseResult, build.number); automatedTestCase.appendNotes(notes); } - super.handleResult(automatedTestCase, build, listener, testlink, suiteResult); + super.handleResult(automatedTestCase, build, workspace, listener, testlink, suiteResult); } } } diff --git a/src/main/java/hudson/plugins/testlink/result/JUnitSuiteNameResultSeeker.java b/src/main/java/hudson/plugins/testlink/result/JUnitSuiteNameResultSeeker.java index 9937f72..d32367b 100644 --- a/src/main/java/hudson/plugins/testlink/result/JUnitSuiteNameResultSeeker.java +++ b/src/main/java/hudson/plugins/testlink/result/JUnitSuiteNameResultSeeker.java @@ -24,9 +24,12 @@ package hudson.plugins.testlink.result; import hudson.Extension; +import hudson.FilePath; import hudson.Launcher; import hudson.model.BuildListener; import hudson.model.AbstractBuild; +import hudson.model.Run; +import hudson.model.TaskListener; import hudson.plugins.testlink.TestLinkSite; import hudson.plugins.testlink.util.Messages; import hudson.tasks.junit.JUnitParser; @@ -85,11 +88,11 @@ public String getDisplayName() { * hudson.plugins.testlink.result.Report) */ @Override - public void seek(TestCaseWrapper[] automatedTestCases,AbstractBuild build, Launcher launcher, BuildListener listener, TestLinkSite testlink) throws ResultSeekerException { + public void seek(TestCaseWrapper[] automatedTestCases, Run build, FilePath workspace, Launcher launcher, TaskListener listener, TestLinkSite testlink) throws ResultSeekerException { listener.getLogger().println( Messages.Results_JUnit_LookingForTestSuites() ); try { final JUnitParser parser = new JUnitParser(false); - final TestResult testResult = parser.parse(this.includePattern, build, launcher, listener); + final TestResult testResult = parser.parseResult(this.includePattern, build, workspace, launcher, listener); for(SuiteResult suiteResult : testResult.getSuites()) { for(TestCaseWrapper automatedTestCase : automatedTestCases) { @@ -104,7 +107,7 @@ public void seek(TestCaseWrapper[] automatedTestCases,AbstractBuild build, automatedTestCase.appendNotes(notes); } - super.handleResult(automatedTestCase, build, listener, testlink, suiteResult); + super.handleResult(automatedTestCase, build, workspace, listener, testlink, suiteResult); } } } diff --git a/src/main/java/hudson/plugins/testlink/result/ResultSeeker.java b/src/main/java/hudson/plugins/testlink/result/ResultSeeker.java index 79d8262..ee6dde0 100644 --- a/src/main/java/hudson/plugins/testlink/result/ResultSeeker.java +++ b/src/main/java/hudson/plugins/testlink/result/ResultSeeker.java @@ -24,14 +24,10 @@ package hudson.plugins.testlink.result; import hudson.DescriptorExtensionList; +import hudson.FilePath; import hudson.Launcher; import hudson.Util; -import hudson.model.BuildListener; -import hudson.model.Describable; -import hudson.model.AbstractBuild; -import hudson.model.Descriptor; -import hudson.model.Hudson; -import hudson.model.Node; +import hudson.model.*; import hudson.plugins.testlink.TestLinkSite; import java.io.File; @@ -144,7 +140,7 @@ public static DescriptorExtensionList> al * @param testlink TestLink site for updating test status * @throws ResultSeekerException */ - public abstract void seek(TestCaseWrapper[] automatedTestCases, AbstractBuild build, Launcher launcher, BuildListener listener, TestLinkSite testlink) throws ResultSeekerException; + public abstract void seek(TestCaseWrapper[] automatedTestCases, Run build, FilePath workspace, Launcher launcher, TaskListener listener, TestLinkSite testlink) throws ResultSeekerException; /** * Retrieves the file content encoded in Base64. @@ -172,7 +168,7 @@ protected String getBase64FileContent(File file) throws IOException { * pattern in the directory. * @throws IOException */ - protected String[] scan(final File directory, final String includes, final BuildListener listener) throws IOException { + protected String[] scan(final File directory, final String includes, final TaskListener listener) throws IOException { String[] fileNames = new String[0]; if (StringUtils.isNotBlank(includes)) { diff --git a/src/main/java/hudson/plugins/testlink/result/TAPFileNameMultiTestPointsResultSeeker.java b/src/main/java/hudson/plugins/testlink/result/TAPFileNameMultiTestPointsResultSeeker.java index 71eb42e..e0c75ef 100644 --- a/src/main/java/hudson/plugins/testlink/result/TAPFileNameMultiTestPointsResultSeeker.java +++ b/src/main/java/hudson/plugins/testlink/result/TAPFileNameMultiTestPointsResultSeeker.java @@ -24,8 +24,11 @@ package hudson.plugins.testlink.result; import hudson.Extension; +import hudson.FilePath; import hudson.model.BuildListener; import hudson.model.AbstractBuild; +import hudson.model.Run; +import hudson.model.TaskListener; import hudson.plugins.testlink.TestLinkSite; import java.util.Map; @@ -73,7 +76,7 @@ public String getDisplayName() { @Override protected void updateTestCase(Map testSets, String key, TestCaseWrapper automatedTestCase, - String value, AbstractBuild build, BuildListener listener, TestLinkSite testlink) { + String value, Run build, FilePath workspace, TaskListener listener, TestLinkSite testlink) { final TestSet testSet = testSets.get(key); int executionNumbers = testSet.getNumberOfTestResults(); for (Integer i = 1; i <= executionNumbers; i++) { @@ -93,7 +96,7 @@ protected void updateTestCase(Map testSets, String key, TestCas automatedTestCase.appendNotes(notes); } - this.handleResult(automatedTestCase, build, listener, testlink, status, testSets, key); + this.handleResult(automatedTestCase, build, workspace, listener, testlink, status, testSets, key); } } } diff --git a/src/main/java/hudson/plugins/testlink/result/TAPFileNameResultSeeker.java b/src/main/java/hudson/plugins/testlink/result/TAPFileNameResultSeeker.java index 89a8065..0e44d57 100644 --- a/src/main/java/hudson/plugins/testlink/result/TAPFileNameResultSeeker.java +++ b/src/main/java/hudson/plugins/testlink/result/TAPFileNameResultSeeker.java @@ -24,12 +24,16 @@ package hudson.plugins.testlink.result; import hudson.Extension; +import hudson.FilePath; import hudson.Launcher; import hudson.model.BuildListener; import hudson.model.AbstractBuild; +import hudson.model.Run; +import hudson.model.TaskListener; import hudson.plugins.testlink.TestLinkSite; import org.kohsuke.stapler.DataBoundConstructor; +import org.kohsuke.stapler.Facet; /** *

Seeks for test results matching each TAP file name with the key @@ -63,7 +67,7 @@ public String getDisplayName() { } @Override - public void seek(final TestCaseWrapper[] automatedTestCases, AbstractBuild build, Launcher launcher, final BuildListener listener, TestLinkSite testlink) throws ResultSeekerException { - super.seek(automatedTestCases, build, launcher, listener, testlink); + public void seek(final TestCaseWrapper[] automatedTestCases, Run build, FilePath workspace, Launcher launcher, final TaskListener listener, TestLinkSite testlink) throws ResultSeekerException { + super.seek(automatedTestCases, build, workspace, launcher, listener, testlink); } } \ No newline at end of file diff --git a/src/main/java/hudson/plugins/testlink/result/TestNGClassNameResultSeeker.java b/src/main/java/hudson/plugins/testlink/result/TestNGClassNameResultSeeker.java index 5e39cc3..da9e180 100644 --- a/src/main/java/hudson/plugins/testlink/result/TestNGClassNameResultSeeker.java +++ b/src/main/java/hudson/plugins/testlink/result/TestNGClassNameResultSeeker.java @@ -28,6 +28,8 @@ import java.util.ArrayList; import java.util.List; +import hudson.model.Run; +import hudson.model.TaskListener; import org.apache.commons.lang.StringUtils; import org.jenkinsci.remoting.Role; import org.jenkinsci.remoting.RoleChecker; @@ -89,10 +91,10 @@ public String getDisplayName() { * @see hudson.plugins.testlink.result.ResultSeeker#seekAndUpdate(hudson.plugins.testlink.result.TestCaseWrapper[], hudson.model.AbstractBuild, hudson.Launcher, hudson.model.BuildListener, hudson.plugins.testlink.TestLinkSite, hudson.plugins.testlink.result.Report) */ @Override - public void seek(TestCaseWrapper[] automatedTestCases, AbstractBuild build, Launcher launcher, final BuildListener listener, TestLinkSite testlink) throws ResultSeekerException { + public void seek(TestCaseWrapper[] automatedTestCases, Run build, FilePath workspace, Launcher launcher, final TaskListener listener, TestLinkSite testlink) throws ResultSeekerException { listener.getLogger().println( Messages.Results_TestNG_LookingForTestSuites() ); try { - final List suites = build.getWorkspace().act(new FilePath.FileCallable>() { + final List suites = workspace.act(new FilePath.FileCallable>() { private static final long serialVersionUID = 1L; private List suites = new ArrayList(); @@ -132,7 +134,7 @@ public void checkRoles(RoleChecker roleChecker) throws SecurityException { automatedTestCase.appendNotes(notes); } - super.handleResult(automatedTestCase, build, listener, testlink, status, suite); + super.handleResult(automatedTestCase, build, workspace, listener, testlink, status, suite); } } } diff --git a/src/main/java/hudson/plugins/testlink/result/TestNGMethodNameDataProviderNameResultSeeker.java b/src/main/java/hudson/plugins/testlink/result/TestNGMethodNameDataProviderNameResultSeeker.java index 9852329..a8c4e65 100644 --- a/src/main/java/hudson/plugins/testlink/result/TestNGMethodNameDataProviderNameResultSeeker.java +++ b/src/main/java/hudson/plugins/testlink/result/TestNGMethodNameDataProviderNameResultSeeker.java @@ -28,6 +28,8 @@ import java.util.ArrayList; import java.util.List; +import hudson.model.Run; +import hudson.model.TaskListener; import org.apache.commons.lang.StringUtils; import org.jenkinsci.remoting.Role; import org.jenkinsci.remoting.RoleChecker; @@ -109,10 +111,10 @@ public String getDisplayName() { * @see hudson.plugins.testlink.result.ResultSeeker#seekAndUpdate(hudson.plugins.testlink.result.TestCaseWrapper[], hudson.model.AbstractBuild, hudson.Launcher, hudson.model.BuildListener, hudson.plugins.testlink.TestLinkSite, hudson.plugins.testlink.result.Report) */ @Override - public void seek(TestCaseWrapper[] automatedTestCases, AbstractBuild build, Launcher launcher, final BuildListener listener, TestLinkSite testlink) throws ResultSeekerException { + public void seek(TestCaseWrapper[] automatedTestCases, Run build, FilePath workspace, Launcher launcher, final TaskListener listener, TestLinkSite testlink) throws ResultSeekerException { listener.getLogger().println( Messages.Results_TestNG_LookingForTestMethodDataProvider() ); try { - final List suites = build.getWorkspace().act(new FilePath.FileCallable>() { + final List suites = workspace.act(new FilePath.FileCallable>() { private static final long serialVersionUID = 1L; private List suites = new ArrayList(); @@ -156,7 +158,7 @@ public void checkRoles(RoleChecker roleChecker) throws SecurityException { automatedTestCase.appendNotes(notes); } - this.handleResult(automatedTestCase, build, listener, testlink, status, suite); + this.handleResult(automatedTestCase, build, workspace, listener, testlink, status, suite); } } } diff --git a/src/main/java/hudson/plugins/testlink/result/TestNGMethodNameResultSeeker.java b/src/main/java/hudson/plugins/testlink/result/TestNGMethodNameResultSeeker.java index c05d0c4..175f8a1 100644 --- a/src/main/java/hudson/plugins/testlink/result/TestNGMethodNameResultSeeker.java +++ b/src/main/java/hudson/plugins/testlink/result/TestNGMethodNameResultSeeker.java @@ -28,6 +28,8 @@ import java.util.ArrayList; import java.util.List; +import hudson.model.Run; +import hudson.model.TaskListener; import org.apache.commons.lang.StringUtils; import org.jenkinsci.remoting.Role; import org.jenkinsci.remoting.RoleChecker; @@ -92,10 +94,10 @@ public String getDisplayName() { * @see hudson.plugins.testlink.result.ResultSeeker#seekAndUpdate(hudson.plugins.testlink.result.TestCaseWrapper[], hudson.model.AbstractBuild, hudson.Launcher, hudson.model.BuildListener, hudson.plugins.testlink.TestLinkSite, hudson.plugins.testlink.result.Report) */ @Override - public void seek(TestCaseWrapper[] automatedTestCases, AbstractBuild build, Launcher launcher, final BuildListener listener, TestLinkSite testlink) throws ResultSeekerException { + public void seek(TestCaseWrapper[] automatedTestCases, Run build, FilePath workspace, Launcher launcher, final TaskListener listener, TestLinkSite testlink) throws ResultSeekerException { listener.getLogger().println( Messages.Results_TestNG_LookingForTestMethod() ); try { - final List suites = build.getWorkspace().act(new FilePath.FileCallable>() { + final List suites = workspace.act(new FilePath.FileCallable>() { private static final long serialVersionUID = 1L; private List suites = new ArrayList(); @@ -137,7 +139,7 @@ public void checkRoles(RoleChecker roleChecker) throws SecurityException { automatedTestCase.appendNotes(notes); } - super.handleResult(automatedTestCase, build, listener, testlink, status, suite); + super.handleResult(automatedTestCase, build, workspace, listener, testlink, status, suite); } } } diff --git a/src/main/java/hudson/plugins/testlink/result/TestNGSuiteNameResultSeeker.java b/src/main/java/hudson/plugins/testlink/result/TestNGSuiteNameResultSeeker.java index b746b28..c2d9733 100644 --- a/src/main/java/hudson/plugins/testlink/result/TestNGSuiteNameResultSeeker.java +++ b/src/main/java/hudson/plugins/testlink/result/TestNGSuiteNameResultSeeker.java @@ -28,6 +28,8 @@ import java.util.ArrayList; import java.util.List; +import hudson.model.Run; +import hudson.model.TaskListener; import org.jenkinsci.remoting.Role; import org.jenkinsci.remoting.RoleChecker; import org.jenkinsci.remoting.RoleSensitive; @@ -91,10 +93,10 @@ public String getDisplayName() { * @see hudson.plugins.testlink.result.ResultSeeker#seekAndUpdate(hudson.plugins.testlink.result.TestCaseWrapper[], hudson.model.AbstractBuild, hudson.Launcher, hudson.model.BuildListener, hudson.plugins.testlink.TestLinkSite, hudson.plugins.testlink.result.Report) */ @Override - public void seek(TestCaseWrapper[] automatedTestCases, AbstractBuild build, Launcher launcher, final BuildListener listener, TestLinkSite testlink) throws ResultSeekerException { + public void seek(TestCaseWrapper[] automatedTestCases, Run build, FilePath workspace, Launcher launcher, final TaskListener listener, TestLinkSite testlink) throws ResultSeekerException { listener.getLogger().println( Messages.Results_TestNG_LookingForTestSuites() ); try { - final List suites = build.getWorkspace().act(new FilePath.FileCallable>() { + final List suites = workspace.act(new FilePath.FileCallable>() { private static final long serialVersionUID = 1L; private List suites = new ArrayList(); @@ -132,7 +134,7 @@ public void checkRoles(RoleChecker roleChecker) throws SecurityException { automatedTestCase.appendNotes(notes); } - super.handleResult(automatedTestCase, build, listener, testlink, status, suite); + super.handleResult(automatedTestCase, build, workspace, listener, testlink, status, suite); } } } diff --git a/src/main/resources/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsStep/config.jelly b/src/main/resources/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsStep/config.jelly new file mode 100644 index 0000000..7b37a83 --- /dev/null +++ b/src/main/resources/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsStep/config.jelly @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/java/hudson/plugins/testlink/result/ResultSeekerTestCase.java b/src/test/java/hudson/plugins/testlink/result/ResultSeekerTestCase.java index 10a3e17..eda5e2a 100644 --- a/src/test/java/hudson/plugins/testlink/result/ResultSeekerTestCase.java +++ b/src/test/java/hudson/plugins/testlink/result/ResultSeekerTestCase.java @@ -137,7 +137,7 @@ public boolean perform(AbstractBuild build, Launcher launcher, traverseDirectory(f); } - seeker.seek(tcs, build, launcher, listener, testlink); + seeker.seek(tcs, build, build.getWorkspace(), launcher, listener, testlink); return (seeker != null); } private static void traverseDirectory(FilePath f) throws InterruptedException, IOException { From f52318cdefd36bd3c0a8b1feb5befc295c9e8fcd Mon Sep 17 00:00:00 2001 From: Mohammad Azim Khan Date: Fri, 4 Nov 2016 07:19:53 +0000 Subject: [PATCH 5/8] Changed pipeline-workflow-api version to match Pipeline version in Jenkins --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3bd5dac..6df44ed 100644 --- a/pom.xml +++ b/pom.xml @@ -309,7 +309,7 @@ org.jenkins-ci.plugins.workflow workflow-step-api - 2.4 + 2.1 From 9db04df2725a8c21fc0b66c4f16d1fedd71fc29b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20F=C3=BCrbacher?= Date: Mon, 8 Jul 2019 08:17:21 +0200 Subject: [PATCH 6/8] Add escape-by-default to pipeline jelly files --- .../testlink/pipeline/TestLinkCreateBuildStep/config.jelly | 1 + .../testlink/pipeline/TestLinkDownloadTestPlanStep/config.jelly | 1 + .../testlink/pipeline/TestLinkUploadTestResultsStep/config.jelly | 1 + 3 files changed, 3 insertions(+) diff --git a/src/main/resources/hudson/plugins/testlink/pipeline/TestLinkCreateBuildStep/config.jelly b/src/main/resources/hudson/plugins/testlink/pipeline/TestLinkCreateBuildStep/config.jelly index 8bb4319..03c409a 100644 --- a/src/main/resources/hudson/plugins/testlink/pipeline/TestLinkCreateBuildStep/config.jelly +++ b/src/main/resources/hudson/plugins/testlink/pipeline/TestLinkCreateBuildStep/config.jelly @@ -1,3 +1,4 @@ + diff --git a/src/main/resources/hudson/plugins/testlink/pipeline/TestLinkDownloadTestPlanStep/config.jelly b/src/main/resources/hudson/plugins/testlink/pipeline/TestLinkDownloadTestPlanStep/config.jelly index ff9f700..d3fff3c 100644 --- a/src/main/resources/hudson/plugins/testlink/pipeline/TestLinkDownloadTestPlanStep/config.jelly +++ b/src/main/resources/hudson/plugins/testlink/pipeline/TestLinkDownloadTestPlanStep/config.jelly @@ -1,3 +1,4 @@ + diff --git a/src/main/resources/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsStep/config.jelly b/src/main/resources/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsStep/config.jelly index 7b37a83..53c7d54 100644 --- a/src/main/resources/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsStep/config.jelly +++ b/src/main/resources/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsStep/config.jelly @@ -1,3 +1,4 @@ + From 3c4c25bbc391fbedbbc8277aabf8593d83a9f780 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20F=C3=BCrbacher?= Date: Mon, 8 Jul 2019 08:25:30 +0200 Subject: [PATCH 7/8] Remove unused imports. --- .../java/hudson/plugins/testlink/TestLinkBuildAction.java | 1 - .../hudson/plugins/testlink/TestLinkJunitWrapper.java | 2 -- .../testlink/pipeline/TestLinkCreateBuildExecution.java | 6 ------ .../testlink/pipeline/TestLinkCreateBuildStep.java | 2 -- .../pipeline/TestLinkDownloadTestPlanExecution.java | 8 -------- .../pipeline/TestLinkUploadTestResultsExecution.java | 1 - .../testlink/result/AbstractJUnitResultSeeker.java | 1 - .../testlink/result/AbstractTestNGResultSeeker.java | 3 --- .../testlink/result/JUnitCaseClassNameResultSeeker.java | 3 --- .../testlink/result/JUnitCaseNameResultSeeker.java | 2 -- .../testlink/result/JUnitMethodNameResultSeeker.java | 2 -- .../testlink/result/JUnitSuiteNameResultSeeker.java | 2 -- .../result/TAPFileNameMultiTestPointsResultSeeker.java | 2 -- .../plugins/testlink/result/TAPFileNameResultSeeker.java | 3 --- 14 files changed, 38 deletions(-) diff --git a/src/main/java/hudson/plugins/testlink/TestLinkBuildAction.java b/src/main/java/hudson/plugins/testlink/TestLinkBuildAction.java index 2e47e26..eef4635 100644 --- a/src/main/java/hudson/plugins/testlink/TestLinkBuildAction.java +++ b/src/main/java/hudson/plugins/testlink/TestLinkBuildAction.java @@ -23,7 +23,6 @@ */ package hudson.plugins.testlink; -import hudson.model.Action; import hudson.model.AbstractBuild; import hudson.model.Run; import hudson.plugins.testlink.util.TestLinkHelper; diff --git a/src/main/java/hudson/plugins/testlink/TestLinkJunitWrapper.java b/src/main/java/hudson/plugins/testlink/TestLinkJunitWrapper.java index 223a84e..77535b7 100644 --- a/src/main/java/hudson/plugins/testlink/TestLinkJunitWrapper.java +++ b/src/main/java/hudson/plugins/testlink/TestLinkJunitWrapper.java @@ -41,12 +41,10 @@ import jenkins.MasterToSlaveFileCallable; import hudson.remoting.VirtualChannel; import org.dom4j.io.SAXReader; -import hudson.util.io.ParserConfigurator; import org.dom4j.Document; import org.dom4j.Element; import java.util.List; import java.util.Iterator; -import java.util.logging.Level; import java.util.logging.Logger; /** diff --git a/src/main/java/hudson/plugins/testlink/pipeline/TestLinkCreateBuildExecution.java b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkCreateBuildExecution.java index bf69b9c..665eb2c 100644 --- a/src/main/java/hudson/plugins/testlink/pipeline/TestLinkCreateBuildExecution.java +++ b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkCreateBuildExecution.java @@ -3,7 +3,6 @@ import com.google.inject.Inject; import hudson.AbortException; import hudson.Launcher; -import hudson.console.ConsoleNote; import hudson.model.*; import hudson.plugins.testlink.TestLinkBuilder; import hudson.plugins.testlink.TestLinkBuilderDescriptor; @@ -11,15 +10,10 @@ import hudson.plugins.testlink.TestLinkSite; import hudson.plugins.testlink.result.ResultSeeker; import hudson.tasks.BuildStep; -import org.apache.tools.ant.taskdefs.Parallel; import org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution; import org.jenkinsci.plugins.workflow.steps.StepContextParameter; -import java.io.IOException; -import java.io.PrintStream; -import java.io.PrintWriter; import java.util.ArrayList; -import java.util.List; /** * Created by azikha01 on 11/10/2016. diff --git a/src/main/java/hudson/plugins/testlink/pipeline/TestLinkCreateBuildStep.java b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkCreateBuildStep.java index 619160a..20e9d60 100644 --- a/src/main/java/hudson/plugins/testlink/pipeline/TestLinkCreateBuildStep.java +++ b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkCreateBuildStep.java @@ -8,8 +8,6 @@ import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.DataBoundSetter; -import static hudson.plugins.testlink.pipeline.TestLinkCreateBuildStep.DescriptorImpl.STEP_NAME; - /** * Created by azikha01 on 11/10/2016. */ diff --git a/src/main/java/hudson/plugins/testlink/pipeline/TestLinkDownloadTestPlanExecution.java b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkDownloadTestPlanExecution.java index e1ebdd1..36cd176 100644 --- a/src/main/java/hudson/plugins/testlink/pipeline/TestLinkDownloadTestPlanExecution.java +++ b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkDownloadTestPlanExecution.java @@ -7,18 +7,13 @@ import br.eti.kinoshita.testlinkjavaapi.constants.TestCaseDetails; import br.eti.kinoshita.testlinkjavaapi.model.*; import com.google.inject.Inject; -import com.thoughtworks.xstream.io.json.JsonWriter; import hudson.AbortException; import hudson.Launcher; import hudson.model.Run; import hudson.model.TaskListener; -import hudson.plugins.testlink.TestLinkBuilder; import hudson.plugins.testlink.TestLinkBuilderDescriptor; import hudson.plugins.testlink.TestLinkInstallation; import hudson.plugins.testlink.TestLinkSite; -import hudson.plugins.testlink.result.ResultSeeker; -import hudson.tasks.BuildStep; -import jdk.nashorn.internal.ir.debug.JSONWriter; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution; @@ -26,10 +21,7 @@ import java.io.File; import java.io.FileWriter; -import java.io.IOException; -import java.io.Writer; import java.net.URL; -import java.util.ArrayList; /** * Created by azikha01 on 11/10/2016. diff --git a/src/main/java/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsExecution.java b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsExecution.java index c2243cd..f2487ac 100644 --- a/src/main/java/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsExecution.java +++ b/src/main/java/hudson/plugins/testlink/pipeline/TestLinkUploadTestResultsExecution.java @@ -17,7 +17,6 @@ import org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution; import org.jenkinsci.plugins.workflow.steps.StepContextParameter; -import java.io.Serializable; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/hudson/plugins/testlink/result/AbstractJUnitResultSeeker.java b/src/main/java/hudson/plugins/testlink/result/AbstractJUnitResultSeeker.java index b188e2c..0238219 100644 --- a/src/main/java/hudson/plugins/testlink/result/AbstractJUnitResultSeeker.java +++ b/src/main/java/hudson/plugins/testlink/result/AbstractJUnitResultSeeker.java @@ -35,7 +35,6 @@ import br.eti.kinoshita.testlinkjavaapi.model.Attachment; import br.eti.kinoshita.testlinkjavaapi.util.TestLinkAPIException; import hudson.plugins.testlink.TestLinkSite; -import hudson.plugins.testlink.util.Messages; import hudson.remoting.VirtualChannel; import hudson.tasks.junit.SuiteResult; diff --git a/src/main/java/hudson/plugins/testlink/result/AbstractTestNGResultSeeker.java b/src/main/java/hudson/plugins/testlink/result/AbstractTestNGResultSeeker.java index 5cf5d2b..a23995c 100644 --- a/src/main/java/hudson/plugins/testlink/result/AbstractTestNGResultSeeker.java +++ b/src/main/java/hudson/plugins/testlink/result/AbstractTestNGResultSeeker.java @@ -23,13 +23,10 @@ */ package hudson.plugins.testlink.result; -import hudson.model.BuildListener; import hudson.model.Result; import hudson.model.Run; import hudson.model.TaskListener; import hudson.FilePath; -import hudson.FilePath.FileCallable; -import hudson.model.AbstractBuild; import hudson.plugins.testlink.TestLinkSite; import hudson.remoting.VirtualChannel; diff --git a/src/main/java/hudson/plugins/testlink/result/JUnitCaseClassNameResultSeeker.java b/src/main/java/hudson/plugins/testlink/result/JUnitCaseClassNameResultSeeker.java index fb258f6..98415e6 100644 --- a/src/main/java/hudson/plugins/testlink/result/JUnitCaseClassNameResultSeeker.java +++ b/src/main/java/hudson/plugins/testlink/result/JUnitCaseClassNameResultSeeker.java @@ -26,14 +26,11 @@ import hudson.Extension; import hudson.FilePath; import hudson.Launcher; -import hudson.model.BuildListener; -import hudson.model.AbstractBuild; import hudson.model.Run; import hudson.model.TaskListener; import hudson.plugins.testlink.TestLinkJunitWrapper; import hudson.plugins.testlink.TestLinkSite; import hudson.plugins.testlink.util.Messages; -import hudson.tasks.junit.JUnitParser; import hudson.tasks.junit.SuiteResult; import hudson.tasks.junit.TestResult; import hudson.tasks.junit.CaseResult; diff --git a/src/main/java/hudson/plugins/testlink/result/JUnitCaseNameResultSeeker.java b/src/main/java/hudson/plugins/testlink/result/JUnitCaseNameResultSeeker.java index a8a548d..b3a13d0 100644 --- a/src/main/java/hudson/plugins/testlink/result/JUnitCaseNameResultSeeker.java +++ b/src/main/java/hudson/plugins/testlink/result/JUnitCaseNameResultSeeker.java @@ -26,8 +26,6 @@ import hudson.Extension; import hudson.FilePath; import hudson.Launcher; -import hudson.model.BuildListener; -import hudson.model.AbstractBuild; import hudson.model.Run; import hudson.model.TaskListener; import hudson.plugins.testlink.TestLinkSite; diff --git a/src/main/java/hudson/plugins/testlink/result/JUnitMethodNameResultSeeker.java b/src/main/java/hudson/plugins/testlink/result/JUnitMethodNameResultSeeker.java index 9c7653d..2cd9e39 100644 --- a/src/main/java/hudson/plugins/testlink/result/JUnitMethodNameResultSeeker.java +++ b/src/main/java/hudson/plugins/testlink/result/JUnitMethodNameResultSeeker.java @@ -26,8 +26,6 @@ import hudson.Extension; import hudson.FilePath; import hudson.Launcher; -import hudson.model.BuildListener; -import hudson.model.AbstractBuild; import hudson.model.Run; import hudson.model.TaskListener; import hudson.plugins.testlink.TestLinkSite; diff --git a/src/main/java/hudson/plugins/testlink/result/JUnitSuiteNameResultSeeker.java b/src/main/java/hudson/plugins/testlink/result/JUnitSuiteNameResultSeeker.java index d32367b..c1a5fc7 100644 --- a/src/main/java/hudson/plugins/testlink/result/JUnitSuiteNameResultSeeker.java +++ b/src/main/java/hudson/plugins/testlink/result/JUnitSuiteNameResultSeeker.java @@ -26,8 +26,6 @@ import hudson.Extension; import hudson.FilePath; import hudson.Launcher; -import hudson.model.BuildListener; -import hudson.model.AbstractBuild; import hudson.model.Run; import hudson.model.TaskListener; import hudson.plugins.testlink.TestLinkSite; diff --git a/src/main/java/hudson/plugins/testlink/result/TAPFileNameMultiTestPointsResultSeeker.java b/src/main/java/hudson/plugins/testlink/result/TAPFileNameMultiTestPointsResultSeeker.java index e0c75ef..198b984 100644 --- a/src/main/java/hudson/plugins/testlink/result/TAPFileNameMultiTestPointsResultSeeker.java +++ b/src/main/java/hudson/plugins/testlink/result/TAPFileNameMultiTestPointsResultSeeker.java @@ -25,8 +25,6 @@ import hudson.Extension; import hudson.FilePath; -import hudson.model.BuildListener; -import hudson.model.AbstractBuild; import hudson.model.Run; import hudson.model.TaskListener; import hudson.plugins.testlink.TestLinkSite; diff --git a/src/main/java/hudson/plugins/testlink/result/TAPFileNameResultSeeker.java b/src/main/java/hudson/plugins/testlink/result/TAPFileNameResultSeeker.java index 0e44d57..d9b1d65 100644 --- a/src/main/java/hudson/plugins/testlink/result/TAPFileNameResultSeeker.java +++ b/src/main/java/hudson/plugins/testlink/result/TAPFileNameResultSeeker.java @@ -26,14 +26,11 @@ import hudson.Extension; import hudson.FilePath; import hudson.Launcher; -import hudson.model.BuildListener; -import hudson.model.AbstractBuild; import hudson.model.Run; import hudson.model.TaskListener; import hudson.plugins.testlink.TestLinkSite; import org.kohsuke.stapler.DataBoundConstructor; -import org.kohsuke.stapler.Facet; /** *

Seeks for test results matching each TAP file name with the key From f72f1363bbea1260ec51f572b69baf7eab632b85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20F=C3=BCrbacher?= Date: Fri, 2 Aug 2019 09:53:20 +0200 Subject: [PATCH 8/8] Fix potential exceptions --- .../plugins/testlink/TestLinkBuilder.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/java/hudson/plugins/testlink/TestLinkBuilder.java b/src/main/java/hudson/plugins/testlink/TestLinkBuilder.java index b3c566d..5b38f87 100644 --- a/src/main/java/hudson/plugins/testlink/TestLinkBuilder.java +++ b/src/main/java/hudson/plugins/testlink/TestLinkBuilder.java @@ -351,15 +351,21 @@ public TestLinkSite getTestLinkSite(String testLinkUrl, String testLinkDevKey, /* Extract custom fields and values */ java.util.Map cfs = new HashMap(); - for (String part: buildCustomFields.split(",")) { - String[] cf = part.split(":"); - String name = cf[0].replaceAll("\\s+", ""); - String value = cf[1].replaceAll("\\s+", ""); - cfs.put(name, value); + if(buildCustomFields != null && !(buildCustomFields.isEmpty())) { + for (String part: buildCustomFields.split(",")) { + String[] cf = part.split(":"); + String name = cf[0].replaceAll("\\s+", ""); + String value = cf[1].replaceAll("\\s+", ""); + cfs.put(name, value); + } } final Build build = api.createBuild(testPlan.getId(), buildName, buildNotes); - api.updateBuildCustomFields(build.getId(), testProject.getId(), testPlan.getId(), cfs); + try { + api.updateBuildCustomFields(build.getId(), testProject.getId(), testPlan.getId(), cfs); + }catch(TestLinkAPIException e) { + LOGGER.log(Level.INFO, "TestLink builder failed ro update build custom fields. " + e); + } return new TestLinkSite(api, testProject, testPlan, platform, build); }