001    package org.apache.maven.scm.tck.command.status;
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    
022    import org.apache.maven.scm.ScmFile;
023    import org.apache.maven.scm.ScmFileSet;
024    import org.apache.maven.scm.ScmFileStatus;
025    import org.apache.maven.scm.ScmTckTestCase;
026    import org.apache.maven.scm.ScmTestCase;
027    import org.apache.maven.scm.command.checkin.CheckInScmResult;
028    import org.apache.maven.scm.command.status.StatusScmResult;
029    import org.apache.maven.scm.manager.ScmManager;
030    import org.apache.maven.scm.repository.ScmRepository;
031    
032    import java.io.File;
033    import java.util.Iterator;
034    import java.util.List;
035    import java.util.TreeSet;
036    
037    /**
038     * This test tests the status command.
039     * <p/>
040     * It works like this:
041     * <p/>
042     * <ol>
043     * <li>Check out the files to directory getWorkingCopy().
044     * <li>Check out the files to directory getUpdatingCopy().
045     * <li>Change the files in getWorkingCopy().
046     * <li>Commit the files in getWorkingCopy(). Note that the provider <b>must</b> not
047     * use the check in command as it can be guaranteed to work as it's not yet tested.
048     * <li>Use the update command in getUpdatingCopy() to assert that the files
049     * that was supposed to be updated actually was updated.
050     * </ol>
051     *
052     * @author <a href="mailto:brett@apache.org">Brett Porter</a>
053     * @version $Id: StatusCommandTckTest.java 1352852 2012-06-22 11:48:42Z olamy $
054     */
055    public abstract class StatusCommandTckTest
056        extends ScmTckTestCase
057    {
058    
059        protected void commit( File workingDirectory, ScmRepository repository )
060            throws Exception
061        {
062            CheckInScmResult result = getScmManager().checkIn( repository, new ScmFileSet( workingDirectory ), "No msg" );
063    
064            assertTrue( "Check result was successful, output: " + result.getCommandOutput(), result.isSuccess() );
065    
066            List<ScmFile> committedFiles = result.getCheckedInFiles();
067    
068            assertEquals( "Expected 2 files in the committed files list " + committedFiles, 2, committedFiles.size() );
069        }
070    
071    
072        public void testStatusCommand()
073            throws Exception
074        {
075            ScmRepository repository = makeScmRepository( getScmUrl() );
076    
077            checkOut( getUpdatingCopy(), repository );
078    
079            // ----------------------------------------------------------------------
080            // Change the files
081            // ----------------------------------------------------------------------
082    
083            /*
084             * readme.txt is changed (changed file in the root directory)
085             * project.xml is added (added file in the root directory)
086             */
087    
088            // /readme.txt
089            ScmTestCase.makeFile( getWorkingCopy(), "/readme.txt", "changed readme.txt" );
090    
091            // /project.xml
092            ScmTestCase.makeFile( getWorkingCopy(), "/project.xml", "changed project.xml" );
093    
094            addToWorkingTree( getWorkingCopy(), new File( "project.xml" ), repository );
095    
096            commit( getWorkingCopy(), repository );
097    
098            // /pom.xml
099            ScmTestCase.makeFile( getUpdatingCopy(), "/pom.xml", "changed pom.xml" );
100    
101            // /src/test/java/org
102            ScmTestCase.makeDirectory( getUpdatingCopy(), "/src/test/java/org" );
103    
104            addToWorkingTree( getUpdatingCopy(), new File( "src/test/java/org" ), repository );
105    
106            // /src/main/java/org/Foo.java
107            ScmTestCase.makeFile( getUpdatingCopy(), "/src/main/java/org/Foo.java" );
108    
109            addToWorkingTree( getUpdatingCopy(), new File( "src/main/java/org" ), repository );
110    
111            // src/main/java/org/Foo.java
112            addToWorkingTree( getUpdatingCopy(), new File( "src/main/java/org/Foo.java" ), repository );
113    
114            ScmManager scmManager = getScmManager();
115    
116            // ----------------------------------------------------------------------
117            // Check status the project
118            // src/main/java/org/Foo.java is added
119            // /pom.xml is modified
120            // check that readme and project.xml are not updated/created
121            // ----------------------------------------------------------------------
122    
123            StatusScmResult result = scmManager.getProviderByUrl( getScmUrl() )
124                .status( repository, new ScmFileSet( getUpdatingCopy() ) );
125    
126            assertNotNull( "The command returned a null result.", result );
127    
128            assertResultIsSuccess( result );
129    
130            List<ScmFile> changedFiles = result.getChangedFiles();
131    
132            assertEquals( "Expected 2 files in the updated files list " + changedFiles, 2, changedFiles.size() );
133    
134            // ----------------------------------------------------------------------
135            // Assert the files in the updated files list
136            // ----------------------------------------------------------------------
137    
138            Iterator<ScmFile> files = new TreeSet<ScmFile>( changedFiles ).iterator();
139    
140            ScmFile file = files.next();
141            assertPath( "/src/main/java/org/Foo.java", file.getPath() );
142            assertEquals( ScmFileStatus.ADDED, file.getStatus() );
143    
144            file = files.next();
145            assertPath( "/pom.xml", file.getPath() );
146            assertEquals( ScmFileStatus.MODIFIED, file.getStatus() );
147    
148            assertFile( getUpdatingCopy(), "/readme.txt" );
149    
150            assertFalse( "project.xml created incorrectly", new File( getUpdatingCopy(), "/project.xml" ).exists() );
151        }
152    }