View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.scm.tck.command.checkin;
20  
21  import java.io.File;
22  import java.io.FileWriter;
23  import java.io.PrintWriter;
24  import java.util.List;
25  import java.util.Map;
26  
27  import org.apache.maven.scm.ScmFile;
28  import org.apache.maven.scm.ScmFileSet;
29  import org.apache.maven.scm.ScmFileStatus;
30  import org.apache.maven.scm.ScmTckTestCase;
31  import org.apache.maven.scm.command.add.AddScmResult;
32  import org.apache.maven.scm.command.checkin.CheckInScmResult;
33  import org.apache.maven.scm.command.checkout.CheckOutScmResult;
34  import org.apache.maven.scm.provider.ScmProvider;
35  import org.apache.maven.scm.util.FilenameUtils;
36  import org.codehaus.plexus.util.FileUtils;
37  import org.codehaus.plexus.util.IOUtil;
38  import org.junit.Assume;
39  import org.junit.Test;
40  
41  import static org.junit.Assert.assertEquals;
42  import static org.junit.Assert.assertFalse;
43  import static org.junit.Assert.assertNotNull;
44  import static org.junit.Assert.assertTrue;
45  
46  /**
47   * This test tests the check out command.
48   *
49   * @author <a href="mailto:brett@apache.org">Brett Porter</a>
50   */
51  public abstract class CheckInCommandTckTest extends ScmTckTestCase {
52      @Test
53      public void testCheckInCommandTest() throws Exception {
54          // Make sure that the correct files was checked out
55          File fooJava = new File(getWorkingCopy(), "src/main/java/Foo.java");
56  
57          File barJava = new File(getWorkingCopy(), "src/main/java/Bar.java");
58  
59          File readmeTxt = new File(getWorkingCopy(), "readme.txt");
60  
61          assertFalse("check Foo.java doesn't yet exist", fooJava.canRead());
62  
63          assertFalse("check Bar.java doesn't yet exist", barJava.canRead());
64  
65          assertTrue("check can read readme.txt", readmeTxt.canRead());
66  
67          // Change the files
68          createFooJava(fooJava);
69  
70          createBarJava(barJava);
71  
72          changeReadmeTxt(readmeTxt);
73  
74          AddScmResult addResult = getScmManager()
75                  .add(getScmRepository(), new ScmFileSet(getWorkingCopy(), "src/main/java/Foo.java", null));
76  
77          assertResultIsSuccess(addResult);
78  
79          List<ScmFile> files = addResult.getAddedFiles();
80          assertNotNull(files);
81          assertEquals(1, files.size());
82          // SCM-998: filename separators not yet harmonized
83          assertEquals(
84                  "src/main/java/Foo.java",
85                  FilenameUtils.normalizeFilename(files.get(0).getPath()));
86  
87          CheckInScmResult result =
88                  getScmManager().checkIn(getScmRepository(), new ScmFileSet(getWorkingCopy()), "Commit message");
89  
90          assertResultIsSuccess(result);
91  
92          files = result.getCheckedInFiles();
93          assertNotNull(files);
94          assertEquals(2, files.size());
95  
96          Map<String, ScmFile> fileMap = mapFilesByPath(files);
97          ScmFile file1 = fileMap.get("src/main/java/Foo.java");
98          assertNotNull(file1);
99          assertEquals(ScmFileStatus.CHECKED_IN, file1.getStatus());
100 
101         ScmFile file2 = fileMap.get("readme.txt");
102         assertNotNull(file2);
103         assertEquals(ScmFileStatus.CHECKED_IN, file2.getStatus());
104 
105         CheckOutScmResult checkoutResult =
106                 getScmManager().checkOut(getScmRepository(), new ScmFileSet(getAssertionCopy()));
107 
108         assertResultIsSuccess(checkoutResult);
109 
110         fooJava = new File(getAssertionCopy(), "src/main/java/Foo.java");
111 
112         barJava = new File(getAssertionCopy(), "src/main/java/Bar.java");
113 
114         readmeTxt = new File(getAssertionCopy(), "readme.txt");
115 
116         assertTrue("check can read Foo.java", fooJava.canRead());
117 
118         assertFalse("check Bar.java doesn't exist", barJava.canRead());
119 
120         assertTrue("check can read readme.txt", readmeTxt.canRead());
121 
122         assertEquals("check readme.txt contents", "changed file", FileUtils.fileRead(readmeTxt));
123     }
124 
125     @Test
126     public void testCheckInCommandPartialFileset() throws Exception {
127         // Make sure that the correct files was checked out
128         File fooJava = new File(getWorkingCopy(), "src/main/java/Foo.java");
129 
130         File barJava = new File(getWorkingCopy(), "src/main/java/Bar.java");
131 
132         File readmeTxt = new File(getWorkingCopy(), "readme.txt");
133 
134         assertFalse("check Foo.java doesn't yet exist", fooJava.canRead());
135 
136         assertFalse("check Bar.java doesn't yet exist", barJava.canRead());
137 
138         assertTrue("check can read readme.txt", readmeTxt.canRead());
139 
140         // Change the files
141         createFooJava(fooJava);
142 
143         createBarJava(barJava);
144 
145         changeReadmeTxt(readmeTxt);
146 
147         AddScmResult addResult = getScmManager()
148                 .getProviderByUrl(getScmUrl())
149                 .add(getScmRepository(), new ScmFileSet(getWorkingCopy(), "src/main/java/Foo.java", null));
150 
151         assertResultIsSuccess(addResult);
152 
153         CheckInScmResult result = getScmManager()
154                 .checkIn(getScmRepository(), new ScmFileSet(getWorkingCopy(), "**/Foo.java", null), "Commit message");
155 
156         assertResultIsSuccess(result);
157 
158         List<ScmFile> files = result.getCheckedInFiles();
159         assertNotNull(files);
160         assertEquals(1, files.size());
161 
162         ScmFile file1 = files.get(0);
163         assertEquals(ScmFileStatus.CHECKED_IN, file1.getStatus());
164         assertPath("src/main/java/Foo.java", file1.getPath());
165 
166         CheckOutScmResult checkoutResult =
167                 getScmManager().checkOut(getScmRepository(), new ScmFileSet(getAssertionCopy()));
168 
169         assertResultIsSuccess(checkoutResult);
170 
171         fooJava = new File(getAssertionCopy(), "src/main/java/Foo.java");
172 
173         barJava = new File(getAssertionCopy(), "src/main/java/Bar.java");
174 
175         readmeTxt = new File(getAssertionCopy(), "readme.txt");
176 
177         assertTrue("check can read Foo.java", fooJava.canRead());
178 
179         assertFalse("check Bar.java doesn't exist", barJava.canRead());
180 
181         assertTrue("check can read readme.txt", readmeTxt.canRead());
182 
183         assertEquals("check readme.txt contents", "/readme.txt", FileUtils.fileRead(readmeTxt));
184     }
185 
186     @Test
187     public void testCheckInCommandFilesetWithBasedirOtherThanWorkingCopyRoot() throws Exception {
188         ScmProvider scmProvider = getScmManager().getProviderByUrl(getScmUrl());
189 
190         Assume.assumeFalse(
191                 "Local provider does not properly support basedir",
192                 scmProvider.getScmType().equals("local"));
193         // Make sure that the correct files was checked out
194         File fooJava = new File(getWorkingCopy(), "src/main/java/Foo.java");
195 
196         assertFalse("check Foo.java doesn't yet exist", fooJava.canRead());
197 
198         // Change the files
199         createFooJava(fooJava);
200 
201         AddScmResult addResult = scmProvider.add(
202                 getScmRepository(), new ScmFileSet(new File(getWorkingCopy(), "src"), "main/java/Foo.java", null));
203 
204         assertResultIsSuccess(addResult);
205 
206         List<ScmFile> files = addResult.getAddedFiles();
207         assertNotNull(files);
208         assertEquals(1, files.size());
209         // SCM-998: filename separators not yet harmonized
210         assertEquals(
211                 "main/java/Foo.java",
212                 FilenameUtils.normalizeFilename(files.get(0).getPath()));
213 
214         CheckInScmResult result = getScmManager()
215                 .checkIn(
216                         getScmRepository(),
217                         new ScmFileSet(new File(getWorkingCopy(), "src"), "**/Foo.java", null),
218                         "Commit message");
219 
220         assertResultIsSuccess(result);
221 
222         files = result.getCheckedInFiles();
223         assertNotNull(files);
224         assertEquals(1, files.size());
225 
226         ScmFile file1 = files.get(0);
227         assertEquals(ScmFileStatus.CHECKED_IN, file1.getStatus());
228         assertPath("main/java/Foo.java", file1.getPath());
229 
230         CheckOutScmResult checkoutResult =
231                 getScmManager().checkOut(getScmRepository(), new ScmFileSet(getAssertionCopy()));
232 
233         assertResultIsSuccess(checkoutResult);
234 
235         fooJava = new File(getAssertionCopy(), "src/main/java/Foo.java");
236 
237         assertTrue("check can read Foo.java", fooJava.canRead());
238     }
239 
240     private void createFooJava(File fooJava) throws Exception {
241         FileWriter output = new FileWriter(fooJava);
242 
243         PrintWriter printer = new PrintWriter(output);
244         try {
245             printer.println("public class Foo");
246             printer.println("{");
247 
248             printer.println("    public void foo()");
249             printer.println("    {");
250             printer.println("        int i = 10;");
251             printer.println("    }");
252 
253             printer.println("}");
254         } finally {
255             IOUtil.close(output);
256             IOUtil.close(printer);
257         }
258     }
259 
260     private void createBarJava(File barJava) throws Exception {
261         FileWriter output = new FileWriter(barJava);
262 
263         PrintWriter printer = new PrintWriter(output);
264 
265         printer.println("public class Bar");
266         printer.println("{");
267 
268         printer.println("    public int bar()");
269         printer.println("    {");
270         printer.println("        return 20;");
271         printer.println("    }");
272 
273         printer.println("}");
274 
275         printer.close();
276 
277         output.close();
278     }
279 
280     private void changeReadmeTxt(File readmeTxt) throws Exception {
281         FileWriter output = null;
282 
283         try {
284             output = new FileWriter(readmeTxt);
285 
286             output.write("changed file");
287         } finally {
288             IOUtil.close(output);
289         }
290     }
291 }