001package org.apache.maven.scm.provider.cvslib.command.update;
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.ScmTestCase;
026import org.apache.maven.scm.command.update.UpdateScmResult;
027import org.apache.maven.scm.manager.ScmManager;
028import org.apache.maven.scm.provider.cvslib.CvsScmTestUtils;
029import org.apache.maven.scm.repository.ScmRepository;
030import org.codehaus.plexus.util.FileUtils;
031import org.codehaus.plexus.util.IOUtil;
032
033import java.io.File;
034import java.io.FileWriter;
035
036/**
037 * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
038 * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
039 *
040 */
041public class CvsUpdateCommandTest
042    extends ScmTestCase
043{
044    private File repository;
045
046    private File workingDirectory;
047
048    private File assertionDirectory;
049
050    /**
051     * {@inheritDoc}
052     */
053    public void setUp()
054        throws Exception
055    {
056        super.setUp();
057
058        repository = getTestFile( "target/update-test/repository" );
059
060        workingDirectory = getTestFile( "target/update-test/working-directory" );
061
062        assertionDirectory = getTestFile( "target/update-test/assertion-directory" );
063
064        CvsScmTestUtils.initRepo( repository, workingDirectory, assertionDirectory );
065    }
066
067    private String getModule()
068    {
069        return "test-repo/update";
070    }
071
072    /**
073     * TODO merge into tck
074     */
075    public void testCvsUpdate()
076        throws Exception
077    {
078
079        FileWriter writer = null;
080        try
081        {
082            if ( !isSystemCmd( CvsScmTestUtils.CVS_COMMAND_LINE ) )
083            {
084                ScmTestCase.printSystemCmdUnavail( CvsScmTestUtils.CVS_COMMAND_LINE, getName() );
085                return;
086            }
087
088            ScmManager scmManager = getScmManager();
089
090            String scmUrl = CvsScmTestUtils.getScmUrl( repository, getModule() );
091
092            // Check out the repo to a working directory where files will be modified and committed
093            String arguments =
094                "-f -d " + repository.getAbsolutePath() + " " + "co -d " + workingDirectory.getName() + " "
095                    + getModule();
096
097            CvsScmTestUtils.executeCVS( workingDirectory.getParentFile(), arguments );
098
099            // Check out the repo to a assertion directory where the command will be used
100            arguments = "-f -d " + repository.getAbsolutePath() + " " + "co -d " + assertionDirectory.getName() + " "
101                + getModule();
102
103            CvsScmTestUtils.executeCVS( assertionDirectory.getParentFile(), arguments );
104
105            // A new check out should return 0 updated files.
106            ScmRepository scmRepository = scmManager.makeScmRepository( scmUrl );
107
108            UpdateScmResult result = scmManager.update( scmRepository, new ScmFileSet( assertionDirectory ) );
109
110            assertNotNull( result );
111
112            if ( !result.isSuccess() )
113            {
114                System.out.println( "result.providerMessage: " + result.getProviderMessage() );
115
116                System.out.println( "result.commandOutput: " + result.getCommandOutput() );
117
118                fail( "Command failed" );
119            }
120
121            assertNull( result.getProviderMessage() );
122
123            assertNull( result.getCommandOutput() );
124
125            assertNotNull( result.getUpdatedFiles() );
126
127            assertEquals( 0, result.getUpdatedFiles().size() );
128
129            // Modifing a file
130            File fooJava = new File( workingDirectory, "Foo.java" );
131
132            String content = FileUtils.fileRead( fooJava );
133
134            writer = new FileWriter( fooJava );
135
136            writer.write( content + System.getProperty( "line.separator" ) );
137            writer.write( "extra line" );
138
139            writer.close();
140
141            // Adding a new file
142            writer = new FileWriter( new File( workingDirectory, "New.txt" ) );
143
144            writer.write( "new file" );
145
146            writer.close();
147
148            arguments = "-f -d " + repository.getAbsolutePath() + " add New.txt";
149
150            CvsScmTestUtils.executeCVS( workingDirectory, arguments );
151
152            // Committing
153            arguments = "-f -d " + repository.getAbsolutePath() + " commit -m .";
154
155            CvsScmTestUtils.executeCVS( workingDirectory, arguments );
156
157            // Check the updated files
158            result = scmManager.update( scmRepository, new ScmFileSet( assertionDirectory ) );
159
160            assertNotNull( result );
161
162            if ( !result.isSuccess() )
163            {
164                System.out.println( "result.providerMessage: " + result.getProviderMessage() );
165
166                System.out.println( "result.commandOutput: " + result.getCommandOutput() );
167
168                fail( "Command failed" );
169            }
170
171            assertNull( result.getProviderMessage() );
172
173            assertNull( result.getCommandOutput() );
174
175            assertNotNull( result.getUpdatedFiles() );
176
177            assertEquals( 2, result.getUpdatedFiles().size() );
178
179            ScmFile file1 = result.getUpdatedFiles().get( 0 );
180
181            assertPath( "Foo.java", file1.getPath() );
182
183            assertEquals( ScmFileStatus.UPDATED, file1.getStatus() );
184
185            ScmFile file2 = result.getUpdatedFiles().get( 1 );
186
187            assertPath( "New.txt", file2.getPath() );
188
189            assertEquals( ScmFileStatus.UPDATED, file2.getStatus() );
190        }
191        finally
192        {
193            IOUtil.close( writer );
194        }
195    }
196}