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.tck.command.checkin; 020 021import java.io.File; 022import java.io.FileWriter; 023import java.io.PrintWriter; 024import java.util.List; 025import java.util.Map; 026 027import org.apache.maven.scm.CommandParameter; 028import org.apache.maven.scm.CommandParameters; 029import org.apache.maven.scm.ScmFile; 030import org.apache.maven.scm.ScmFileSet; 031import org.apache.maven.scm.ScmFileStatus; 032import org.apache.maven.scm.ScmTckTestCase; 033import org.apache.maven.scm.command.add.AddScmResult; 034import org.apache.maven.scm.command.checkin.CheckInScmResult; 035import org.apache.maven.scm.command.checkout.CheckOutScmResult; 036import org.apache.maven.scm.provider.ScmProvider; 037import org.apache.maven.scm.util.FilenameUtils; 038import org.codehaus.plexus.util.FileUtils; 039import org.junit.Assume; 040import org.junit.Test; 041 042import static org.junit.Assert.assertEquals; 043import static org.junit.Assert.assertFalse; 044import static org.junit.Assert.assertNotNull; 045import static org.junit.Assert.assertTrue; 046 047/** 048 * This test tests the check out command. 049 * 050 * @author <a href="mailto:brett@apache.org">Brett Porter</a> 051 */ 052public abstract class CheckInCommandTckTest extends ScmTckTestCase { 053 @Test 054 public void testCheckInCommandTest() throws Exception { 055 // Make sure that the correct files was checked out 056 File fooJava = new File(getWorkingCopy(), "src/main/java/Foo.java"); 057 058 File barJava = new File(getWorkingCopy(), "src/main/java/Bar.java"); 059 060 File readmeTxt = new File(getWorkingCopy(), "readme.txt"); 061 062 assertFalse("check Foo.java doesn't yet exist", fooJava.canRead()); 063 064 assertFalse("check Bar.java doesn't yet exist", barJava.canRead()); 065 066 assertTrue("check can read readme.txt", readmeTxt.canRead()); 067 068 // Change the files 069 createFooJava(fooJava); 070 071 createBarJava(barJava); 072 073 changeReadmeTxt(readmeTxt); 074 075 AddScmResult addResult = getScmManager() 076 .add(getScmRepository(), new ScmFileSet(getWorkingCopy(), "src/main/java/Foo.java", null)); 077 078 assertResultIsSuccess(addResult); 079 080 List<ScmFile> files = addResult.getAddedFiles(); 081 assertNotNull(files); 082 assertEquals(1, files.size()); 083 // SCM-998: filename separators not yet harmonized 084 assertEquals( 085 "src/main/java/Foo.java", 086 FilenameUtils.normalizeFilename(files.get(0).getPath())); 087 088 CommandParameters commandParameters = new CommandParameters(); 089 commandParameters.setString(CommandParameter.MESSAGE, "Commit message"); 090 091 CheckInScmResult result = 092 getScmManager().checkIn(getScmRepository(), new ScmFileSet(getWorkingCopy()), commandParameters); 093 094 assertResultIsSuccess(result); 095 096 files = result.getCheckedInFiles(); 097 assertNotNull(files); 098 assertEquals(2, files.size()); 099 100 Map<String, ScmFile> fileMap = mapFilesByPath(files); 101 ScmFile file1 = fileMap.get("src/main/java/Foo.java"); 102 assertNotNull(file1); 103 assertEquals(ScmFileStatus.CHECKED_IN, file1.getStatus()); 104 105 ScmFile file2 = fileMap.get("readme.txt"); 106 assertNotNull(file2); 107 assertEquals(ScmFileStatus.CHECKED_IN, file2.getStatus()); 108 109 CheckOutScmResult checkoutResult = 110 getScmManager().checkOut(getScmRepository(), new ScmFileSet(getAssertionCopy())); 111 112 assertResultIsSuccess(checkoutResult); 113 114 fooJava = new File(getAssertionCopy(), "src/main/java/Foo.java"); 115 116 barJava = new File(getAssertionCopy(), "src/main/java/Bar.java"); 117 118 readmeTxt = new File(getAssertionCopy(), "readme.txt"); 119 120 assertTrue("check can read Foo.java", fooJava.canRead()); 121 122 assertFalse("check Bar.java doesn't exist", barJava.canRead()); 123 124 assertTrue("check can read readme.txt", readmeTxt.canRead()); 125 126 assertEquals("check readme.txt contents", "changed file", FileUtils.fileRead(readmeTxt)); 127 } 128 129 @Test 130 public void testCheckInCommandPartialFileset() throws Exception { 131 // Make sure that the correct files was checked out 132 File fooJava = new File(getWorkingCopy(), "src/main/java/Foo.java"); 133 134 File barJava = new File(getWorkingCopy(), "src/main/java/Bar.java"); 135 136 File readmeTxt = new File(getWorkingCopy(), "readme.txt"); 137 138 assertFalse("check Foo.java doesn't yet exist", fooJava.canRead()); 139 140 assertFalse("check Bar.java doesn't yet exist", barJava.canRead()); 141 142 assertTrue("check can read readme.txt", readmeTxt.canRead()); 143 144 // Change the files 145 createFooJava(fooJava); 146 147 createBarJava(barJava); 148 149 changeReadmeTxt(readmeTxt); 150 151 AddScmResult addResult = getScmManager() 152 .getProviderByUrl(getScmUrl()) 153 .add(getScmRepository(), new ScmFileSet(getWorkingCopy(), "src/main/java/Foo.java", null)); 154 155 assertResultIsSuccess(addResult); 156 157 CommandParameters commandParameters = new CommandParameters(); 158 commandParameters.setString(CommandParameter.MESSAGE, "Commit message"); 159 160 CheckInScmResult result = getScmManager() 161 .checkIn(getScmRepository(), new ScmFileSet(getWorkingCopy(), "**/Foo.java", null), commandParameters); 162 163 assertResultIsSuccess(result); 164 165 List<ScmFile> files = result.getCheckedInFiles(); 166 assertNotNull(files); 167 assertEquals(1, files.size()); 168 169 ScmFile file1 = files.get(0); 170 assertEquals(ScmFileStatus.CHECKED_IN, file1.getStatus()); 171 assertPath("src/main/java/Foo.java", file1.getPath()); 172 173 CheckOutScmResult checkoutResult = 174 getScmManager().checkOut(getScmRepository(), new ScmFileSet(getAssertionCopy())); 175 176 assertResultIsSuccess(checkoutResult); 177 178 fooJava = new File(getAssertionCopy(), "src/main/java/Foo.java"); 179 180 barJava = new File(getAssertionCopy(), "src/main/java/Bar.java"); 181 182 readmeTxt = new File(getAssertionCopy(), "readme.txt"); 183 184 assertTrue("check can read Foo.java", fooJava.canRead()); 185 186 assertFalse("check Bar.java doesn't exist", barJava.canRead()); 187 188 assertTrue("check can read readme.txt", readmeTxt.canRead()); 189 190 assertEquals("check readme.txt contents", "/readme.txt", FileUtils.fileRead(readmeTxt)); 191 } 192 193 @Test 194 public void testCheckInCommandFilesetWithBasedirOtherThanWorkingCopyRoot() throws Exception { 195 ScmProvider scmProvider = getScmManager().getProviderByUrl(getScmUrl()); 196 197 Assume.assumeFalse( 198 "Local provider does not properly support basedir", 199 scmProvider.getScmType().equals("local")); 200 // Make sure that the correct files was checked out 201 File fooJava = new File(getWorkingCopy(), "src/main/java/Foo.java"); 202 203 assertFalse("check Foo.java doesn't yet exist", fooJava.canRead()); 204 205 // Change the files 206 createFooJava(fooJava); 207 208 AddScmResult addResult = scmProvider.add( 209 getScmRepository(), new ScmFileSet(new File(getWorkingCopy(), "src"), "main/java/Foo.java", null)); 210 211 assertResultIsSuccess(addResult); 212 213 List<ScmFile> files = addResult.getAddedFiles(); 214 assertNotNull(files); 215 assertEquals(1, files.size()); 216 // SCM-998: filename separators not yet harmonized 217 assertEquals( 218 "main/java/Foo.java", 219 FilenameUtils.normalizeFilename(files.get(0).getPath())); 220 221 CommandParameters commandParameters = new CommandParameters(); 222 commandParameters.setString(CommandParameter.MESSAGE, "Commit message"); 223 224 CheckInScmResult result = getScmManager() 225 .checkIn( 226 getScmRepository(), 227 new ScmFileSet(new File(getWorkingCopy(), "src"), "**/Foo.java", null), 228 commandParameters); 229 230 assertResultIsSuccess(result); 231 232 files = result.getCheckedInFiles(); 233 assertNotNull(files); 234 assertEquals(1, files.size()); 235 236 ScmFile file1 = files.get(0); 237 assertEquals(ScmFileStatus.CHECKED_IN, file1.getStatus()); 238 assertPath("main/java/Foo.java", file1.getPath()); 239 240 CheckOutScmResult checkoutResult = 241 getScmManager().checkOut(getScmRepository(), new ScmFileSet(getAssertionCopy())); 242 243 assertResultIsSuccess(checkoutResult); 244 245 fooJava = new File(getAssertionCopy(), "src/main/java/Foo.java"); 246 247 assertTrue("check can read Foo.java", fooJava.canRead()); 248 } 249 250 private void createFooJava(File fooJava) throws Exception { 251 try (PrintWriter printer = new PrintWriter(new FileWriter(fooJava))) { 252 printer.println("public class Foo"); 253 printer.println("{"); 254 255 printer.println(" public void foo()"); 256 printer.println(" {"); 257 printer.println(" int i = 10;"); 258 printer.println(" }"); 259 260 printer.println("}"); 261 } 262 } 263 264 private void createBarJava(File barJava) throws Exception { 265 try (PrintWriter printer = new PrintWriter(new FileWriter(barJava))) { 266 printer.println("public class Bar"); 267 printer.println("{"); 268 269 printer.println(" public int bar()"); 270 printer.println(" {"); 271 printer.println(" return 20;"); 272 printer.println(" }"); 273 274 printer.println("}"); 275 } 276 } 277 278 private void changeReadmeTxt(File readmeTxt) throws Exception { 279 try (FileWriter output = new FileWriter(readmeTxt)) { 280 output.write("changed file"); 281 } 282 } 283}