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.File;
22  import java.io.Reader;
23  import java.io.StringReader;
24  import java.nio.file.Files;
25  import java.nio.file.Path;
26  import java.nio.file.Paths;
27  import java.nio.file.attribute.FileTime;
28  import java.util.ArrayList;
29  import java.util.Arrays;
30  import java.util.Collections;
31  import java.util.LinkedHashSet;
32  import java.util.List;
33  import java.util.Properties;
34  
35  import org.apache.maven.api.di.Inject;
36  import org.apache.maven.api.di.testing.MavenDITest;
37  import org.apache.maven.api.model.Build;
38  import org.apache.maven.api.plugin.testing.stubs.ProjectStub;
39  import org.apache.maven.di.Injector;
40  import org.junit.jupiter.api.BeforeEach;
41  import org.junit.jupiter.api.Test;
42  import org.sonatype.plexus.build.incremental.BuildContext;
43  
44  import static org.apache.maven.api.di.testing.MavenDIExtension.getBasedir;
45  import static org.junit.jupiter.api.Assertions.assertEquals;
46  import static org.mockito.Mockito.mock;
47  
48  /**
49   * @author Olivier Lamy
50   *
51   */
52  @MavenDITest
53  public class DefaultMavenFileFilterTest {
54  
55      @Inject
56      Injector container;
57  
58      Path to = Paths.get(getBasedir(), "target/reflection-test.properties");
59  
60      @BeforeEach
61      protected void setUp() throws Exception {
62          Files.deleteIfExists(to);
63      }
64  
65      @Test
66      public void testOverwriteFile() throws Exception {
67          MavenFileFilter mavenFileFilter = container.getInstance(MavenFileFilter.class);
68  
69          Path from = Paths.get(getBasedir(), "src/test/units-files/reflection-test.properties");
70  
71          mavenFileFilter.copyFile(from, to, false, null, null);
72  
73          from = Paths.get(getBasedir(), "src/test/units-files/reflection-test-older.properties");
74  
75          // very old file :-)
76          Files.setLastModifiedTime(from, FileTime.fromMillis(1));
77  
78          Files.setLastModifiedTime(to, FileTime.fromMillis(System.currentTimeMillis()));
79  
80          mavenFileFilter.copyFile(from, to, false, null, null);
81  
82          Properties properties = PropertyUtils.loadPropertyFile(to, null);
83          assertEquals("older file", properties.getProperty("version"));
84      }
85  
86      @Test
87      public void testNullSafeDefaultFilterWrappers() throws Exception {
88          MavenFileFilter mavenFileFilter = container.getInstance(MavenFileFilter.class);
89  
90          mavenFileFilter.getDefaultFilterWrappers(null, null, false, null, null);
91  
92          // shouldn't fail
93      }
94  
95      @Test
96      public void testMultiFilterFileInheritance() throws Exception {
97          DefaultMavenFileFilter mavenFileFilter = new DefaultMavenFileFilter(mock(BuildContext.class));
98  
99          File testDir = new File(getBasedir(), "src/test/units-files/MSHARED-177");
100 
101         List<String> filters = new ArrayList<>();
102 
103         filters.add(new File(testDir, "first_filter_file.properties").getAbsolutePath());
104         filters.add(new File(testDir, "second_filter_file.properties").getAbsolutePath());
105         filters.add(new File(testDir, "third_filter_file.properties").getAbsolutePath());
106 
107         final Properties filterProperties = new Properties();
108 
109         mavenFileFilter.loadProperties(filterProperties, Paths.get(getBasedir()), filters, new Properties());
110 
111         assertEquals("first and second", filterProperties.getProperty("third_filter_key"));
112     }
113 
114     // MSHARED-161: DefaultMavenFileFilter.getDefaultFilterWrappers loads
115     // filters from the current directory instead of using basedir
116     @Test
117     public void testMavenBasedir() throws Exception {
118         MavenFileFilter mavenFileFilter = container.getInstance(MavenFileFilter.class);
119 
120         AbstractMavenFilteringRequest req = new AbstractMavenFilteringRequest();
121         req.setFileFilters(Collections.singletonList("src/main/filters/filefilter.properties"));
122 
123         ProjectStub mavenProject = new ProjectStub();
124         mavenProject.setBasedir(Paths.get("src/test/units-files/MSHARED-161"));
125         List<String> filters = Collections.singletonList("src/main/filters/buildfilter.properties");
126         mavenProject.setModel(mavenProject
127                 .getModel()
128                 .withBuild(Build.newBuilder().filters(filters).build()));
129         req.setMavenProject(mavenProject);
130         req.setInjectProjectBuildFilters(true);
131 
132         List<FilterWrapper> wrappers = mavenFileFilter.getDefaultFilterWrappers(req);
133 
134         try (Reader reader = wrappers.get(0).getReader(new StringReader("${filefilter} ${buildfilter}"))) {
135             assertEquals("true true", IOUtils.toString(reader));
136         }
137     }
138 
139     // MSHARED-198: custom delimiters doesn't work as expected
140     @Test
141     public void testCustomDelimiters() throws Exception {
142         MavenFileFilter mavenFileFilter = container.getInstance(MavenFileFilter.class);
143 
144         AbstractMavenFilteringRequest req = new AbstractMavenFilteringRequest();
145         Properties additionalProperties = new Properties();
146         additionalProperties.setProperty("FILTER.a.ME", "DONE");
147         req.setAdditionalProperties(additionalProperties);
148         req.setDelimiters(new LinkedHashSet<>(Arrays.asList("aaa*aaa", "abc*abc")));
149 
150         List<FilterWrapper> wrappers = mavenFileFilter.getDefaultFilterWrappers(req);
151 
152         Reader reader = wrappers.get(0).getReader(new StringReader("aaaFILTER.a.MEaaa"));
153         assertEquals("DONE", IOUtils.toString(reader));
154 
155         reader = wrappers.get(0).getReader(new StringReader("abcFILTER.a.MEabc"));
156         assertEquals("DONE", IOUtils.toString(reader));
157     }
158 
159     // MSHARED-199: Filtering doesn't work if 2 delimiters are used on the same line, the first one being left open
160     @Test
161     public void testLineWithSingleAtAndExpression() throws Exception {
162         MavenFileFilter mavenFileFilter = container.getInstance(MavenFileFilter.class);
163 
164         AbstractMavenFilteringRequest req = new AbstractMavenFilteringRequest();
165         Properties additionalProperties = new Properties();
166         additionalProperties.setProperty("foo", "bar");
167         req.setAdditionalProperties(additionalProperties);
168 
169         List<FilterWrapper> wrappers = mavenFileFilter.getDefaultFilterWrappers(req);
170 
171         try (Reader reader = wrappers.get(0).getReader(new StringReader("toto@titi.com ${foo}"))) {
172             assertEquals("toto@titi.com bar", IOUtils.toString(reader));
173         }
174     }
175 }