001/*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *   http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied.  See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019package org.apache.maven.scm.provider.git.command.changelog;
020
021import java.io.File;
022import java.util.ArrayList;
023import java.util.Arrays;
024import java.util.Collections;
025import java.util.List;
026
027import org.apache.maven.scm.ChangeSet;
028import org.apache.maven.scm.ScmFileSet;
029import org.apache.maven.scm.ScmRevision;
030import org.apache.maven.scm.command.changelog.ChangeLogScmRequest;
031import org.apache.maven.scm.command.changelog.ChangeLogScmResult;
032import org.apache.maven.scm.command.checkout.CheckOutScmResult;
033import org.apache.maven.scm.provider.ScmProvider;
034import org.apache.maven.scm.provider.git.GitScmTestUtils;
035import org.apache.maven.scm.repository.ScmRepository;
036import org.apache.maven.scm.tck.command.changelog.ChangeLogCommandTckTest;
037import org.junit.Test;
038
039import static org.hamcrest.CoreMatchers.startsWith;
040import static org.hamcrest.MatcherAssert.assertThat;
041import static org.junit.Assert.assertEquals;
042
043/**
044 * @author <a href="mailto:struberg@yahoo.de">Mark Struberg</a>
045 */
046public abstract class GitChangeLogCommandTckTest extends ChangeLogCommandTckTest {
047    public static final long SLEEP_TIME_IN_MILLIS = 250L;
048
049    /**
050     * {@inheritDoc}
051     */
052    public void initRepo() throws Exception {
053        GitScmTestUtils.initRepo("src/test/resources/linear-changelog/", getRepositoryRoot(), getWorkingCopy());
054    }
055
056    @Override
057    protected CheckOutScmResult checkOut(File workingDirectory, ScmRepository repository) throws Exception {
058        try {
059            return super.checkOut(workingDirectory, repository);
060        } finally {
061            GitScmTestUtils.setDefaultGitConfig(workingDirectory);
062        }
063    }
064
065    @Test
066    public void testChangeLogCommandFromHeadAncestorAndHead() throws Exception {
067        Thread.sleep(SLEEP_TIME_IN_MILLIS);
068        ScmRepository scmRepository = getScmRepository();
069        ScmProvider provider = getScmManager().getProviderByRepository(scmRepository);
070        ScmFileSet fileSet = new ScmFileSet(getWorkingCopy());
071
072        ChangeLogScmRequest clr = new ChangeLogScmRequest(scmRepository, fileSet);
073        String startVersion = "HEAD~1";
074        clr.setStartRevision(new ScmRevision(startVersion));
075        String endVersion = "HEAD";
076        clr.setEndRevision(new ScmRevision(endVersion));
077        ChangeLogScmResult changelogResult = provider.changeLog(clr);
078
079        List<ChangeSet> logEntries = changelogResult.getChangeLog().getChangeSets();
080        assertEquals(
081                String.format("changelog for %s..%s returned bad number of commits", startVersion, endVersion),
082                1,
083                logEntries.size());
084
085        assertThat("bad head commit SHA1 retrieved", logEntries.get(0).getRevision(), startsWith("464921b"));
086    }
087
088    @Test
089    public void testChangeLogCommandFromHeadToHead() throws Exception {
090        Thread.sleep(SLEEP_TIME_IN_MILLIS);
091        ScmRepository scmRepository = getScmRepository();
092        ScmProvider provider = getScmManager().getProviderByRepository(scmRepository);
093        ScmFileSet fileSet = new ScmFileSet(getWorkingCopy());
094
095        ChangeLogScmRequest clr = new ChangeLogScmRequest(scmRepository, fileSet);
096        String startVersion = "HEAD";
097        clr.setStartRevision(new ScmRevision(startVersion));
098        String endVersion = "HEAD";
099        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}