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

/src/test/java/com/atlassian/bamboo/plugins/git/GitAbstractTest.java

https://bitbucket.org/atlassian/bamboo-git-plugin
Java | 356 lines | 304 code | 52 blank | 0 comment | 13 complexity | 8c00f9356ae40ce747609ed6c36e907f MD5 | raw file
Possible License(s): Apache-2.0
  1. package com.atlassian.bamboo.plugins.git;
  2. import com.atlassian.bamboo.FeatureManager;
  3. import com.atlassian.bamboo.agent.AgentType;
  4. import com.atlassian.bamboo.build.BuildLoggerManager;
  5. import com.atlassian.bamboo.build.context.BuildContextBuilderImpl;
  6. import com.atlassian.bamboo.build.fileserver.BuildDirectoryManager;
  7. import com.atlassian.bamboo.build.logger.NullBuildLogger;
  8. import com.atlassian.bamboo.chains.Chain;
  9. import com.atlassian.bamboo.core.TransportProtocol;
  10. import com.atlassian.bamboo.credentials.CredentialsAccessor;
  11. import com.atlassian.bamboo.plan.PlanKey;
  12. import com.atlassian.bamboo.plan.PlanKeys;
  13. import com.atlassian.bamboo.plan.branch.BranchIntegrationHelper;
  14. import com.atlassian.bamboo.plan.branch.BranchIntegrationService;
  15. import com.atlassian.bamboo.plan.branch.VcsBranchImpl;
  16. import com.atlassian.bamboo.project.Project;
  17. import com.atlassian.bamboo.repository.RepositoryException;
  18. import com.atlassian.bamboo.security.EncryptionService;
  19. import com.atlassian.bamboo.security.EncryptionServiceImpl;
  20. import com.atlassian.bamboo.ssh.SshProxyService;
  21. import com.atlassian.bamboo.util.BambooFileUtils;
  22. import com.atlassian.bamboo.utils.i18n.DefaultI18nBean;
  23. import com.atlassian.bamboo.utils.i18n.I18nResolverAdapter;
  24. import com.atlassian.bamboo.v2.build.BuildContext;
  25. import com.atlassian.bamboo.v2.build.agent.capability.CapabilityContext;
  26. import com.atlassian.bamboo.variable.CustomVariableContext;
  27. import com.atlassian.bamboo.variable.CustomVariableContextImpl;
  28. import com.atlassian.bamboo.variable.VariableContext;
  29. import com.atlassian.bamboo.variable.VariableDefinitionContext;
  30. import com.atlassian.bamboo.variable.VariableDefinitionManager;
  31. import com.atlassian.bamboo.ww2.actions.build.admin.create.BuildConfiguration;
  32. import com.atlassian.plugin.PluginAccessor;
  33. import com.atlassian.sal.api.message.I18nResolver;
  34. import com.google.common.collect.ImmutableMap;
  35. import com.google.common.collect.Maps;
  36. import org.apache.commons.io.FileUtils;
  37. import org.apache.commons.io.filefilter.FileFilterUtils;
  38. import org.eclipse.jgit.lib.Repository;
  39. import org.jetbrains.annotations.NotNull;
  40. import org.jetbrains.annotations.Nullable;
  41. import org.mockito.Matchers;
  42. import org.mockito.Mockito;
  43. import org.mockito.internal.stubbing.answers.Returns;
  44. import org.testng.annotations.AfterClass;
  45. import java.io.File;
  46. import java.io.IOException;
  47. import java.util.ArrayList;
  48. import java.util.Collection;
  49. import java.util.Collections;
  50. import java.util.Enumeration;
  51. import java.util.Locale;
  52. import java.util.Map;
  53. import java.util.ResourceBundle;
  54. import java.util.zip.ZipEntry;
  55. import java.util.zip.ZipFile;
  56. import static org.apache.commons.io.FileUtils.listFiles;
  57. import static org.mockito.Mockito.mock;
  58. import static org.mockito.Mockito.when;
  59. import static org.testng.Assert.assertEquals;
  60. public class GitAbstractTest
  61. {
  62. public static final PlanKey PLAN_KEY = PlanKeys.getPlanKey("PLAN-KEY");
  63. private final Collection<File> filesToCleanUp = Collections.synchronizedCollection(new ArrayList<File>());
  64. private final Collection<Repository> repositoriesToCleanUp = Collections.synchronizedCollection(new ArrayList<Repository>());
  65. private static final ResourceBundle resourceBundle = ResourceBundle.getBundle("com.atlassian.bamboo.plugins.git.i18n", Locale.US);
  66. protected static final String COMITTER_NAME = "Committer";
  67. protected static final String COMITTER_EMAIL = "committer@example.com";
  68. private static final String REPOSITORY_GIT_AUTHENTICATION_TYPE = "repository.git.authenticationType";
  69. protected static final EncryptionService encryptionService = new EncryptionServiceImpl();
  70. public static void setRepositoryPropertiesWithFetchAll(GitRepository gitRepository, File repositorySourceDir, String branch) throws Exception
  71. {
  72. setRepositoryProperties(gitRepository, repositorySourceDir.getAbsolutePath(), branch, null, null, ImmutableMap.of(GitRepository.REPOSITORY_GIT_FETCH_WHOLE_REPOSITORY, "true"));
  73. }
  74. public static void setRepositoryProperties(GitRepository gitRepository, File repositorySourceDir, String branch) throws Exception
  75. {
  76. setRepositoryProperties(gitRepository, repositorySourceDir.getAbsolutePath(), branch);
  77. }
  78. public static void setRepositoryProperties(GitRepository gitRepository, String repositoryUrl, String branch) throws Exception
  79. {
  80. setRepositoryProperties(gitRepository, repositoryUrl, branch, null, null);
  81. }
  82. public static void setRepositoryProperties(GitRepository gitRepository, String repositoryUrl, String branch, @Nullable String sshKey, @Nullable String sshPassphrase) throws Exception
  83. {
  84. setRepositoryProperties(gitRepository, repositoryUrl, branch, sshKey, sshPassphrase, Collections.<String, String>emptyMap());
  85. }
  86. public static void setRepositoryProperties(GitRepository gitRepository, String repositoryUrl, String branch, String sshKey, String sshPassphrase, Map<String, String> paramMap) throws Exception
  87. {
  88. Map<String, String> params = Maps.newHashMap(paramMap);
  89. params.put("repository.git.branch", branch);
  90. params.put(REPOSITORY_GIT_AUTHENTICATION_TYPE, GitAuthenticationType.NONE.name());
  91. if (sshKey != null)
  92. {
  93. params.put("repository.git.ssh.key", encryptionService.encrypt(sshKey));
  94. params.put(REPOSITORY_GIT_AUTHENTICATION_TYPE, GitAuthenticationType.SSH_KEYPAIR.name());
  95. }
  96. if (sshPassphrase != null)
  97. {
  98. params.put("repository.git.ssh.passphrase", encryptionService.encrypt(sshPassphrase));
  99. }
  100. setRepositoryProperties(gitRepository, repositoryUrl, params);
  101. }
  102. public static void setRepositoryProperties(GitRepository gitRepository, File repositorySourceDir) throws Exception
  103. {
  104. setRepositoryProperties(gitRepository, repositorySourceDir.getAbsolutePath(), Collections.<String, Object>emptyMap());
  105. }
  106. public static void setRepositoryProperties(GitRepository gitRepository, String repositoryUrl) throws Exception
  107. {
  108. setRepositoryProperties(gitRepository, repositoryUrl, Collections.<String, Object>emptyMap());
  109. }
  110. public static void setRepositoryProperties(GitRepository gitRepository, String repositoryUrl, Map<String, ?> paramMap) throws Exception
  111. {
  112. BuildConfiguration buildConfiguration = new BuildConfiguration();
  113. buildConfiguration.setProperty("repository.git.repositoryUrl", repositoryUrl);
  114. buildConfiguration.setProperty(REPOSITORY_GIT_AUTHENTICATION_TYPE, GitAuthenticationType.NONE.name());
  115. for (Map.Entry<String, ?> entry : paramMap.entrySet())
  116. {
  117. buildConfiguration.setProperty(entry.getKey(), entry.getValue());
  118. }
  119. if (gitRepository.validate(buildConfiguration).hasAnyErrors())
  120. {
  121. throw new Exception("validation failed");
  122. }
  123. gitRepository.populateFromConfig(buildConfiguration);
  124. }
  125. public JGitOperationHelper createJGitOperationHelper(final GitRepositoryAccessData accessData)
  126. {
  127. I18nResolver i18nResolver = Mockito.mock(I18nResolver.class);
  128. return new JGitOperationHelper(accessData, new NullBuildLogger(), i18nResolver);
  129. }
  130. public NativeGitOperationHelper createNativeGitOperationHelper(final GitRepositoryAccessData accessData) throws RepositoryException
  131. {
  132. I18nResolver i18nResolver = Mockito.mock(I18nResolver.class);
  133. final GitRepository repository = Mockito.mock(GitRepository.class);
  134. Mockito.when(repository.getWorkingDirectory()).thenReturn(new File("/"));
  135. Mockito.when(repository.getGitCapability()).thenReturn("git");
  136. final SshProxyService sshProxyService = Mockito.mock(SshProxyService.class);
  137. return new NativeGitOperationHelper(repository, accessData, sshProxyService, new NullBuildLogger(), i18nResolver);
  138. }
  139. public GitRepository createNativeGitRepository() throws Exception
  140. {
  141. return _createGitRepository(new NativeGitRepositoryFixture());
  142. }
  143. public GitRepository createGitRepository(final AgentType agentType) throws Exception
  144. {
  145. return _createGitRepository(new GitRepositoryFixture(agentType));
  146. }
  147. public GitRepository _createGitRepository(GitRepository fixture) throws Exception
  148. {
  149. File workingDirectory = createTempDirectory();
  150. BuildLoggerManager buildLoggerManager = Mockito.mock(BuildLoggerManager.class, new Returns(new NullBuildLogger()));
  151. fixture.setBuildLoggerManager(buildLoggerManager);
  152. BuildDirectoryManager buildDirectoryManager = Mockito.mock(BuildDirectoryManager.class, new Returns(workingDirectory));
  153. fixture.setBuildDirectoryManager(buildDirectoryManager);
  154. fixture.setI18nResolver(getI18nResolver());
  155. CustomVariableContext customVariableContext = new CustomVariableContextImpl();
  156. customVariableContext.setVariables(Maps.<String, VariableDefinitionContext>newHashMap());
  157. fixture.setCustomVariableContext(customVariableContext);
  158. fixture.setCapabilityContext(mock(CapabilityContext.class));
  159. SshProxyService sshProxyService = mock(SshProxyService.class);
  160. fixture.setSshProxyService(sshProxyService);
  161. final BranchIntegrationHelper branchIntegrationHelper = mock(BranchIntegrationHelper.class);
  162. Mockito.when(branchIntegrationHelper.getCommitterName(fixture)).thenReturn(COMITTER_NAME);
  163. Mockito.when(branchIntegrationHelper.getCommitterEmail(fixture)).thenReturn(COMITTER_EMAIL);
  164. fixture.setBranchIntegrationHelper(branchIntegrationHelper);
  165. FeatureManager featureManager = mock(FeatureManager.class);
  166. when(featureManager.isTransportSupported(Matchers.<TransportProtocol>any())).thenReturn(true);
  167. fixture.setFeatureManager(featureManager);
  168. fixture.setEncryptionService(encryptionService);
  169. return fixture;
  170. }
  171. public File createTempDirectory() throws IOException
  172. {
  173. File tmp = BambooFileUtils.createTempDirectory("bamboo-git-plugin-test");
  174. FileUtils.forceDeleteOnExit(tmp);
  175. filesToCleanUp.add(tmp);
  176. return tmp;
  177. }
  178. protected <T extends Repository> T register(T repository)
  179. {
  180. repositoriesToCleanUp.add(repository);
  181. return repository;
  182. }
  183. public static void verifyContents(File directory, final String expectedZip) throws IOException
  184. {
  185. final Enumeration<? extends ZipEntry> entries = new ZipFile(GitAbstractTest.class.getResource("/" + expectedZip).getFile()).entries();
  186. int fileCount = 0;
  187. while (entries.hasMoreElements())
  188. {
  189. ZipEntry zipEntry = entries.nextElement();
  190. if (!zipEntry.isDirectory())
  191. {
  192. fileCount++;
  193. String fileName = zipEntry.getName();
  194. final File file = new File(directory, fileName);
  195. assertEquals(FileUtils.checksumCRC32(file), zipEntry.getCrc(), "CRC for " + file);
  196. }
  197. }
  198. final Collection files = listFiles(directory, FileFilterUtils.trueFileFilter(), FileFilterUtils.notFileFilter(FileFilterUtils.nameFileFilter(".git")));
  199. assertEquals(files.size(), fileCount, "Number of files");
  200. }
  201. public static I18nResolver getI18nResolver()
  202. {
  203. DefaultI18nBean bean = new DefaultI18nBean(Locale.US, Mockito.mock(PluginAccessor.class));
  204. bean.getI18nBundles().add(resourceBundle);
  205. return new I18nResolverAdapter(bean);
  206. }
  207. protected static GitRepositoryAccessData createAccessData(@NotNull String repositoryUrl)
  208. {
  209. return createAccessData(repositoryUrl, null);
  210. }
  211. protected static GitRepositoryAccessData createAccessData(File repositoryFile, String branch)
  212. {
  213. return createAccessData(repositoryFile.getAbsolutePath(), branch);
  214. }
  215. protected static GitRepositoryAccessData createAccessData(@NotNull String repositoryUrl, @Nullable String branch)
  216. {
  217. return createAccessData(repositoryUrl, branch, null, null, null, null);
  218. }
  219. protected static GitRepositoryAccessData createAccessData(@NotNull String repositoryUrl, String branch, @Nullable String username, @Nullable String password, @Nullable String sshKey, @Nullable String sshPassphrase)
  220. {
  221. GitRepositoryAccessData.Builder builder = GitRepositoryAccessData.builder()
  222. .repositoryUrl(repositoryUrl)
  223. .branch(new VcsBranchImpl(branch))
  224. .username(username)
  225. .password(password)
  226. .sshKey(sshKey)
  227. .sshPassphrase(sshPassphrase)
  228. .commandTimeout(1);
  229. if (password!=null)
  230. {
  231. builder.authenticationType(GitAuthenticationType.PASSWORD);
  232. }
  233. if (password==null && sshKey==null)
  234. {
  235. builder.authenticationType(GitAuthenticationType.NONE);
  236. }
  237. return builder.build();
  238. }
  239. protected static BuildContext mockBuildContext()
  240. {
  241. Chain chain = Mockito.mock(Chain.class);
  242. Mockito.when(chain.getKey()).thenReturn(PLAN_KEY.toString());
  243. Project project = Mockito.mock(Project.class);
  244. Mockito.when(chain.getProject()).thenReturn(project);
  245. return new BuildContextBuilderImpl(Mockito.mock(BranchIntegrationService.class),
  246. Mockito.mock(VariableDefinitionManager.class),
  247. Mockito.mock(CredentialsAccessor.class), null)
  248. .plan(chain)
  249. .buildNumber(1)
  250. .variableContext(Mockito.mock(VariableContext.class))
  251. .build();
  252. }
  253. protected static File getCheckoutDir(GitRepository gitRepository)
  254. {
  255. return new File(gitRepository.getWorkingDirectory(), "checkoutDir");
  256. }
  257. @AfterClass
  258. void cleanUpFiles()
  259. {
  260. for (File file : filesToCleanUp)
  261. {
  262. FileUtils.deleteQuietly(file);
  263. }
  264. for (Repository repository : repositoriesToCleanUp)
  265. {
  266. repository.close();
  267. }
  268. }
  269. static class GitRepositoryFixture extends GitRepository
  270. {
  271. private final AgentType agentType;
  272. GitRepositoryFixture(final AgentType agentType)
  273. {
  274. this.agentType = agentType;
  275. }
  276. @Override
  277. public String getGitCapability()
  278. {
  279. return "";
  280. }
  281. @Override
  282. public File getCacheDirectory()
  283. {
  284. return GitCacheDirectory.getCacheDirectory(getWorkingDirectory(), getSubstitutedAccessData());
  285. }
  286. @Override
  287. protected boolean isOnLocalAgent()
  288. {
  289. return agentType==AgentType.LOCAL;
  290. }
  291. }
  292. static class NativeGitRepositoryFixture extends GitRepositoryFixture
  293. {
  294. NativeGitRepositoryFixture()
  295. {
  296. super(AgentType.LOCAL);
  297. }
  298. @Override
  299. public String getGitCapability()
  300. {
  301. return "git";
  302. }
  303. }
  304. }