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}