PageRenderTime 45ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/src/main/java/com/atlassian/bamboo/plugin/dotnet/tests/nunit/NUnitRunnerTaskType.java

https://bitbucket.org/atlassian/bamboo-dotnet-plugin/
Java | 147 lines | 105 code | 28 blank | 14 comment | 3 complexity | 3968bc69c1b4c79fad9825d3f79f66f3 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. package com.atlassian.bamboo.plugin.dotnet.tests.nunit;
  2. import com.atlassian.bamboo.build.logger.interceptors.ErrorMemorisingInterceptor;
  3. import com.atlassian.bamboo.build.test.TestCollationService;
  4. import com.atlassian.bamboo.configuration.ConfigurationMap;
  5. import com.atlassian.bamboo.process.CommandlineStringUtils;
  6. import com.atlassian.bamboo.process.EnvironmentVariableAccessor;
  7. import com.atlassian.bamboo.process.ExternalProcessBuilder;
  8. import com.atlassian.bamboo.process.ProcessService;
  9. import com.atlassian.bamboo.task.TaskContext;
  10. import com.atlassian.bamboo.task.TaskException;
  11. import com.atlassian.bamboo.task.TaskResult;
  12. import com.atlassian.bamboo.task.TaskResultBuilder;
  13. import com.atlassian.bamboo.task.TaskType;
  14. import com.atlassian.bamboo.v2.build.agent.capability.Capability;
  15. import com.atlassian.bamboo.v2.build.agent.capability.CapabilityContext;
  16. import com.atlassian.bamboo.v2.build.agent.capability.CapabilityDefaultsHelper;
  17. import com.atlassian.utils.process.ExternalProcess;
  18. import com.google.common.base.Preconditions;
  19. import com.google.common.collect.Lists;
  20. import org.apache.commons.lang3.StringUtils;
  21. import org.apache.log4j.Logger;
  22. import org.jetbrains.annotations.NotNull;
  23. import java.io.File;
  24. import java.util.List;
  25. import java.util.Map;
  26. /**
  27. * Executes and parses test results from NUnit test runs executed via the command line.
  28. */
  29. public class NUnitRunnerTaskType implements TaskType
  30. {
  31. private static final Logger log = Logger.getLogger(NUnitRunnerTaskType.class);
  32. // ------------------------------------------------------------------------------------------------------- Constants
  33. public static final String NUNIT_CAPABILITY_PREFIX = CapabilityDefaultsHelper.CAPABILITY_BUILDER_PREFIX + ".nunit";
  34. public static final String LABEL = "label";
  35. public static final String TEST_FILES = "nunitTestFiles";
  36. public static final String RESULTS_FILE = "nunitResultsFile";
  37. public static final String TESTS_TO_RUN = "run"; // eg. /run:NUnit.Tests.AssertionTests,NUnit.Tests.ConstraintTests
  38. public static final String INCLUDED_TEST_CATEGORIES = "include"; // eg. /include:TheseTests,AndTheseTests
  39. public static final String EXCLUDED_TEST_CATEGORIES = "exclude"; // eg. /exclude:BrokenTests
  40. public static final String COMMAND_OPTIONS = "commandLineOptions";
  41. public static final String ENVIRONMENT = "environmentVariables";
  42. // ------------------------------------------------------------------------------------------------- Type Properties
  43. // ---------------------------------------------------------------------------------------------------- Dependencies
  44. private final ProcessService processService;
  45. private final TestCollationService testCollationService;
  46. private final CapabilityContext capabilityContext;
  47. private final EnvironmentVariableAccessor environmentVariableAccessor;
  48. // ---------------------------------------------------------------------------------------------------- Constructors
  49. public NUnitRunnerTaskType(final ProcessService processService, final TestCollationService testCollationService, final CapabilityContext capabilityContext, final EnvironmentVariableAccessor environmentVariableAccessor)
  50. {
  51. this.processService = processService;
  52. this.testCollationService = testCollationService;
  53. this.capabilityContext = capabilityContext;
  54. this.environmentVariableAccessor = environmentVariableAccessor;
  55. }
  56. // ----------------------------------------------------------------------------------------------- Interface Methods
  57. @Override
  58. @NotNull
  59. public TaskResult execute(@NotNull TaskContext taskContext) throws TaskException
  60. {
  61. final ErrorMemorisingInterceptor errorLines = ErrorMemorisingInterceptor.newInterceptor();
  62. taskContext.getBuildLogger().getInterceptorStack().add(errorLines);
  63. try
  64. {
  65. final ConfigurationMap configuration = taskContext.getConfigurationMap();
  66. final String testFiles = configuration.get(TEST_FILES);
  67. Preconditions.checkNotNull(testFiles, "One or more test files must be specified");
  68. final String resultsFile = configuration.get(RESULTS_FILE);
  69. Preconditions.checkNotNull(resultsFile, "Results File Name");
  70. final String label = configuration.get(LABEL);
  71. Preconditions.checkNotNull(label, "You must select an NUnit Runner before this task can execute.");
  72. final Capability capability = capabilityContext.getCapabilitySet().getCapability(NUnitRunnerTaskType.NUNIT_CAPABILITY_PREFIX + "." + label);
  73. Preconditions.checkNotNull(capability, "Capability");
  74. final File nunitConsoleExe = new File(capability.getValue());
  75. Preconditions.checkArgument(nunitConsoleExe.exists(), "NUnit Console Executable not found");
  76. // Note: Under the Windows operating system, options may be prefixed by either a forward slash or a hyphen.
  77. // Under Linux, a hyphen must be used. Options that take values may use an equal sign, a colon or a space
  78. // to separate the option from its value.
  79. final List<String> command = Lists.newArrayList(nunitConsoleExe.getAbsolutePath());
  80. final String testsToRun = configuration.get(TESTS_TO_RUN);
  81. if (StringUtils.isNotBlank(testsToRun))
  82. {
  83. command.add("-run=" + testsToRun);
  84. }
  85. command.add(testFiles);
  86. command.add("-xml=" + resultsFile);
  87. final String includedCategories = configuration.get(INCLUDED_TEST_CATEGORIES);
  88. if (StringUtils.isNotBlank(includedCategories))
  89. {
  90. command.add("-include=" + includedCategories);
  91. }
  92. final String excludedCategories = configuration.get(EXCLUDED_TEST_CATEGORIES);
  93. if (StringUtils.isNotBlank(excludedCategories))
  94. {
  95. command.add("-exclude=" + excludedCategories);
  96. }
  97. final String environment = configuration.get(ENVIRONMENT);
  98. final Map<String, String> env = environmentVariableAccessor.splitEnvironmentAssignments(environment);
  99. command.addAll(CommandlineStringUtils.tokeniseCommandline(configuration.get(COMMAND_OPTIONS)));
  100. final ExternalProcess externalProcess = processService.executeExternalProcess(taskContext,
  101. new ExternalProcessBuilder()
  102. .env(env)
  103. .command(command)
  104. .workingDirectory(taskContext.getWorkingDirectory()));
  105. testCollationService.collateTestResults(taskContext, resultsFile, new NUnitTestReportCollector());
  106. return TaskResultBuilder.newBuilder(taskContext)
  107. .checkTestFailures()
  108. .checkReturnCode(externalProcess)
  109. .build();
  110. }
  111. finally
  112. {
  113. taskContext.getBuildContext().getBuildResult().addBuildErrors(errorLines.getErrorStringList());
  114. }
  115. }
  116. // -------------------------------------------------------------------------------------------------- Action Methods
  117. // -------------------------------------------------------------------------------------------------- Public Methods
  118. // -------------------------------------------------------------------------------------- Basic Accessors / Mutators
  119. }