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