1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
77 filter("time");
78
79 assertTime("time", "file01.txt");
80 assertTime("time", "file02.txt");
81
82
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");
92
93 assertTrue(ctx.getRefreshFiles().contains(outputFile01));
94
95
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");
105
106 assertTrue(ctx.getRefreshFiles().contains(outputFile01));
107 }
108
109 @Test
110 public void testOutputChange() throws Exception {
111
112 filter("time");
113
114
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
131 filter("time");
132
133
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
150 filter("time");
151
152
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 }