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.shared.filtering;
20  
21  import java.io.IOException;
22  import java.io.InputStream;
23  import java.nio.file.Files;
24  import java.nio.file.Path;
25  import java.nio.file.Paths;
26  import java.util.ArrayList;
27  import java.util.Collections;
28  import java.util.HashSet;
29  import java.util.List;
30  import java.util.Properties;
31  import java.util.Set;
32  
33  import org.apache.maven.api.di.Inject;
34  import org.apache.maven.api.di.testing.MavenDITest;
35  import org.apache.maven.api.plugin.testing.stubs.ProjectStub;
36  import org.apache.maven.di.Injector;
37  import org.codehaus.plexus.util.FileUtils;
38  import org.junit.jupiter.api.AfterEach;
39  import org.junit.jupiter.api.BeforeEach;
40  import org.junit.jupiter.api.Test;
41  import org.sonatype.plexus.build.incremental.ThreadBuildContext;
42  
43  import static org.apache.maven.api.di.testing.MavenDIExtension.getBasedir;
44  import static org.junit.jupiter.api.Assertions.assertEquals;
45  import static org.junit.jupiter.api.Assertions.assertFalse;
46  import static org.junit.jupiter.api.Assertions.assertTrue;
47  
48  @MavenDITest
49  public class IncrementalResourceFilteringTest {
50  
51      Path baseDirectory = Paths.get(getBasedir());
52      Path outputDirectory = baseDirectory.resolve("target/IncrementalResourceFilteringTest");
53      Path unitDirectory = baseDirectory.resolve("src/test/units-files/incremental");
54      Path filters = unitDirectory.resolve("filters.txt");
55      Path inputFile01 = unitDirectory.resolve("files/file01.txt");
56      Path inputFile02 = unitDirectory.resolve("files/file02.txt");
57      Path outputFile01 = outputDirectory.resolve("file01.txt");
58      Path outputFile02 = outputDirectory.resolve("file02.txt");
59  
60      @Inject
61      Injector container;
62  
63      @BeforeEach
64      protected void setUp() throws Exception {
65          FileUtils.deleteDirectory(outputDirectory.toFile());
66          Files.createDirectories(outputDirectory);
67      }
68  
69      @AfterEach
70      protected void tearDown() throws Exception {
71          ThreadBuildContext.setThreadBuildContext(null);
72      }
73  
74      @Test
75      public void testSimpleIncrementalFiltering() throws Exception {
76          // run full build first
77          filter("time");
78  
79          assertTime("time", "file01.txt");
80          assertTime("time", "file02.txt");
81  
82          // only one file is expected to change
83          Set<Path> changedFiles = new HashSet<>();
84          changedFiles.add(inputFile01);
85  
86          TestIncrementalBuildContext ctx = new TestIncrementalBuildContext(baseDirectory, changedFiles);
87          ThreadBuildContext.setThreadBuildContext(ctx);
88  
89          filter("notime");
90          assertTime("notime", "file01.txt");
91          assertTime("time", "file02.txt"); // this one is unchanged
92  
93          assertTrue(ctx.getRefreshFiles().contains(outputFile01));
94  
95          // only one file is expected to change
96          Set<Path> deletedFiles = new HashSet<>();
97          deletedFiles.add(inputFile01);
98  
99          ctx = new TestIncrementalBuildContext(baseDirectory, null, deletedFiles);
100         ThreadBuildContext.setThreadBuildContext(ctx);
101 
102         filter("moretime");
103         assertFalse(outputFile01.toFile().exists());
104         assertTime("time", "file02.txt"); // this one is unchanged
105 
106         assertTrue(ctx.getRefreshFiles().contains(outputFile01));
107     }
108 
109     @Test
110     public void testOutputChange() throws Exception {
111         // run full build first
112         filter("time");
113 
114         // all files are reprocessed after contents of output directory changed (e.g. was deleted)
115         Set<Path> changedFiles = new HashSet<>();
116         changedFiles.add(outputDirectory);
117         TestIncrementalBuildContext ctx = new TestIncrementalBuildContext(baseDirectory, changedFiles);
118         ThreadBuildContext.setThreadBuildContext(ctx);
119 
120         filter("notime");
121         assertTime("notime", "file01.txt");
122         assertTime("notime", "file02.txt");
123 
124         assertTrue(ctx.getRefreshFiles().contains(outputFile01));
125         assertTrue(ctx.getRefreshFiles().contains(outputFile02));
126     }
127 
128     @Test
129     public void testFilterChange() throws Exception {
130         // run full build first
131         filter("time");
132 
133         // all files are reprocessed after content of filters changes
134         Set<Path> changedFiles = new HashSet<>();
135         changedFiles.add(filters);
136         TestIncrementalBuildContext ctx = new TestIncrementalBuildContext(baseDirectory, changedFiles);
137         ThreadBuildContext.setThreadBuildContext(ctx);
138 
139         filter("notime");
140         assertTime("notime", "file01.txt");
141         assertTime("notime", "file02.txt");
142 
143         assertTrue(ctx.getRefreshFiles().contains(outputFile01));
144         assertTrue(ctx.getRefreshFiles().contains(outputFile02));
145     }
146 
147     @Test
148     public void testFilterDeleted() throws Exception {
149         // run full build first
150         filter("time");
151 
152         // all files are reprocessed after content of filters changes
153         Set<Path> deletedFiles = new HashSet<>();
154         deletedFiles.add(filters);
155         TestIncrementalBuildContext ctx = new TestIncrementalBuildContext(unitDirectory, null, deletedFiles);
156         ThreadBuildContext.setThreadBuildContext(ctx);
157 
158         filter("notime");
159         assertTime("notime", "file01.txt");
160         assertTime("notime", "file02.txt");
161 
162         assertTrue(ctx.getRefreshFiles().contains(outputFile01));
163         assertTrue(ctx.getRefreshFiles().contains(outputFile02));
164     }
165 
166     private void assertTime(String time, String relpath) throws IOException {
167         Properties properties = new Properties();
168 
169         try (InputStream is = Files.newInputStream(outputDirectory.resolve(relpath))) {
170             properties.load(is);
171         }
172 
173         assertEquals(time, properties.getProperty("time"));
174     }
175 
176     private void filter(String time) throws Exception {
177         Path baseDir = Paths.get(getBasedir());
178         ProjectStub mavenProject = new ProjectStub().setBasedir(baseDir);
179         mavenProject.setVersion("1.0");
180         mavenProject.setGroupId("org.apache");
181         mavenProject.setName("test project");
182 
183         mavenProject.addProperty("time", time);
184         mavenProject.addProperty("java.version", "zloug");
185         MavenResourcesFiltering mavenResourcesFiltering = container.getInstance(MavenResourcesFiltering.class);
186 
187         String unitFilesDir = unitDirectory.resolve("files").toString();
188 
189         Resource resource = new Resource();
190         List<Resource> resources = new ArrayList<>();
191         resources.add(resource);
192         resource.setDirectory(unitFilesDir);
193         resource.setFiltering(true);
194 
195         List<String> filtersFile = new ArrayList<>();
196         filtersFile.add(unitDirectory.resolve("filters.txt").toString());
197 
198         MavenResourcesExecution mre = new MavenResourcesExecution();
199         mre.setResources(resources);
200         mre.setOutputDirectory(outputDirectory);
201         mre.setEncoding("UTF-8");
202         mre.setMavenProject(mavenProject);
203         mre.setFilters(filtersFile);
204         mre.setNonFilteredFileExtensions(Collections.<String>emptyList());
205         mre.setMavenSession(new StubSession());
206         mre.setUseDefaultFilterWrappers(true);
207 
208         mavenResourcesFiltering.filterResources(mre);
209     }
210 }