PageRenderTime 53ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

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

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