1 package org.apache.maven.toolchain.building;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.maven.building.StringSource;
23 import org.apache.maven.toolchain.io.DefaultToolchainsReader;
24 import org.apache.maven.toolchain.io.DefaultToolchainsWriter;
25 import org.apache.maven.toolchain.io.ToolchainsParseException;
26 import org.apache.maven.toolchain.model.PersistedToolchains;
27 import org.apache.maven.toolchain.model.ToolchainModel;
28 import org.codehaus.plexus.interpolation.os.OperatingSystemUtils;
29 import org.codehaus.plexus.util.xml.Xpp3Dom;
30 import org.junit.Before;
31 import org.junit.Test;
32 import org.mockito.ArgumentMatchers;
33 import org.mockito.InjectMocks;
34 import org.mockito.MockitoAnnotations;
35 import org.mockito.Spy;
36
37 import java.io.IOException;
38 import java.io.InputStream;
39 import java.util.HashMap;
40 import java.util.Map;
41
42 import static org.junit.Assert.assertEquals;
43 import static org.junit.Assert.assertNotNull;
44 import static org.mockito.ArgumentMatchers.any;
45 import static org.mockito.Mockito.doReturn;
46 import static org.mockito.Mockito.doThrow;
47
48 public class DefaultToolchainsBuilderTest
49 {
50 private static final String LS = System.lineSeparator();
51
52 @Spy
53 private DefaultToolchainsReader toolchainsReader;
54
55 @Spy
56 private DefaultToolchainsWriter toolchainsWriter;
57
58 @InjectMocks
59 private DefaultToolchainsBuilder toolchainBuilder;
60
61 @Before
62 public void onSetup()
63 {
64 MockitoAnnotations.initMocks( this );
65
66 Map<String, String> envVarMap = new HashMap<>();
67 envVarMap.put("testKey", "testValue");
68 envVarMap.put("testSpecialCharactersKey", "<test&Value>");
69 OperatingSystemUtils.setEnvVarSource(new TestEnvVarSource(envVarMap));
70 }
71
72 @Test
73 public void testBuildEmptyRequest()
74 throws Exception
75 {
76 ToolchainsBuildingRequest request = new DefaultToolchainsBuildingRequest();
77 ToolchainsBuildingResult result = toolchainBuilder.build( request );
78 assertNotNull( result.getEffectiveToolchains() );
79 assertNotNull( result.getProblems() );
80 assertEquals( 0, result.getProblems().size() );
81 }
82
83 @Test
84 public void testBuildRequestWithUserToolchains()
85 throws Exception
86 {
87 ToolchainsBuildingRequest request = new DefaultToolchainsBuildingRequest();
88 request.setUserToolchainsSource( new StringSource( "" ) );
89
90 PersistedToolchains userResult = new PersistedToolchains();
91 ToolchainModel toolchain = new ToolchainModel();
92 toolchain.setType( "TYPE" );
93 toolchain.addProvide( "key", "user_value" );
94 userResult.addToolchain( toolchain );
95 doReturn(userResult).when( toolchainsReader ).read( any( InputStream.class ), ArgumentMatchers.<String, Object>anyMap());
96
97 ToolchainsBuildingResult result = toolchainBuilder.build( request );
98 assertNotNull( result.getEffectiveToolchains() );
99 assertEquals( 1, result.getEffectiveToolchains().getToolchains().size() );
100 assertEquals( "TYPE", result.getEffectiveToolchains().getToolchains().get(0).getType() );
101 assertEquals( "user_value", result.getEffectiveToolchains().getToolchains().get(0).getProvides().getProperty( "key" ) );
102 assertNotNull( result.getProblems() );
103 assertEquals( 0, result.getProblems().size() );
104 }
105
106 @Test
107 public void testBuildRequestWithGlobalToolchains()
108 throws Exception
109 {
110 ToolchainsBuildingRequest request = new DefaultToolchainsBuildingRequest();
111 request.setGlobalToolchainsSource( new StringSource( "" ) );
112
113 PersistedToolchains globalResult = new PersistedToolchains();
114 ToolchainModel toolchain = new ToolchainModel();
115 toolchain.setType( "TYPE" );
116 toolchain.addProvide( "key", "global_value" );
117 globalResult.addToolchain( toolchain );
118 doReturn(globalResult).when( toolchainsReader ).read( any( InputStream.class ), ArgumentMatchers.<String, Object>anyMap());
119
120 ToolchainsBuildingResult result = toolchainBuilder.build( request );
121 assertNotNull( result.getEffectiveToolchains() );
122 assertEquals( 1, result.getEffectiveToolchains().getToolchains().size() );
123 assertEquals( "TYPE", result.getEffectiveToolchains().getToolchains().get(0).getType() );
124 assertEquals( "global_value", result.getEffectiveToolchains().getToolchains().get(0).getProvides().getProperty( "key" ) );
125 assertNotNull( result.getProblems() );
126 assertEquals( 0, result.getProblems().size() );
127 }
128
129 @Test
130 public void testBuildRequestWithBothToolchains()
131 throws Exception
132 {
133 ToolchainsBuildingRequest request = new DefaultToolchainsBuildingRequest();
134 request.setGlobalToolchainsSource( new StringSource( "" ) );
135 request.setUserToolchainsSource( new StringSource( "" ) );
136
137 PersistedToolchains userResult = new PersistedToolchains();
138 ToolchainModel userToolchain = new ToolchainModel();
139 userToolchain.setType( "TYPE" );
140 userToolchain.addProvide( "key", "user_value" );
141 userResult.addToolchain( userToolchain );
142
143 PersistedToolchains globalResult = new PersistedToolchains();
144 ToolchainModel globalToolchain = new ToolchainModel();
145 globalToolchain.setType( "TYPE" );
146 globalToolchain.addProvide( "key", "global_value" );
147 globalResult.addToolchain( globalToolchain );
148 doReturn(globalResult).doReturn(userResult).when( toolchainsReader ).read( any( InputStream.class ), ArgumentMatchers.<String, Object>anyMap());
149
150 ToolchainsBuildingResult result = toolchainBuilder.build( request );
151 assertNotNull( result.getEffectiveToolchains() );
152 assertEquals( 2, result.getEffectiveToolchains().getToolchains().size() );
153 assertEquals( "TYPE", result.getEffectiveToolchains().getToolchains().get(0).getType() );
154 assertEquals( "user_value", result.getEffectiveToolchains().getToolchains().get(0).getProvides().getProperty( "key" ) );
155 assertEquals( "TYPE", result.getEffectiveToolchains().getToolchains().get(1).getType() );
156 assertEquals( "global_value", result.getEffectiveToolchains().getToolchains().get(1).getProvides().getProperty( "key" ) );
157 assertNotNull( result.getProblems() );
158 assertEquals( 0, result.getProblems().size() );
159 }
160
161 @Test
162 public void testStrictToolchainsParseException() throws Exception
163 {
164 ToolchainsBuildingRequest request = new DefaultToolchainsBuildingRequest();
165 request.setGlobalToolchainsSource( new StringSource( "" ) );
166 ToolchainsParseException parseException = new ToolchainsParseException( "MESSAGE", 4, 2 );
167 doThrow(parseException).when( toolchainsReader ).read( any( InputStream.class ), ArgumentMatchers.<String, Object>anyMap());
168
169 try
170 {
171 toolchainBuilder.build( request );
172 }
173 catch ( ToolchainsBuildingException e )
174 {
175 assertEquals( "1 problem was encountered while building the effective toolchains" + LS +
176 "[FATAL] Non-parseable toolchains (memory): MESSAGE @ line 4, column 2" + LS, e.getMessage() );
177 }
178 }
179
180 @Test
181 public void testIOException() throws Exception
182 {
183 ToolchainsBuildingRequest request = new DefaultToolchainsBuildingRequest();
184 request.setGlobalToolchainsSource( new StringSource( "", "LOCATION" ) );
185 IOException ioException = new IOException( "MESSAGE" );
186 doThrow(ioException).when( toolchainsReader ).read( any( InputStream.class ), ArgumentMatchers.<String, Object>anyMap());
187
188 try
189 {
190 toolchainBuilder.build( request );
191 }
192 catch ( ToolchainsBuildingException e )
193 {
194 assertEquals( "1 problem was encountered while building the effective toolchains" + LS +
195 "[FATAL] Non-readable toolchains LOCATION: MESSAGE" + LS, e.getMessage() );
196 }
197 }
198
199 @Test
200 public void testEnvironmentVariablesAreInterpolated()
201 throws Exception
202 {
203 ToolchainsBuildingRequest request = new DefaultToolchainsBuildingRequest();
204 request.setUserToolchainsSource( new StringSource( "" ) );
205
206 PersistedToolchains persistedToolchains = new PersistedToolchains();
207 ToolchainModel toolchain = new ToolchainModel();
208 toolchain.setType( "TYPE" );
209 toolchain.addProvide( "key", "${env.testKey}" );
210
211 Xpp3Dom configurationChild = new Xpp3Dom("jdkHome");
212 configurationChild.setValue("${env.testKey}");
213 Xpp3Dom configuration = new Xpp3Dom("configuration");
214 configuration.addChild(configurationChild);
215 toolchain.setConfiguration(configuration);
216 persistedToolchains.addToolchain( toolchain );
217 doReturn(persistedToolchains).when( toolchainsReader ).read( any( InputStream.class ), ArgumentMatchers.<String, Object>anyMap());
218
219 ToolchainsBuildingResult result = toolchainBuilder.build( request );
220 String interpolatedValue = "testValue";
221 assertEquals(interpolatedValue, result.getEffectiveToolchains().getToolchains().get(0).getProvides().getProperty( "key" ) );
222 Xpp3Dom toolchainConfiguration = (Xpp3Dom) result.getEffectiveToolchains().getToolchains().get(0).getConfiguration();
223 assertEquals(interpolatedValue, toolchainConfiguration.getChild("jdkHome").getValue());
224 assertNotNull( result.getProblems() );
225 assertEquals( 0, result.getProblems().size() );
226 }
227
228 @Test
229 public void testNonExistingEnvironmentVariablesAreNotInterpolated()
230 throws Exception
231 {
232 ToolchainsBuildingRequest request = new DefaultToolchainsBuildingRequest();
233 request.setUserToolchainsSource( new StringSource( "" ) );
234
235 PersistedToolchains persistedToolchains = new PersistedToolchains();
236 ToolchainModel toolchain = new ToolchainModel();
237 toolchain.setType( "TYPE" );
238 toolchain.addProvide( "key", "${env.testNonExistingKey}" );
239
240 persistedToolchains.addToolchain( toolchain );
241 doReturn(persistedToolchains).when( toolchainsReader ).read( any( InputStream.class ), ArgumentMatchers.<String, Object>anyMap());
242
243 ToolchainsBuildingResult result = toolchainBuilder.build( request );
244 assertEquals("${env.testNonExistingKey}", result.getEffectiveToolchains().getToolchains().get(0).getProvides().getProperty( "key" ) );
245 assertNotNull( result.getProblems() );
246 assertEquals( 0, result.getProblems().size() );
247 }
248
249 @Test
250 public void testEnvironmentVariablesWithSpecialCharactersAreInterpolated()
251 throws Exception
252 {
253 ToolchainsBuildingRequest request = new DefaultToolchainsBuildingRequest();
254 request.setUserToolchainsSource( new StringSource( "" ) );
255
256 PersistedToolchains persistedToolchains = new PersistedToolchains();
257 ToolchainModel toolchain = new ToolchainModel();
258 toolchain.setType( "TYPE" );
259 toolchain.addProvide( "key", "${env.testSpecialCharactersKey}" );
260
261 persistedToolchains.addToolchain( toolchain );
262 doReturn(persistedToolchains).when( toolchainsReader ).read( any( InputStream.class ), ArgumentMatchers.<String, Object>anyMap());
263
264 ToolchainsBuildingResult result = toolchainBuilder.build( request );
265 String interpolatedValue = "<test&Value>";
266 assertEquals(interpolatedValue, result.getEffectiveToolchains().getToolchains().get(0).getProvides().getProperty( "key" ) );
267 assertNotNull( result.getProblems() );
268 assertEquals( 0, result.getProblems().size() );
269 }
270
271 static class TestEnvVarSource implements OperatingSystemUtils.EnvVarSource {
272 private final Map<String, String> envVarMap;
273
274 TestEnvVarSource(Map<String, String> envVarMap) {
275 this.envVarMap = envVarMap;
276 }
277
278 public Map<String, String> getEnvMap() {
279 return envVarMap;
280 }
281 }
282
283 }