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.CommandParameter;
28  import org.apache.maven.scm.CommandParameters;
29  import org.apache.maven.scm.ScmFile;
30  import org.apache.maven.scm.ScmFileSet;
31  import org.apache.maven.scm.ScmFileStatus;
32  import org.apache.maven.scm.ScmTckTestCase;
33  import org.apache.maven.scm.command.add.AddScmResult;
34  import org.apache.maven.scm.command.checkin.CheckInScmResult;
35  import org.apache.maven.scm.command.checkout.CheckOutScmResult;
36  import org.apache.maven.scm.provider.ScmProvider;
37  import org.apache.maven.scm.util.FilenameUtils;
38  import org.codehaus.plexus.util.FileUtils;
39  import org.junit.Assume;
40  import org.junit.Test;
41  
42  import static org.junit.Assert.assertEquals;
43  import static org.junit.Assert.assertFalse;
44  import static org.junit.Assert.assertNotNull;
45  import static org.junit.Assert.assertTrue;
46  
47  /**
48   * This test tests the check out command.
49   *
50   * @author <a href="mailto:brett@apache.org">Brett Porter</a>
51   */
52  public abstract class CheckInCommandTckTest extends ScmTckTestCase {
53      @Test
54      public void testCheckInCommandTest() throws Exception {
55          // Make sure that the correct files was checked out
56          File fooJava = new File(getWorkingCopy(), "src/main/java/Foo.java");
57  
58          File barJava = new File(getWorkingCopy(), "src/main/java/Bar.java");
59  
60          File readmeTxt = new File(getWorkingCopy(), "readme.txt");
61  
62          assertFalse("check Foo.java doesn't yet exist", fooJava.canRead());
63  
64          assertFalse("check Bar.java doesn't yet exist", barJava.canRead());
65  
66          assertTrue("check can read readme.txt", readmeTxt.canRead());
67  
68          // Change the files
69          createFooJava(fooJava);
70  
71          createBarJava(barJava);
72  
73          changeReadmeTxt(readmeTxt);
74  
75          AddScmResult addResult = getScmManager()
76                  .add(getScmRepository(), new ScmFileSet(getWorkingCopy(), "src/main/java/Foo.java", null));
77  
78          assertResultIsSuccess(addResult);
79  
80          List<ScmFile> files = addResult.getAddedFiles();
81          assertNotNull(files);
82          assertEquals(1, files.size());
83          // SCM-998: filename separators not yet harmonized
84          assertEquals(
85                  "src/main/java/Foo.java",
86                  FilenameUtils.normalizeFilename(files.get(0).getPath()));
87  
88          CommandParameters commandParameters = new CommandParameters();
89          commandParameters.setString(CommandParameter.MESSAGE, "Commit message");
90  
91          CheckInScmResult result =
92                  getScmManager().checkIn(getScmRepository(), new ScmFileSet(getWorkingCopy()), commandParameters);
93  
94          assertResultIsSuccess(result);
95  
96          files = result.getCheckedInFiles();
97          assertNotNull(files);
98          assertEquals(2, files.size());
99  
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 }