View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.scm.provider.git.command.changelog;
20  
21  import java.io.File;
22  import java.util.ArrayList;
23  import java.util.Arrays;
24  import java.util.Collections;
25  import java.util.List;
26  
27  import org.apache.maven.scm.ChangeSet;
28  import org.apache.maven.scm.ScmFileSet;
29  import org.apache.maven.scm.ScmRevision;
30  import org.apache.maven.scm.command.changelog.ChangeLogScmRequest;
31  import org.apache.maven.scm.command.changelog.ChangeLogScmResult;
32  import org.apache.maven.scm.command.checkout.CheckOutScmResult;
33  import org.apache.maven.scm.provider.ScmProvider;
34  import org.apache.maven.scm.provider.git.GitScmTestUtils;
35  import org.apache.maven.scm.repository.ScmRepository;
36  import org.apache.maven.scm.tck.command.changelog.ChangeLogCommandTckTest;
37  import org.junit.Test;
38  
39  import static org.hamcrest.CoreMatchers.startsWith;
40  import static org.hamcrest.MatcherAssert.assertThat;
41  import static org.junit.Assert.assertEquals;
42  
43  /**
44   * @author <a href="mailto:struberg@yahoo.de">Mark Struberg</a>
45   */
46  public abstract class GitChangeLogCommandTckTest extends ChangeLogCommandTckTest {
47      public static final long SLEEP_TIME_IN_MILLIS = 250L;
48  
49      /**
50       * {@inheritDoc}
51       */
52      public void initRepo() throws Exception {
53          GitScmTestUtils.initRepo("src/test/resources/linear-changelog/", getRepositoryRoot(), getWorkingCopy());
54      }
55  
56      @Override
57      protected CheckOutScmResult checkOut(File workingDirectory, ScmRepository repository) throws Exception {
58          try {
59              return super.checkOut(workingDirectory, repository);
60          } finally {
61              GitScmTestUtils.setDefaultGitConfig(workingDirectory);
62          }
63      }
64  
65      @Test
66      public void testChangeLogCommandFromHeadAncestorAndHead() throws Exception {
67          Thread.sleep(SLEEP_TIME_IN_MILLIS);
68          ScmRepository scmRepository = getScmRepository();
69          ScmProvider provider = getScmManager().getProviderByRepository(scmRepository);
70          ScmFileSet fileSet = new ScmFileSet(getWorkingCopy());
71  
72          ChangeLogScmRequest clr = new ChangeLogScmRequest(scmRepository, fileSet);
73          String startVersion = "HEAD~1";
74          clr.setStartRevision(new ScmRevision(startVersion));
75          String endVersion = "HEAD";
76          clr.setEndRevision(new ScmRevision(endVersion));
77          ChangeLogScmResult changelogResult = provider.changeLog(clr);
78  
79          List<ChangeSet> logEntries = changelogResult.getChangeLog().getChangeSets();
80          assertEquals(
81                  String.format("changelog for %s..%s returned bad number of commits", startVersion, endVersion),
82                  1,
83                  logEntries.size());
84  
85          assertThat("bad head commit SHA1 retrieved", logEntries.get(0).getRevision(), startsWith("464921b"));
86      }
87  
88      @Test
89      public void testChangeLogCommandFromHeadToHead() throws Exception {
90          Thread.sleep(SLEEP_TIME_IN_MILLIS);
91          ScmRepository scmRepository = getScmRepository();
92          ScmProvider provider = getScmManager().getProviderByRepository(scmRepository);
93          ScmFileSet fileSet = new ScmFileSet(getWorkingCopy());
94  
95          ChangeLogScmRequest clr = new ChangeLogScmRequest(scmRepository, fileSet);
96          String startVersion = "HEAD";
97          clr.setStartRevision(new ScmRevision(startVersion));
98          String endVersion = "HEAD";
99          clr.setEndRevision(new ScmRevision(endVersion));
100         ChangeLogScmResult changelogResult = provider.changeLog(clr);
101 
102         List<ChangeSet> logEntries = changelogResult.getChangeLog().getChangeSets();
103         assertEquals(
104                 String.format("changelog for %s..%s returned bad number of commits", startVersion, endVersion),
105                 0,
106                 logEntries.size());
107     }
108 
109     @Test
110     public void testChangeLogCommandFromUndefinedToHead() throws Exception {
111         Thread.sleep(SLEEP_TIME_IN_MILLIS);
112         ScmRepository scmRepository = getScmRepository();
113         ScmProvider provider = getScmManager().getProviderByRepository(scmRepository);
114         ScmFileSet fileSet = new ScmFileSet(getWorkingCopy());
115 
116         ChangeLogScmRequest clr = new ChangeLogScmRequest(scmRepository, fileSet);
117         String endVersion = "HEAD";
118         clr.setEndRevision(new ScmRevision(endVersion));
119         ChangeLogScmResult changelogResult = provider.changeLog(clr);
120 
121         List<ChangeSet> logEntries = changelogResult.getChangeLog().getChangeSets();
122         assertEquals(
123                 String.format("changelog for ..%s returned bad number of commits", endVersion), 0, logEntries.size());
124     }
125 
126     @Test
127     public void testChangeLogCommandFromVersionToUndefined() throws Exception {
128         Thread.sleep(SLEEP_TIME_IN_MILLIS);
129         ScmRepository scmRepository = getScmRepository();
130         ScmProvider provider = getScmManager().getProviderByRepository(scmRepository);
131         ScmFileSet fileSet = new ScmFileSet(getWorkingCopy());
132 
133         ChangeLogScmRequest clr = new ChangeLogScmRequest(scmRepository, fileSet);
134         String startVersion = "e3864d9";
135         clr.setStartRevision(new ScmRevision(startVersion));
136         ChangeLogScmResult changelogResult = provider.changeLog(clr);
137 
138         List<ChangeSet> logEntries = changelogResult.getChangeLog().getChangeSets();
139         assertEquals(
140                 String.format("changelog for %s.. returned bad number of commits", startVersion), 2, logEntries.size());
141 
142         assertThat("bad commit SHA1 retrieved", logEntries.get(0).getRevision(), startsWith("464921b"));
143         assertThat("bad commit SHA1 retrieved", logEntries.get(1).getRevision(), startsWith("db46d63"));
144     }
145 
146     @Test
147     public void testChangeLogCommandFromVoneToVtwo() throws Exception {
148         Thread.sleep(SLEEP_TIME_IN_MILLIS);
149         ScmRepository scmRepository = getScmRepository();
150         ScmProvider provider = getScmManager().getProviderByRepository(scmRepository);
151         ScmFileSet fileSet = new ScmFileSet(getWorkingCopy());
152 
153         ChangeLogScmRequest clr = new ChangeLogScmRequest(scmRepository, fileSet);
154         String startVersion = "0f1e817";
155         clr.setStartRevision(new ScmRevision(startVersion));
156         String endVersion = "db46d63";
157         clr.setEndRevision(new ScmRevision(endVersion));
158         ChangeLogScmResult changelogResult = provider.changeLog(clr);
159 
160         List<ChangeSet> logEntries = changelogResult.getChangeLog().getChangeSets();
161         assertEquals(
162                 String.format("changelog for %s.. returned bad number of commits", startVersion), 2, logEntries.size());
163 
164         assertThat("bad commit SHA1 retrieved", logEntries.get(0).getRevision(), startsWith("db46d63"));
165         assertThat("bad commit SHA1 retrieved", logEntries.get(1).getRevision(), startsWith("e3864d9"));
166     }
167 
168     @Test
169     public void testChangeLogCommandWithStartEndInBadOrder() throws Exception {
170         Thread.sleep(SLEEP_TIME_IN_MILLIS);
171         ScmRepository scmRepository = getScmRepository();
172         ScmProvider provider = getScmManager().getProviderByRepository(scmRepository);
173         ScmFileSet fileSet = new ScmFileSet(getWorkingCopy());
174 
175         ChangeLogScmRequest clr = new ChangeLogScmRequest(scmRepository, fileSet);
176         String startVersion = "db46d63";
177         clr.setStartRevision(new ScmRevision(startVersion));
178         String endVersion = "0f1e817";
179         clr.setEndRevision(new ScmRevision(endVersion));
180         ChangeLogScmResult changelogResult = provider.changeLog(clr);
181 
182         List<ChangeSet> logEntries = changelogResult.getChangeLog().getChangeSets();
183         assertEquals(
184                 String.format("changelog for %s..%s should return no commits", startVersion, endVersion),
185                 0,
186                 logEntries.size());
187     }
188 
189     @Test
190     public void testChangeLogCommandFromHeadToStartOfRepository() throws Exception {
191         Thread.sleep(SLEEP_TIME_IN_MILLIS);
192         ScmRepository scmRepository = getScmRepository();
193         ScmProvider provider = getScmManager().getProviderByRepository(scmRepository);
194         ScmFileSet fileSet = new ScmFileSet(getWorkingCopy());
195 
196         ChangeLogScmRequest clr = new ChangeLogScmRequest(scmRepository, fileSet);
197         String version = "HEAD";
198         clr.setRevision(new ScmRevision(version));
199         ChangeLogScmResult changelogResult = provider.changeLog(clr);
200 
201         List<ChangeSet> logEntries = changelogResult.getChangeLog().getChangeSets();
202         assertEquals(String.format("changelog for %s returned bad number of commits", version), 5, logEntries.size());
203     }
204 
205     @Test
206     public void testChangeLogCommandFromVersionToStartOfRepository() throws Exception {
207         Thread.sleep(SLEEP_TIME_IN_MILLIS);
208         ScmRepository scmRepository = getScmRepository();
209         ScmProvider provider = getScmManager().getProviderByRepository(scmRepository);
210         ScmFileSet fileSet = new ScmFileSet(getWorkingCopy());
211 
212         ChangeLogScmRequest clr = new ChangeLogScmRequest(scmRepository, fileSet);
213         String version = "db46d63";
214         clr.setRevision(new ScmRevision(version));
215         ChangeLogScmResult changelogResult = provider.changeLog(clr);
216 
217         List<ChangeSet> logEntries = changelogResult.getChangeLog().getChangeSets();
218         assertEquals(String.format("changelog for %s returned bad number of commits", version), 4, logEntries.size());
219 
220         assertThat("bad commit SHA1 retrieved", logEntries.get(0).getRevision(), startsWith("db46d63"));
221         assertThat("bad commit SHA1 retrieved", logEntries.get(1).getRevision(), startsWith("e3864d9"));
222         assertThat("bad commit SHA1 retrieved", logEntries.get(2).getRevision(), startsWith("0f1e817"));
223         assertThat("bad commit SHA1 retrieved", logEntries.get(3).getRevision(), startsWith("e75cb5a"));
224 
225         List<String> tags4 = Arrays.asList("Tag4a", "Tag4b");
226         List<String> tags2 = Collections.singletonList("Tag2");
227         List<String> noTags = Collections.emptyList();
228 
229         assertEquals("Incorrect tags found", tags4, sorted(logEntries.get(0).getTags()));
230         assertEquals("Incorrect tags found", noTags, sorted(logEntries.get(1).getTags()));
231         assertEquals("Incorrect tags found", tags2, sorted(logEntries.get(2).getTags()));
232         assertEquals("Incorrect tags found", noTags, sorted(logEntries.get(3).getTags()));
233     }
234 
235     private List<String> sorted(List<String> input) {
236         List<String> result = new ArrayList<>(input);
237         Collections.sort(result);
238         return result;
239     }
240 }