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}