001package org.apache.maven.scm.provider.git.command.changelog;
002
003/*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements.  See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership.  The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License.  You may obtain a copy of the License at
011 *
012 *    http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied.  See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022import org.apache.maven.scm.ChangeSet;
023import org.apache.maven.scm.ScmFileSet;
024import org.apache.maven.scm.ScmRevision;
025import org.apache.maven.scm.command.changelog.ChangeLogScmRequest;
026import org.apache.maven.scm.command.changelog.ChangeLogScmResult;
027import org.apache.maven.scm.command.checkout.CheckOutScmResult;
028import org.apache.maven.scm.provider.ScmProvider;
029import org.apache.maven.scm.provider.git.GitScmTestUtils;
030import org.apache.maven.scm.repository.ScmRepository;
031import org.apache.maven.scm.tck.command.changelog.ChangeLogCommandTckTest;
032
033import java.io.File;
034import java.util.List;
035
036import static org.hamcrest.CoreMatchers.startsWith;
037import static org.hamcrest.MatcherAssert.assertThat;
038
039/**
040 * @author <a href="mailto:struberg@yahoo.de">Mark Struberg</a>
041 */
042public abstract class GitChangeLogCommandTckTest
043    extends ChangeLogCommandTckTest
044{
045    public static final long SLEEP_TIME_IN_MILLIS = 250L;
046
047    /** {@inheritDoc} */
048    public void initRepo()
049        throws Exception
050    {
051        GitScmTestUtils.initRepo( "src/test/resources/linear-changelog/", getRepositoryRoot(), getWorkingCopy() );
052    }
053
054    @Override
055    protected CheckOutScmResult checkOut( File workingDirectory, ScmRepository repository ) throws Exception
056    {
057        try
058        {
059            return super.checkOut( workingDirectory, repository );
060        }
061        finally
062        {
063            GitScmTestUtils.setDefaultUser( workingDirectory );
064        }
065    }
066
067    public void testChangeLogCommandFromHeadAncestorAndHead()
068        throws Exception
069    {
070        Thread.sleep( SLEEP_TIME_IN_MILLIS );
071        ScmRepository scmRepository = getScmRepository();
072        ScmProvider provider = getScmManager().getProviderByRepository( scmRepository );
073        ScmFileSet fileSet = new ScmFileSet( getWorkingCopy() );
074
075        ChangeLogScmRequest clr = new ChangeLogScmRequest( scmRepository, fileSet );
076        String startVersion = "HEAD~1";
077        clr.setStartRevision( new ScmRevision( startVersion ) );
078        String endVersion = "HEAD";
079        clr.setEndRevision( new ScmRevision( endVersion ) );
080        ChangeLogScmResult changelogResult = provider.changeLog( clr );
081
082        List<ChangeSet> logEntries = changelogResult.getChangeLog().getChangeSets();
083        assertEquals( String.format( "changelog for %s..%s returned bad number of commits", startVersion, endVersion ),
084                1, logEntries.size() );
085
086
087        assertThat( "bad head commit SHA1 retrieved", logEntries.get( 0 ).getRevision(), startsWith( "464921b" ) );
088    }
089
090    public void testChangeLogCommandFromHeadToHead()
091            throws Exception
092    {
093        Thread.sleep( SLEEP_TIME_IN_MILLIS );
094        ScmRepository scmRepository = getScmRepository();
095        ScmProvider provider = getScmManager().getProviderByRepository( scmRepository );
096        ScmFileSet fileSet = new ScmFileSet( getWorkingCopy() );
097
098        ChangeLogScmRequest clr = new ChangeLogScmRequest( scmRepository, fileSet );
099        String startVersion = "HEAD";
100        clr.setStartRevision( new ScmRevision( startVersion ) );
101        String endVersion = "HEAD";
102        clr.setEndRevision( new ScmRevision( endVersion ) );
103        ChangeLogScmResult changelogResult = provider.changeLog( clr );
104
105        List<ChangeSet> logEntries = changelogResult.getChangeLog().getChangeSets();
106        assertEquals( String.format( "changelog for %s..%s returned bad number of commits", startVersion, endVersion ),
107                0, logEntries.size() );
108    }
109
110    public void testChangeLogCommandFromUndefinedToHead()
111            throws Exception
112    {
113        Thread.sleep( SLEEP_TIME_IN_MILLIS );
114        ScmRepository scmRepository = getScmRepository();
115        ScmProvider provider = getScmManager().getProviderByRepository( scmRepository );
116        ScmFileSet fileSet = new ScmFileSet( getWorkingCopy() );
117
118        ChangeLogScmRequest clr = new ChangeLogScmRequest( scmRepository, fileSet );
119        String endVersion = "HEAD";
120        clr.setEndRevision( new ScmRevision( endVersion ) );
121        ChangeLogScmResult changelogResult = provider.changeLog( clr );
122
123        List<ChangeSet> logEntries = changelogResult.getChangeLog().getChangeSets();
124        assertEquals( String.format( "changelog for ..%s returned bad number of commits", endVersion ),
125                0, logEntries.size() );
126    }
127
128    public void testChangeLogCommandFromVersionToUndefined()
129            throws Exception
130    {
131        Thread.sleep( SLEEP_TIME_IN_MILLIS );
132        ScmRepository scmRepository = getScmRepository();
133        ScmProvider provider = getScmManager().getProviderByRepository( scmRepository );
134        ScmFileSet fileSet = new ScmFileSet( getWorkingCopy() );
135
136        ChangeLogScmRequest clr = new ChangeLogScmRequest( scmRepository, fileSet );
137        String startVersion = "e3864d9";
138        clr.setStartRevision( new ScmRevision( startVersion ) );
139        ChangeLogScmResult changelogResult = provider.changeLog( clr );
140
141        List<ChangeSet> logEntries = changelogResult.getChangeLog().getChangeSets();
142        assertEquals( String.format( "changelog for %s.. returned bad number of commits", startVersion ),
143                2, logEntries.size() );
144
145        assertThat( "bad commit SHA1 retrieved", logEntries.get( 0 ).getRevision(), startsWith( "464921b" ) );
146        assertThat( "bad commit SHA1 retrieved", logEntries.get( 1 ).getRevision(), startsWith( "db46d63" ) );
147    }
148
149    public void testChangeLogCommandFromVoneToVtwo()
150            throws Exception
151    {
152        Thread.sleep( SLEEP_TIME_IN_MILLIS );
153        ScmRepository scmRepository = getScmRepository();
154        ScmProvider provider = getScmManager().getProviderByRepository( scmRepository );
155        ScmFileSet fileSet = new ScmFileSet( getWorkingCopy() );
156
157        ChangeLogScmRequest clr = new ChangeLogScmRequest( scmRepository, fileSet );
158        String startVersion = "0f1e817";
159        clr.setStartRevision( new ScmRevision( startVersion ) );
160        String endVersion = "db46d63";
161        clr.setEndRevision( new ScmRevision( endVersion ) );
162        ChangeLogScmResult changelogResult = provider.changeLog( clr );
163
164        List<ChangeSet> logEntries = changelogResult.getChangeLog().getChangeSets();
165        assertEquals( String.format( "changelog for %s.. returned bad number of commits", startVersion ),
166                2, logEntries.size() );
167
168        assertThat( "bad commit SHA1 retrieved", logEntries.get( 0 ).getRevision(), startsWith( "db46d63" ) );
169        assertThat( "bad commit SHA1 retrieved", logEntries.get( 1 ).getRevision(), startsWith( "e3864d9" ) );
170    }
171
172    public void testChangeLogCommandWithStartEndInBadOrder()
173            throws Exception
174    {
175        Thread.sleep( SLEEP_TIME_IN_MILLIS );
176        ScmRepository scmRepository = getScmRepository();
177        ScmProvider provider = getScmManager().getProviderByRepository( scmRepository );
178        ScmFileSet fileSet = new ScmFileSet( getWorkingCopy() );
179
180        ChangeLogScmRequest clr = new ChangeLogScmRequest( scmRepository, fileSet );
181        String startVersion = "db46d63";
182        clr.setStartRevision( new ScmRevision( startVersion ) );
183        String endVersion = "0f1e817";
184        clr.setEndRevision( new ScmRevision( endVersion ) );
185        ChangeLogScmResult changelogResult = provider.changeLog( clr );
186
187        List<ChangeSet> logEntries = changelogResult.getChangeLog().getChangeSets();
188        assertEquals( String.format( "changelog for %s..%s should return no commits", startVersion, endVersion ),
189                0, logEntries.size() );
190    }
191
192    public void testChangeLogCommandFromHeadToStartOfRepository()
193            throws Exception
194    {
195        Thread.sleep( SLEEP_TIME_IN_MILLIS );
196        ScmRepository scmRepository = getScmRepository();
197        ScmProvider provider = getScmManager().getProviderByRepository( scmRepository );
198        ScmFileSet fileSet = new ScmFileSet( getWorkingCopy() );
199
200        ChangeLogScmRequest clr = new ChangeLogScmRequest( scmRepository, fileSet );
201        String version = "HEAD";
202        clr.setRevision( new ScmRevision( version ) );
203        ChangeLogScmResult changelogResult = provider.changeLog( clr );
204
205        List<ChangeSet> logEntries = changelogResult.getChangeLog().getChangeSets();
206        assertEquals( String.format( "changelog for %s returned bad number of commits", version ),
207                5, logEntries.size() );
208    }
209
210    public void testChangeLogCommandFromVersionToStartOfRepository()
211            throws Exception
212    {
213        Thread.sleep( SLEEP_TIME_IN_MILLIS );
214        ScmRepository scmRepository = getScmRepository();
215        ScmProvider provider = getScmManager().getProviderByRepository( scmRepository );
216        ScmFileSet fileSet = new ScmFileSet( getWorkingCopy() );
217
218        ChangeLogScmRequest clr = new ChangeLogScmRequest( scmRepository, fileSet );
219        String version = "db46d63";
220        clr.setRevision( new ScmRevision( version ) );
221        ChangeLogScmResult changelogResult = provider.changeLog( clr );
222
223        List<ChangeSet> logEntries = changelogResult.getChangeLog().getChangeSets();
224        assertEquals( String.format( "changelog for %s returned bad number of commits", version ),
225                4, logEntries.size() );
226
227        assertThat( "bad commit SHA1 retrieved", logEntries.get( 0 ).getRevision(), startsWith( "db46d63" ) );
228        assertThat( "bad commit SHA1 retrieved", logEntries.get( 1 ).getRevision(), startsWith( "e3864d9" ) );
229        assertThat( "bad commit SHA1 retrieved", logEntries.get( 2 ).getRevision(), startsWith( "0f1e817" ) );
230        assertThat( "bad commit SHA1 retrieved", logEntries.get( 3 ).getRevision(), startsWith( "e75cb5a" ) );
231    }
232}