PageRenderTime 26ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/src/test/java/com/atlassian/bamboo/plugin/dotnet/msbuild/MsBuildTaskTypeTest.java

https://bitbucket.org/lmeyer/bamboo-dotnet-plugin
Java | 251 lines | 194 code | 46 blank | 11 comment | 7 complexity | 945463d4fc02be351ac4e4a617c5b2f6 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. package com.atlassian.bamboo.plugin.dotnet.msbuild;
  2. import com.atlassian.bamboo.build.LogEntry;
  3. import com.atlassian.bamboo.build.fileserver.BuildDirectoryManager;
  4. import com.atlassian.bamboo.build.logger.BuildLogger;
  5. import com.atlassian.bamboo.build.logger.SimpleBuildLogger;
  6. import com.atlassian.bamboo.configuration.ConfigurationMapImpl;
  7. import com.atlassian.bamboo.plan.PlanKeys;
  8. import com.atlassian.bamboo.plan.PlanResultKey;
  9. import com.atlassian.bamboo.process.EnvironmentVariableAccessor;
  10. import com.atlassian.bamboo.process.ProcessService;
  11. import com.atlassian.bamboo.process.ProcessServiceImpl;
  12. import com.atlassian.bamboo.task.TaskContext;
  13. import com.atlassian.bamboo.testutils.build.logger.BuildLoggerManagerForTesting;
  14. import com.atlassian.bamboo.utils.BambooTestUtils;
  15. import com.atlassian.bamboo.v2.build.CommonContext;
  16. import com.atlassian.bamboo.v2.build.CurrentBuildResult;
  17. import com.atlassian.bamboo.v2.build.agent.capability.CapabilityContext;
  18. import com.atlassian.bamboo.v2.build.agent.capability.CapabilitySet;
  19. import com.atlassian.bamboo.v2.build.agent.capability.CapabilitySetImpl;
  20. import com.atlassian.bamboo.variable.VariableContext;
  21. import com.atlassian.bamboo.variable.VariableDefinitionContext;
  22. import com.atlassian.plugin.PluginAccessor;
  23. import com.atlassian.utils.process.ExternalProcess;
  24. import com.atlassian.utils.process.ProcessHandler;
  25. import com.google.common.base.Joiner;
  26. import com.google.common.collect.ImmutableList;
  27. import com.google.common.collect.ImmutableMap;
  28. import com.google.common.collect.Lists;
  29. import org.apache.commons.io.FileUtils;
  30. import org.apache.commons.lang.SystemUtils;
  31. import org.jetbrains.annotations.NotNull;
  32. import org.junit.Before;
  33. import org.junit.Rule;
  34. import org.junit.Test;
  35. import org.junit.contrib.java.lang.system.RestoreSystemProperties;
  36. import org.junit.rules.TemporaryFolder;
  37. import org.junit.runner.RunWith;
  38. import org.mockito.Mock;
  39. import org.mockito.runners.MockitoJUnitRunner;
  40. import java.io.File;
  41. import java.util.Collections;
  42. import java.util.List;
  43. import static com.atlassian.bamboo.testutils.spring.SpringTestHelper.mockSpringComponent;
  44. import static org.hamcrest.MatcherAssert.assertThat;
  45. import static org.hamcrest.Matchers.hasItem;
  46. import static org.junit.Assert.fail;
  47. import static org.mockito.Mockito.when;
  48. @RunWith(MockitoJUnitRunner.class)
  49. public class MsBuildTaskTypeTest
  50. {
  51. private final static Joiner DOT_JOINER = Joiner.on(".");
  52. private static final String PLAN_NAME = "Foo Bar";
  53. private static final PlanResultKey PLAN_RESULT_KEY = PlanKeys.getPlanResultKey("FOO-BAR", 1);
  54. @Rule public RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties(MsBuildTaskType.PROPERTY_USE_RESPONSE_FILE);
  55. @Rule public TemporaryFolder tmpFolder = new TemporaryFolder();
  56. @Mock private BuildDirectoryManager buildDirectoryManager;
  57. @Mock private EnvironmentVariableAccessor environmentVariableAccessor;
  58. @Mock private CapabilityContext capabilityContext;
  59. @Mock private CommonContext buildContext;
  60. @Mock private CurrentBuildResult currentBuildResult;
  61. @Mock private ExternalProcess externalProcess;
  62. @Mock private PluginAccessor pluginAccessor;
  63. @Mock private ProcessHandler processHandler;
  64. @Mock private TaskContext taskContext;
  65. @Mock private VariableContext variableContext;
  66. private File applicationHomeDirectory;
  67. private BuildLogger buildLogger;
  68. private BuildLoggerManagerForTesting buildLoggerManager;
  69. private CapabilitySet capabilitySet;
  70. private File taskWorkingDirectory;
  71. private ProcessService processService;
  72. private File msBuildProjectFile;
  73. @Before
  74. public void setUp() throws Exception
  75. {
  76. applicationHomeDirectory = tmpFolder.newFolder("application-home");
  77. buildLogger = new SimpleBuildLogger();
  78. buildLoggerManager = new BuildLoggerManagerForTesting();
  79. taskWorkingDirectory = tmpFolder.newFolder("task-working-directory");
  80. mockSpringComponent("buildDirectoryManager", buildDirectoryManager);
  81. when(buildDirectoryManager.getApplicationHome()).thenReturn(applicationHomeDirectory);
  82. when(variableContext.getDefinitions()).thenReturn(Collections.<String, VariableDefinitionContext>emptyMap());
  83. when(buildContext.getCurrentResult()).thenReturn(currentBuildResult);
  84. when(buildContext.getDisplayName()).thenReturn(PLAN_NAME);
  85. when(buildContext.getResultKey()).thenReturn(PLAN_RESULT_KEY);
  86. when(buildContext.getVariableContext()).thenReturn(variableContext);
  87. // capabilities
  88. {
  89. capabilitySet = new CapabilitySetImpl();
  90. new MsBuildCapabilityDefaultsHelper().addDefaultCapabilities(capabilitySet);
  91. when(capabilityContext.getCapabilitySet()).thenReturn(capabilitySet);
  92. }
  93. when(processHandler.getExitCode()).thenReturn(0);
  94. when(externalProcess.getHandler()).thenReturn(processHandler);
  95. when(taskContext.getCommonContext()).thenReturn(buildContext);
  96. when(taskContext.getBuildLogger()).thenReturn(buildLogger);
  97. when(taskContext.getWorkingDirectory()).thenReturn(taskWorkingDirectory);
  98. processService = new ProcessServiceImpl(buildLoggerManager, capabilityContext, environmentVariableAccessor, pluginAccessor);
  99. msBuildProjectFile = new File(taskWorkingDirectory, "msbuild.proj");
  100. FileUtils.copyFile(BambooTestUtils.getFileFromResourceDirectory(this, "msbuild.proj"), msBuildProjectFile);
  101. }
  102. /**
  103. * regression test for BDEV-5798
  104. */
  105. @Test
  106. public void testBDEV5798() throws Exception
  107. {
  108. if (!SystemUtils.IS_OS_WINDOWS)
  109. {
  110. return;
  111. }
  112. final MsBuildTaskType task = new MsBuildTaskType(processService, environmentVariableAccessor, capabilityContext);
  113. final String msBuildCapabilityLabel = pickNativeMsBuilderCapability(capabilitySet);
  114. final String options = "/nologo /t:BDEV-5798 /p:BuildVersion=\"1.2.3.4\" /p:ProductsToRelease=\"JIRA;Bamboo;Fisheye\" /clp:ShowCommandLine /v:diag";
  115. final String solution = msBuildProjectFile.getAbsolutePath();
  116. when(taskContext.getConfigurationMap()).thenReturn(new ConfigurationMapImpl(ImmutableMap.of(
  117. MsBuildConfig.LABEL, msBuildCapabilityLabel,
  118. MsBuildConfig.SOLUTION, solution,
  119. MsBuildConfig.OPTIONS, options
  120. )));
  121. // execute
  122. task.execute(taskContext);
  123. // verify
  124. final List<String> logs = asStringLogs(buildLoggerManager.getBuildLogger(PLAN_RESULT_KEY).getBuildLog());
  125. assertThat(logs, hasItem("BuildVersion = 1.2.3.4"));
  126. assertThat(logs, hasItem("ProductsToRelease = JIRA;Bamboo;Fisheye"));
  127. }
  128. @Test
  129. public void testBAM11561() throws Exception
  130. {
  131. if (!SystemUtils.IS_OS_WINDOWS)
  132. {
  133. return;
  134. }
  135. System.setProperty(MsBuildTaskType.PROPERTY_USE_RESPONSE_FILE, Boolean.toString(true));
  136. final MsBuildTaskType task = new MsBuildTaskType(processService, environmentVariableAccessor, capabilityContext);
  137. final String msBuildCapabilityLabel = pickNativeMsBuilderCapability(capabilitySet);
  138. final String options = "/nologo /t:BAM-11561 /p:Configuration=Release;Platform=\"Any CPU\" /clp:ShowCommandLine /v:diag";
  139. final String solution = msBuildProjectFile.getAbsolutePath();
  140. when(taskContext.getConfigurationMap()).thenReturn(new ConfigurationMapImpl(ImmutableMap.of(
  141. MsBuildConfig.LABEL, msBuildCapabilityLabel,
  142. MsBuildConfig.SOLUTION, solution,
  143. MsBuildConfig.OPTIONS, options
  144. )));
  145. // execute
  146. task.execute(taskContext);
  147. // verify
  148. final List<String> logs = asStringLogs(buildLoggerManager.getBuildLogger(PLAN_RESULT_KEY).getBuildLog());
  149. assertThat(logs, hasItem("Configuration = Release"));
  150. assertThat(logs, hasItem("Platform = Any CPU"));
  151. }
  152. @Test
  153. public void testBAM13608() throws Exception
  154. {
  155. if (!SystemUtils.IS_OS_WINDOWS)
  156. {
  157. return;
  158. }
  159. System.setProperty(MsBuildTaskType.PROPERTY_USE_RESPONSE_FILE, Boolean.toString(true));
  160. final MsBuildTaskType task = new MsBuildTaskType(processService, environmentVariableAccessor, capabilityContext);
  161. final String msBuildCapabilityLabel = pickNativeMsBuilderCapability(capabilitySet);
  162. final String options = "/nologo /t:BAM-13608 /p:ReferencePath=\"C:\\Program Files (x86)\\WiX Toolset v3.7\\SDK;C:\\Program Files (x86)\\DGIT\\bin\" /clp:ShowCommandLine /v:diag";
  163. final String solution = msBuildProjectFile.getAbsolutePath();
  164. when(taskContext.getConfigurationMap()).thenReturn(new ConfigurationMapImpl(ImmutableMap.of(
  165. MsBuildConfig.LABEL, msBuildCapabilityLabel,
  166. MsBuildConfig.SOLUTION, solution,
  167. MsBuildConfig.OPTIONS, options
  168. )));
  169. // execute
  170. task.execute(taskContext);
  171. // verify
  172. final List<String> logs = asStringLogs(buildLoggerManager.getBuildLogger(PLAN_RESULT_KEY).getBuildLog());
  173. assertThat(logs, hasItem("ReferencePath = C:\\Program Files (x86)\\WiX Toolset v3.7\\SDK;C:\\Program Files (x86)\\DGIT\\bin"));
  174. }
  175. // -------------------------------------------------------------------------------------------------- Helper Methods
  176. private List<String> asStringLogs(List<LogEntry> logs)
  177. {
  178. List<String> errors = Lists.newArrayList();
  179. for (LogEntry entry : logs)
  180. {
  181. errors.add(entry.getUnstyledLog());
  182. }
  183. return errors;
  184. }
  185. private boolean hasCapability(@NotNull CapabilitySet capabilitySet, @NotNull String capabilityKey)
  186. {
  187. return capabilitySet.getCapability(DOT_JOINER.join(MsBuildTaskType.MSBUILD_CAPABILITY_PREFIX, capabilityKey)) != null;
  188. }
  189. private String pickNativeMsBuilderCapability(@NotNull CapabilitySet capabilitySet)
  190. {
  191. final List<String> candidates = ImmutableList.of(
  192. "MSBuild v4.0 (64bit)",
  193. "MSBuild v4.0 (32bit)"
  194. );
  195. for (String candidate : candidates)
  196. {
  197. if (hasCapability(capabilitySet, candidate))
  198. {
  199. return candidate;
  200. }
  201. }
  202. fail("Can't find native MSBuild");
  203. return null;
  204. }
  205. }