001package org.apache.maven.scm.tck.command.checkin; 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.ScmFile; 023import org.apache.maven.scm.ScmFileSet; 024import org.apache.maven.scm.ScmFileStatus; 025import org.apache.maven.scm.ScmTckTestCase; 026import org.apache.maven.scm.command.add.AddScmResult; 027import org.apache.maven.scm.command.checkin.CheckInScmResult; 028import org.apache.maven.scm.command.checkout.CheckOutScmResult; 029import org.apache.maven.scm.provider.ScmProvider; 030import org.apache.maven.scm.util.FilenameUtils; 031import org.codehaus.plexus.util.FileUtils; 032import org.codehaus.plexus.util.IOUtil; 033import org.junit.Assume; 034import org.junit.Test; 035 036import java.io.File; 037import java.io.FileWriter; 038import java.io.PrintWriter; 039import java.util.List; 040import java.util.Map; 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 053 extends ScmTckTestCase 054{ 055 @Test 056 public void testCheckInCommandTest() 057 throws Exception 058 { 059 // Make sure that the correct files was checked out 060 File fooJava = new File( getWorkingCopy(), "src/main/java/Foo.java" ); 061 062 File barJava = new File( getWorkingCopy(), "src/main/java/Bar.java" ); 063 064 File readmeTxt = new File( getWorkingCopy(), "readme.txt" ); 065 066 assertFalse( "check Foo.java doesn't yet exist", fooJava.canRead() ); 067 068 assertFalse( "check Bar.java doesn't yet exist", barJava.canRead() ); 069 070 assertTrue( "check can read readme.txt", readmeTxt.canRead() ); 071 072 // Change the files 073 createFooJava( fooJava ); 074 075 createBarJava( barJava ); 076 077 changeReadmeTxt( readmeTxt ); 078 079 AddScmResult addResult = getScmManager().add( getScmRepository(), 080 new ScmFileSet( getWorkingCopy(), "src/main/java/Foo.java", 081 null ) ); 082 083 assertResultIsSuccess( addResult ); 084 085 List<ScmFile> files = addResult.getAddedFiles(); 086 assertNotNull( files ); 087 assertEquals( 1, files.size() ); 088 // SCM-998: filename separators not yet harmonized 089 assertEquals( "src/main/java/Foo.java", FilenameUtils.normalizeFilename( files.get( 0 ).getPath() ) ); 090 091 CheckInScmResult result = 092 getScmManager().checkIn( getScmRepository(), new ScmFileSet( getWorkingCopy() ), "Commit message" ); 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() 131 throws Exception 132 { 133 // Make sure that the correct files was checked out 134 File fooJava = new File( getWorkingCopy(), "src/main/java/Foo.java" ); 135 136 File barJava = new File( getWorkingCopy(), "src/main/java/Bar.java" ); 137 138 File readmeTxt = new File( getWorkingCopy(), "readme.txt" ); 139 140 assertFalse( "check Foo.java doesn't yet exist", fooJava.canRead() ); 141 142 assertFalse( "check Bar.java doesn't yet exist", barJava.canRead() ); 143 144 assertTrue( "check can read readme.txt", readmeTxt.canRead() ); 145 146 // Change the files 147 createFooJava( fooJava ); 148 149 createBarJava( barJava ); 150 151 changeReadmeTxt( readmeTxt ); 152 153 AddScmResult addResult = 154 getScmManager().getProviderByUrl( getScmUrl() ).add( getScmRepository(), 155 new ScmFileSet( getWorkingCopy(), 156 "src/main/java/Foo.java", null ) ); 157 158 assertResultIsSuccess( addResult ); 159 160 CheckInScmResult result = 161 getScmManager().checkIn( getScmRepository(), new ScmFileSet( getWorkingCopy(), "**/Foo.java", null ), 162 "Commit message" ); 163 164 assertResultIsSuccess( result ); 165 166 List<ScmFile> files = result.getCheckedInFiles(); 167 assertNotNull( files ); 168 assertEquals( 1, files.size() ); 169 170 ScmFile file1 = files.get( 0 ); 171 assertEquals( ScmFileStatus.CHECKED_IN, file1.getStatus() ); 172 assertPath( "src/main/java/Foo.java", file1.getPath() ); 173 174 CheckOutScmResult checkoutResult = 175 getScmManager().checkOut( getScmRepository(), new ScmFileSet( getAssertionCopy() ) ); 176 177 assertResultIsSuccess( checkoutResult ); 178 179 fooJava = new File( getAssertionCopy(), "src/main/java/Foo.java" ); 180 181 barJava = new File( getAssertionCopy(), "src/main/java/Bar.java" ); 182 183 readmeTxt = new File( getAssertionCopy(), "readme.txt" ); 184 185 assertTrue( "check can read Foo.java", fooJava.canRead() ); 186 187 assertFalse( "check Bar.java doesn't exist", barJava.canRead() ); 188 189 assertTrue( "check can read readme.txt", readmeTxt.canRead() ); 190 191 assertEquals( "check readme.txt contents", "/readme.txt", FileUtils.fileRead( readmeTxt ) ); 192 } 193 194 @Test 195 public void testCheckInCommandFilesetWithBasedirOtherThanWorkingCopyRoot() 196 throws Exception 197 { 198 ScmProvider scmProvider = getScmManager().getProviderByUrl( getScmUrl() ); 199 200 Assume.assumeFalse( "Local provider does not properly support basedir", 201 scmProvider.getScmType().equals( "local" ) ); 202 // Make sure that the correct files was checked out 203 File fooJava = new File( getWorkingCopy(), "src/main/java/Foo.java" ); 204 205 assertFalse( "check Foo.java doesn't yet exist", fooJava.canRead() ); 206 207 // Change the files 208 createFooJava( fooJava ); 209 210 AddScmResult addResult = 211 scmProvider.add( getScmRepository(), new ScmFileSet( new File( getWorkingCopy(), "src" ), 212 "main/java/Foo.java", null ) ); 213 214 assertResultIsSuccess( addResult ); 215 216 List<ScmFile> files = addResult.getAddedFiles(); 217 assertNotNull( files ); 218 assertEquals( 1, files.size() ); 219 // SCM-998: filename separators not yet harmonized 220 assertEquals( "main/java/Foo.java", FilenameUtils.normalizeFilename( files.get( 0 ).getPath() ) ); 221 222 CheckInScmResult result = 223 getScmManager().checkIn( getScmRepository(), new ScmFileSet( new File( getWorkingCopy(), "src" ), 224 "**/Foo.java", null ), 225 "Commit message" ); 226 227 assertResultIsSuccess( result ); 228 229 files = result.getCheckedInFiles(); 230 assertNotNull( files ); 231 assertEquals( 1, files.size() ); 232 233 ScmFile file1 = files.get( 0 ); 234 assertEquals( ScmFileStatus.CHECKED_IN, file1.getStatus() ); 235 assertPath( "main/java/Foo.java", file1.getPath() ); 236 237 CheckOutScmResult checkoutResult = 238 getScmManager().checkOut( getScmRepository(), new ScmFileSet( getAssertionCopy() ) ); 239 240 assertResultIsSuccess( checkoutResult ); 241 242 fooJava = new File( getAssertionCopy(), "src/main/java/Foo.java" ); 243 244 assertTrue( "check can read Foo.java", fooJava.canRead() ); 245 246 } 247 248 private void createFooJava( File fooJava ) 249 throws Exception 250 { 251 FileWriter output = new FileWriter( fooJava ); 252 253 PrintWriter printer = new PrintWriter( output ); 254 try 255 { 256 printer.println( "public class Foo" ); 257 printer.println( "{" ); 258 259 printer.println( " public void foo()" ); 260 printer.println( " {" ); 261 printer.println( " int i = 10;" ); 262 printer.println( " }" ); 263 264 printer.println( "}" ); 265 } 266 finally 267 { 268 IOUtil.close( output ); 269 IOUtil.close( printer ); 270 } 271 } 272 273 private void createBarJava( File barJava ) 274 throws Exception 275 { 276 FileWriter output = new FileWriter( barJava ); 277 278 PrintWriter printer = new PrintWriter( output ); 279 280 printer.println( "public class Bar" ); 281 printer.println( "{" ); 282 283 printer.println( " public int bar()" ); 284 printer.println( " {" ); 285 printer.println( " return 20;" ); 286 printer.println( " }" ); 287 288 printer.println( "}" ); 289 290 printer.close(); 291 292 output.close(); 293 } 294 295 private void changeReadmeTxt( File readmeTxt ) 296 throws Exception 297 { 298 FileWriter output = null; 299 300 try 301 { 302 output = new FileWriter( readmeTxt ); 303 304 output.write( "changed file" ); 305 } 306 finally 307 { 308 IOUtil.close( output ); 309 } 310 } 311}