PageRenderTime 23ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 1ms

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

https://bitbucket.org/atlassian/bamboo-git-plugin
Java | 201 lines | 157 code | 43 blank | 1 comment | 2 complexity | a364f9193d9dbb9739fa2cc686c16272 MD5 | raw file
Possible License(s): Apache-2.0
  1. package com.atlassian.bamboo.plugins.git;
  2. import com.atlassian.bamboo.agent.AgentType;
  3. import com.atlassian.bamboo.plugins.git.testutils.ExtractComments;
  4. import com.atlassian.bamboo.v2.build.BuildContext;
  5. import com.atlassian.bamboo.v2.build.BuildRepositoryChanges;
  6. import com.atlassian.testtools.ZipResourceDirectory;
  7. import com.google.common.collect.Lists;
  8. import org.apache.commons.io.FileUtils;
  9. import org.mockito.Mockito;
  10. import org.testng.Assert;
  11. import org.testng.annotations.BeforeClass;
  12. import org.testng.annotations.DataProvider;
  13. import org.testng.annotations.Test;
  14. import java.io.File;
  15. import java.util.ArrayList;
  16. import java.util.Arrays;
  17. import java.util.Collections;
  18. import java.util.List;
  19. import static java.util.Arrays.asList;
  20. public class WalkingRepositoryWithDetachedChangesetsTest extends GitAbstractTest
  21. {
  22. private static final String CHG_1 = "2dc6e849cae7ff78e93179cfe04e62671807109d";
  23. private static final String CHG_2 = "2b6086bc53e14683de3bc7e80e28e2b9ee344316";
  24. private static final String CHG_3 = "2d870b2f044b3f8883298a4dac5830263ccbf4c0";
  25. private static final String CHG_4 = "303d0e7fcf7bea81729d050d9716963eb5a25815";
  26. private static final String CHG_5 = "f22d51f401b7d6ff22f6b1c611b95ebe757e47bf";
  27. private static final String COMMENT_2 = "Breaking the test";
  28. private static final String COMMENT_3 = "Fixing test";
  29. private static final String COMMENT_4 = "Fixing old and adding new test";
  30. private static final String COMMENT_5 = "merging detached";
  31. private File sourceRepositoriesBase;
  32. @BeforeClass
  33. public void setUpTmpDirWithRepository() throws Exception
  34. {
  35. sourceRepositoriesBase = createTempDirectory();
  36. ZipResourceDirectory.copyZipResourceToDirectory("detached-git-repos.zip", sourceRepositoriesBase);
  37. }
  38. @DataProvider
  39. Object[][] subsequentChangeDetectionsData()
  40. {
  41. return new Object[][]{
  42. {null, "1", CHG_1, Collections.<String>emptyList()}, // initial builds
  43. {null, "2", CHG_2, Collections.<String>emptyList()},
  44. {null, "3", CHG_3, Collections.<String>emptyList()},
  45. {null, "4", CHG_4, Collections.<String>emptyList()},
  46. {null, "5", CHG_5, Collections.<String>emptyList()},
  47. {CHG_1, "2", CHG_2, asList(COMMENT_2)}, // subsequent sequential builds
  48. {CHG_1, "3", CHG_3, asList(COMMENT_3, COMMENT_2)},
  49. {CHG_1, "4", CHG_4, asList(COMMENT_4, COMMENT_2)}, // no chg#3 - detached changeset!
  50. {CHG_1, "5", CHG_5, asList(COMMENT_5, COMMENT_4, COMMENT_3, COMMENT_2)}, // order of 3 and 4 arbitrary!
  51. {CHG_5, "4", CHG_4, asList(getI18nResolver().getText("repository.git.messages.unknownChanges", CHG_5, CHG_4))} // repository going back
  52. };
  53. }
  54. @Test(dataProvider = "subsequentChangeDetectionsData")
  55. public void testSubsequentChangeDetections(String previousChangeset, String srcRepo, String expectedHead, List<String> expectedComments) throws Exception
  56. {
  57. File source = new File(sourceRepositoriesBase, srcRepo);
  58. GitRepository gitRepository = createGitRepository(AgentType.LOCAL);
  59. setRepositoryProperties(gitRepository, source);
  60. BuildRepositoryChanges changes = gitRepository.collectChangesSinceLastBuild("GIT-PLAN", previousChangeset);
  61. String vcsRevisionKey = changes.getVcsRevisionKey();
  62. Assert.assertNotNull(vcsRevisionKey);
  63. Assert.assertEquals(vcsRevisionKey, expectedHead);
  64. List<String> comments = Lists.transform(changes.getChanges(), new ExtractComments());
  65. Assert.assertEquals(comments, expectedComments);
  66. }
  67. @Test(dataProvider = "subsequentChangeDetectionsData", singleThreaded = true)
  68. public void testSubsequentChangeDetectionsWithCache(String previousChangeset, String srcRepo, String expectedHead, List<String> expectedComments) throws Exception
  69. {
  70. File source = new File(sourceRepositoriesBase, srcRepo);
  71. File singleSource = new File(sourceRepositoriesBase, "testSubsequentChangeDetectionsWithCache_Repo");
  72. FileUtils.deleteQuietly(singleSource);
  73. FileUtils.forceMkdir(singleSource);
  74. FileUtils.copyDirectory(source, singleSource);
  75. File workingDir = new File(sourceRepositoriesBase, "testSubsequentChangeDetectionsWithCache_WorkDir");
  76. FileUtils.forceMkdir(workingDir);
  77. GitRepository gitRepository = createGitRepository(AgentType.LOCAL);
  78. gitRepository.setWorkingDir(workingDir);
  79. setRepositoryProperties(gitRepository, singleSource);
  80. BuildRepositoryChanges changes = gitRepository.collectChangesSinceLastBuild("GIT-PLAN", previousChangeset);
  81. String vcsRevisionKey = changes.getVcsRevisionKey();
  82. Assert.assertNotNull(vcsRevisionKey);
  83. Assert.assertEquals(vcsRevisionKey, expectedHead);
  84. List<String> comments = Lists.transform(changes.getChanges(), new ExtractComments());
  85. Assert.assertEquals(comments, expectedComments);
  86. }
  87. @Test
  88. public void testChangeDetectionAfterPreviousChangesetBecameDetached() throws Exception
  89. {
  90. File detachedSrc = new File(sourceRepositoriesBase, "3");
  91. File nextSrc = new File(sourceRepositoriesBase, "4");
  92. File singleSource = createTempDirectory();
  93. GitRepository gitRepository = createGitRepository(AgentType.LOCAL);
  94. setRepositoryProperties(gitRepository, singleSource);
  95. // feed the cache or the detached change won't be known
  96. FileUtils.copyDirectory(detachedSrc, singleSource);
  97. BuildRepositoryChanges initialChanges = gitRepository.collectChangesSinceLastBuild("GIT-PLAN", CHG_2); // initial build does not fetch to cache - maybe it should?
  98. Assert.assertEquals(initialChanges.getVcsRevisionKey(), CHG_3);
  99. FileUtils.cleanDirectory(singleSource);
  100. FileUtils.copyDirectory(nextSrc, singleSource);
  101. BuildRepositoryChanges changes = gitRepository.collectChangesSinceLastBuild("GIT-PLAN", CHG_3);
  102. Assert.assertEquals(changes.getVcsRevisionKey(), CHG_4);
  103. List<String> comments = Lists.transform(changes.getChanges(), new ExtractComments());
  104. Assert.assertEquals(comments, Arrays.asList(COMMENT_4));
  105. }
  106. @DataProvider
  107. Object[][] crossSourceCheckoutData()
  108. {
  109. List<String[]> data = new ArrayList<String[]>();
  110. for (int src = 1; src <= 5; src++)
  111. {
  112. for (int dst = 1; dst <= 5; dst++)
  113. {
  114. data.add(new String[]{String.valueOf(src), String.valueOf(dst)});
  115. }
  116. }
  117. return data.toArray(new Object[data.size()][]);
  118. }
  119. @Test(dataProvider = "crossSourceCheckoutData")
  120. public void testCrossSourceCheckout(String prevRepo, String newRepo) throws Exception
  121. {
  122. GitRepository gitRepository = createGitRepository(AgentType.LOCAL);
  123. File prev = new File(sourceRepositoriesBase, prevRepo);
  124. setRepositoryProperties(gitRepository, prev);
  125. String prevRev = gitRepository.collectChangesSinceLastBuild("GIT-PLAN", null).getVcsRevisionKey();
  126. BuildContext buildContext = Mockito.mock(BuildContext.class);
  127. Mockito.when(buildContext.getPlanKey()).thenReturn("GIT-PLAN");
  128. gitRepository.retrieveSourceCode(buildContext, prevRev, getCheckoutDir(gitRepository));
  129. File next = new File(sourceRepositoriesBase, newRepo);
  130. setRepositoryProperties(gitRepository, next);
  131. String newRev = gitRepository.collectChangesSinceLastBuild("GIT-PLAN", null).getVcsRevisionKey();
  132. gitRepository.retrieveSourceCode(buildContext, newRev, getCheckoutDir(gitRepository));
  133. verifyContents(getCheckoutDir(gitRepository), "detached-git-repos-contents/" + newRepo + ".zip");
  134. }
  135. @DataProvider
  136. Object[][] specificSourceCheckoutData()
  137. {
  138. return new String[][]{
  139. {CHG_1, "1"},
  140. {CHG_2, "2"},
  141. {CHG_3, "3"},
  142. {CHG_4, "4"},
  143. {CHG_5, "5"},
  144. };
  145. }
  146. @Test(dataProvider = "specificSourceCheckoutData")
  147. public void testSpecificSourceCheckout(String revision, String contents) throws Exception
  148. {
  149. GitRepository gitRepository = createGitRepository(AgentType.LOCAL);
  150. File prev = new File(sourceRepositoriesBase, "5");
  151. setRepositoryProperties(gitRepository, prev);
  152. BuildContext buildContext = Mockito.mock(BuildContext.class);
  153. Mockito.when(buildContext.getPlanKey()).thenReturn("GIT-PLAN");
  154. File checkoutDir = new File(gitRepository.getWorkingDirectory(), "checkout");
  155. gitRepository.retrieveSourceCode(buildContext, revision, checkoutDir);
  156. verifyContents(checkoutDir, "detached-git-repos-contents/" + contents + ".zip");
  157. }
  158. }