View Javadoc
1   package org.codehaus.plexus.compiler.util.scan;
2   
3   /*
4    * Copyright 2001-2005 The Apache Software Foundation.
5    *
6    * Licensed under the Apache License, Version 2.0 (the "License");
7    * you may not use this file except in compliance with the License.
8    * 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, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
17   */
18  
19  import java.io.File;
20  import java.util.Collections;
21  import java.util.Set;
22  
23  import org.codehaus.plexus.compiler.util.scan.mapping.SingleTargetSourceMapping;
24  import org.codehaus.plexus.compiler.util.scan.mapping.SourceMapping;
25  import org.codehaus.plexus.compiler.util.scan.mapping.SuffixMapping;
26  import org.junit.jupiter.api.BeforeEach;
27  import org.junit.jupiter.api.Test;
28  
29  import static org.junit.jupiter.api.Assertions.assertEquals;
30  import static org.junit.jupiter.api.Assertions.assertTrue;
31  
32  /**
33   * @author jdcasey
34   * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
35   */
36  public class StaleSourceScannerTest extends AbstractSourceInclusionScannerTest {
37  
38      @BeforeEach
39      public void setUp() throws Exception {
40          scanner = new StaleSourceScanner();
41      }
42  
43      @Test
44      public void testWithDefaultConstructorShouldFindOneStaleSource() throws Exception {
45          File base = new File(getTestBaseDir(), "test1");
46  
47          long now = System.currentTimeMillis();
48  
49          File targetFile = new File(base, "file.xml");
50  
51          writeFile(targetFile);
52  
53          targetFile.setLastModified(now - 60000);
54  
55          File sourceFile = new File(base, "file.java");
56  
57          writeFile(sourceFile);
58  
59          sourceFile.setLastModified(now);
60  
61          SuffixMapping mapping = new SuffixMapping(".java", ".xml");
62  
63          scanner.addSourceMapping(mapping);
64  
65          Set<File> result = scanner.getIncludedSources(base, base);
66  
67          assertEquals(1, result.size(), "wrong number of stale sources returned.");
68  
69          assertTrue(result.contains(sourceFile), "expected stale source file not found in result");
70      }
71  
72      @Test
73      public void testWithDefaultConstructorShouldNotFindStaleSources() throws Exception {
74          File base = new File(getTestBaseDir(), "test2");
75  
76          long now = System.currentTimeMillis();
77  
78          File sourceFile = new File(base, "file.java");
79  
80          writeFile(sourceFile);
81  
82          sourceFile.setLastModified(now - 60000);
83  
84          File targetFile = new File(base, "file.xml");
85  
86          writeFile(targetFile);
87  
88          targetFile.setLastModified(now);
89  
90          SuffixMapping mapping = new SuffixMapping(".java", ".xml");
91  
92          scanner.addSourceMapping(mapping);
93  
94          Set<File> result = scanner.getIncludedSources(base, base);
95  
96          assertEquals(0, result.size(), "wrong number of stale sources returned.");
97  
98          assertTrue(result.isEmpty(), "expected stale source file not found in result");
99      }
100 
101     @Test
102     public void testWithDefaultConstructorShouldFindStaleSourcesBecauseOfMissingTargetFile() throws Exception {
103         File base = new File(getTestBaseDir(), "test3");
104 
105         File sourceFile = new File(base, "file.java");
106 
107         writeFile(sourceFile);
108 
109         SuffixMapping mapping = new SuffixMapping(".java", ".xml");
110 
111         scanner.addSourceMapping(mapping);
112 
113         Set<File> result = scanner.getIncludedSources(base, base);
114 
115         assertEquals(1, result.size(), "wrong number of stale sources returned.");
116 
117         assertTrue(result.contains(sourceFile), "expected stale source file not found in result");
118     }
119 
120     @Test
121     public void testWithDefaultConstructorShouldFindStaleSourcesOneBecauseOfMissingTargetAndOneBecauseOfStaleTarget()
122             throws Exception {
123         File base = new File(getTestBaseDir(), "test4");
124 
125         long now = System.currentTimeMillis();
126 
127         File targetFile = new File(base, "file2.xml");
128 
129         writeFile(targetFile);
130 
131         targetFile.setLastModified(now - 60000);
132 
133         File sourceFile = new File(base, "file.java");
134 
135         writeFile(sourceFile);
136 
137         File sourceFile2 = new File(base, "file2.java");
138 
139         writeFile(sourceFile2);
140 
141         sourceFile2.setLastModified(now);
142 
143         SuffixMapping mapping = new SuffixMapping(".java", ".xml");
144 
145         scanner.addSourceMapping(mapping);
146 
147         Set<File> result = scanner.getIncludedSources(base, base);
148 
149         assertEquals(2, result.size(), "wrong number of stale sources returned.");
150 
151         assertEquals(2, result.size());
152         assertTrue(
153                 result.contains(sourceFile) && result.contains(sourceFile2),
154                 "expected stale source file not found in result");
155     }
156 
157     @Test
158     public void testWithDefaultConstructorShouldFindOneStaleSourcesWithStaleTargetAndOmitUpToDateSource()
159             throws Exception {
160         File base = new File(getTestBaseDir(), "test5");
161 
162         long now = System.currentTimeMillis();
163 
164         // target/source (1) should result in source being included.
165 
166         // write the target file first, and set the lastmod to some time in the
167         // past to ensure this.
168         File targetFile = new File(base, "file.xml");
169 
170         writeFile(targetFile);
171 
172         targetFile.setLastModified(now - 60000);
173 
174         // now write the source file, and set the lastmod to now.
175         File sourceFile = new File(base, "file.java");
176 
177         writeFile(sourceFile);
178 
179         sourceFile.setLastModified(now);
180 
181         // target/source (2) should result in source being omitted.
182 
183         // write the source file first, and set the lastmod to some time in the
184         // past to ensure this.
185         File sourceFile2 = new File(base, "file2.java");
186 
187         writeFile(sourceFile2);
188 
189         sourceFile2.setLastModified(now - 60000);
190 
191         // now write the target file, with lastmod of now.
192         File targetFile2 = new File(base, "file2.xml");
193 
194         writeFile(targetFile2);
195 
196         targetFile2.setLastModified(now);
197 
198         SuffixMapping mapping = new SuffixMapping(".java", ".xml");
199 
200         scanner.addSourceMapping(mapping);
201 
202         Set<File> result = scanner.getIncludedSources(base, base);
203 
204         assertEquals(1, result.size(), "wrong number of stale sources returned.");
205 
206         assertTrue(result.contains(sourceFile), "expected stale source file not found in result");
207     }
208 
209     @Test
210     public void testConstructedWithMsecsShouldReturnOneSourceFileOfTwoDueToLastMod() throws Exception {
211         File base = new File(getTestBaseDir(), "test6");
212 
213         long now = System.currentTimeMillis();
214 
215         File targetFile = new File(base, "file.xml");
216 
217         writeFile(targetFile);
218 
219         // should be within the threshold of lastMod for stale sources.
220         targetFile.setLastModified(now - 8000);
221 
222         File sourceFile = new File(base, "file.java");
223 
224         writeFile(sourceFile);
225 
226         // modified 'now' for comparison with the above target file.
227         sourceFile.setLastModified(now);
228 
229         File targetFile2 = new File(base, "file2.xml");
230 
231         writeFile(targetFile2);
232 
233         targetFile2.setLastModified(now - 12000);
234 
235         File sourceFile2 = new File(base, "file2.java");
236 
237         writeFile(sourceFile2);
238 
239         // modified 'now' for comparison to above target file.
240         sourceFile2.setLastModified(now);
241 
242         SuffixMapping mapping = new SuffixMapping(".java", ".xml");
243 
244         scanner = new StaleSourceScanner(10000);
245 
246         scanner.addSourceMapping(mapping);
247 
248         Set<File> result = scanner.getIncludedSources(base, base);
249 
250         assertEquals(1, result.size(), "wrong number of stale sources returned.");
251 
252         assertTrue(result.contains(sourceFile2), "expected stale source file not found in result");
253     }
254 
255     @Test
256     public void testConstructedWithMsecsIncludesAndExcludesShouldReturnOneSourceFileOfThreeDueToIncludePattern()
257             throws Exception {
258         File base = new File(getTestBaseDir(), "test7");
259 
260         long now = System.currentTimeMillis();
261 
262         File targetFile = new File(base, "file.xml");
263 
264         writeFile(targetFile);
265 
266         // should be within the threshold of lastMod for stale sources.
267         targetFile.setLastModified(now - 12000);
268 
269         File sourceFile = new File(base, "file.java");
270 
271         writeFile(sourceFile);
272 
273         // modified 'now' for comparison with the above target file.
274         sourceFile.setLastModified(now);
275 
276         File targetFile2 = new File(base, "file2.xml");
277 
278         writeFile(targetFile2);
279 
280         targetFile2.setLastModified(now - 12000);
281 
282         File sourceFile2 = new File(base, "file2.java");
283 
284         writeFile(sourceFile2);
285 
286         // modified 'now' for comparison to above target file.
287         sourceFile2.setLastModified(now);
288 
289         File targetFile3 = new File(base, "file3.xml");
290 
291         writeFile(targetFile3);
292 
293         targetFile3.setLastModified(now - 12000);
294 
295         File sourceFile3 = new File(base, "file3.java");
296 
297         writeFile(sourceFile3);
298 
299         // modified 'now' for comparison to above target file.
300         sourceFile3.setLastModified(now);
301 
302         SuffixMapping mapping = new SuffixMapping(".java", ".xml");
303 
304         scanner = new StaleSourceScanner(0, Collections.singleton("*3.java"), Collections.<String>emptySet());
305 
306         scanner.addSourceMapping(mapping);
307 
308         Set<File> result = scanner.getIncludedSources(base, base);
309 
310         assertEquals(1, result.size(), "wrong number of stale sources returned.");
311 
312         assertTrue(result.contains(sourceFile3), "expected stale source file not found in result");
313     }
314 
315     @Test
316     public void testConstructedWithMsecsIncludesAndExcludesShouldReturnTwoSourceFilesOfThreeDueToExcludePattern()
317             throws Exception {
318         File base = new File(getTestBaseDir(), "test8");
319 
320         long now = System.currentTimeMillis();
321 
322         File targetFile = new File(base, "fileX.xml");
323 
324         writeFile(targetFile);
325 
326         // should be within the threshold of lastMod for stale sources.
327         targetFile.setLastModified(now - 12000);
328 
329         File sourceFile = new File(base, "fileX.java");
330 
331         writeFile(sourceFile);
332 
333         // modified 'now' for comparison with the above target file.
334         sourceFile.setLastModified(now);
335 
336         File targetFile2 = new File(base, "file2.xml");
337 
338         writeFile(targetFile2);
339 
340         targetFile2.setLastModified(now - 12000);
341 
342         File sourceFile2 = new File(base, "file2.java");
343 
344         writeFile(sourceFile2);
345 
346         // modified 'now' for comparison to above target file.
347         sourceFile2.setLastModified(now);
348 
349         File targetFile3 = new File(base, "file3.xml");
350 
351         writeFile(targetFile3);
352 
353         targetFile3.setLastModified(now - 12000);
354 
355         File sourceFile3 = new File(base, "file3.java");
356 
357         writeFile(sourceFile3);
358 
359         // modified 'now' for comparison to above target file.
360         sourceFile3.setLastModified(now);
361 
362         SuffixMapping mapping = new SuffixMapping(".java", ".xml");
363 
364         scanner = new StaleSourceScanner(0, Collections.singleton("**/*"), Collections.singleton("*X.*"));
365 
366         scanner.addSourceMapping(mapping);
367 
368         Set<File> result = scanner.getIncludedSources(base, base);
369 
370         assertEquals(2, result.size(), "wrong number of stale sources returned.");
371 
372         assertEquals(2, result.size());
373         assertTrue(
374                 result.contains(sourceFile2) && result.contains(sourceFile3),
375                 "expected stale source file not found in result");
376     }
377 
378     @Test
379     public void testSingleFileSourceMapping() throws Exception {
380         File src = new File(getTestBaseDir(), "test9-src");
381 
382         File target = new File(getTestBaseDir(), "test9-target");
383 
384         long now = System.currentTimeMillis();
385 
386         // ----------------------------------------------------------------------
387         // The output file is missing
388         // ----------------------------------------------------------------------
389 
390         File fooCs = new File(src, "Foo.cs");
391 
392         writeFile(fooCs);
393 
394         fooCs.setLastModified(now - 10000);
395 
396         SourceMapping mapping = new SingleTargetSourceMapping(".cs", "Application.exe");
397 
398         scanner = new StaleSourceScanner(0);
399 
400         scanner.addSourceMapping(mapping);
401 
402         Set<File> result = scanner.getIncludedSources(src, target);
403 
404         assertEquals(1, result.size());
405 
406         assertTrue(result.contains(fooCs));
407 
408         // ----------------------------------------------------------------------
409         // Add another source file
410         // ----------------------------------------------------------------------
411 
412         File barCs = new File(src, "Bar.cs");
413 
414         writeFile(barCs);
415 
416         barCs.setLastModified(now - 20000);
417 
418         result = scanner.getIncludedSources(src, target);
419 
420         assertEquals(2, result.size());
421 
422         assertEquals(2, result.size());
423         assertTrue(result.contains(fooCs) && result.contains(barCs));
424 
425         // ----------------------------------------------------------------------
426         // Now add the result file
427         // ----------------------------------------------------------------------
428 
429         File applicationExe = new File(target, "Application.exe");
430 
431         writeFile(applicationExe);
432 
433         applicationExe.setLastModified(now);
434 
435         result = scanner.getIncludedSources(src, target);
436 
437         assertTrue(result.isEmpty());
438 
439         // ----------------------------------------------------------------------
440         // Make Application.exe older than the Foo.cs
441         // ----------------------------------------------------------------------
442 
443         applicationExe.setLastModified(now - 15000);
444 
445         result = scanner.getIncludedSources(src, target);
446 
447         assertEquals(1, result.size());
448 
449         assertTrue(result.contains(fooCs));
450     }
451 }