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}