View Javadoc
1   package org.apache.maven.toolchain.building;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *  http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
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.getProperty( "line.separator" );
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 }