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.internal.aether;
20  
21  import javax.inject.Inject;
22  
23  import java.io.File;
24  import java.util.ArrayList;
25  import java.util.Collections;
26  import java.util.List;
27  import java.util.Map;
28  import java.util.Properties;
29  
30  import org.apache.maven.artifact.InvalidRepositoryException;
31  import org.apache.maven.artifact.repository.ArtifactRepository;
32  import org.apache.maven.bridge.MavenRepositorySystem;
33  import org.apache.maven.eventspy.internal.EventSpyDispatcher;
34  import org.apache.maven.execution.DefaultMavenExecutionRequest;
35  import org.apache.maven.execution.MavenExecutionRequest;
36  import org.apache.maven.internal.impl.DefaultTypeRegistry;
37  import org.apache.maven.rtinfo.RuntimeInformation;
38  import org.apache.maven.settings.Server;
39  import org.apache.maven.settings.crypto.SettingsDecrypter;
40  import org.codehaus.plexus.configuration.PlexusConfiguration;
41  import org.codehaus.plexus.testing.PlexusTest;
42  import org.codehaus.plexus.util.xml.Xpp3Dom;
43  import org.eclipse.aether.ConfigurationProperties;
44  import org.eclipse.aether.collection.VersionFilter;
45  import org.eclipse.aether.repository.RepositoryPolicy;
46  import org.eclipse.aether.util.graph.version.*;
47  import org.eclipse.aether.version.VersionScheme;
48  import org.junit.jupiter.api.Test;
49  
50  import static org.codehaus.plexus.testing.PlexusExtension.getBasedir;
51  import static org.junit.jupiter.api.Assertions.*;
52  
53  /**
54   * UT for {@link DefaultRepositorySystemSessionFactory}.
55   */
56  @PlexusTest
57  public class DefaultRepositorySystemSessionFactoryTest {
58      @Inject
59      protected MavenRepositorySystem mavenRepositorySystem;
60  
61      @Inject
62      protected EventSpyDispatcher eventSpyDispatcher;
63  
64      @Inject
65      protected SettingsDecrypter settingsDecrypter;
66  
67      @Inject
68      protected org.eclipse.aether.RepositorySystem aetherRepositorySystem;
69  
70      @Inject
71      protected RuntimeInformation information;
72  
73      @Inject
74      protected DefaultTypeRegistry defaultTypeRegistry;
75  
76      @Inject
77      protected VersionScheme versionScheme;
78  
79      @Test
80      void isNoSnapshotUpdatesTest() throws InvalidRepositoryException {
81          DefaultRepositorySystemSessionFactory systemSessionFactory = new DefaultRepositorySystemSessionFactory(
82                  aetherRepositorySystem,
83                  settingsDecrypter,
84                  eventSpyDispatcher,
85                  information,
86                  defaultTypeRegistry,
87                  versionScheme,
88                  Collections.emptyMap(),
89                  Collections.emptyMap());
90  
91          MavenExecutionRequest request = new DefaultMavenExecutionRequest();
92          request.setLocalRepository(getLocalRepository());
93          assertNull(systemSessionFactory.newRepositorySession(request).getUpdatePolicy());
94  
95          request = new DefaultMavenExecutionRequest();
96          request.setLocalRepository(getLocalRepository());
97          request.setNoSnapshotUpdates(true);
98          assertEquals(
99                  RepositoryPolicy.UPDATE_POLICY_NEVER,
100                 systemSessionFactory.newRepositorySession(request).getUpdatePolicy());
101     }
102 
103     @Test
104     void isSnapshotUpdatesTest() throws InvalidRepositoryException {
105         DefaultRepositorySystemSessionFactory systemSessionFactory = new DefaultRepositorySystemSessionFactory(
106                 aetherRepositorySystem,
107                 settingsDecrypter,
108                 eventSpyDispatcher,
109                 information,
110                 defaultTypeRegistry,
111                 versionScheme,
112                 Collections.emptyMap(),
113                 Collections.emptyMap());
114 
115         MavenExecutionRequest request = new DefaultMavenExecutionRequest();
116         request.setLocalRepository(getLocalRepository());
117         request.setUpdateSnapshots(true);
118         assertEquals(
119                 RepositoryPolicy.UPDATE_POLICY_ALWAYS,
120                 systemSessionFactory.newRepositorySession(request).getUpdatePolicy());
121     }
122 
123     @Test
124     void wagonProviderConfigurationTest() throws InvalidRepositoryException {
125         Server server = new Server();
126         server.setId("repository");
127         server.setUsername("jason");
128         server.setPassword("abc123");
129         Xpp3Dom configuration = new Xpp3Dom("configuration");
130         Xpp3Dom wagonProvider = new Xpp3Dom("wagonProvider");
131         wagonProvider.setValue("httpclient");
132         configuration.addChild(wagonProvider);
133         server.setConfiguration(configuration);
134 
135         MavenExecutionRequest request = new DefaultMavenExecutionRequest();
136         request.setLocalRepository(getLocalRepository());
137         List<Server> servers = new ArrayList<>();
138         servers.add(server);
139         request.setServers(servers);
140 
141         DefaultRepositorySystemSessionFactory systemSessionFactory = new DefaultRepositorySystemSessionFactory(
142                 aetherRepositorySystem,
143                 settingsDecrypter,
144                 eventSpyDispatcher,
145                 information,
146                 defaultTypeRegistry,
147                 versionScheme,
148                 Collections.emptyMap(),
149                 Collections.emptyMap());
150 
151         PlexusConfiguration plexusConfiguration = (PlexusConfiguration) systemSessionFactory
152                 .newRepositorySession(request)
153                 .getConfigProperties()
154                 .get("aether.transport.wagon.config.repository");
155         assertNotNull(plexusConfiguration);
156         assertEquals(0, plexusConfiguration.getChildCount());
157     }
158 
159     @Test
160     void httpConfigurationWithHttpHeadersTest() throws InvalidRepositoryException {
161         Server server = new Server();
162         server.setId("repository");
163         server.setUsername("jason");
164         server.setPassword("abc123");
165         Xpp3Dom httpConfiguration = new Xpp3Dom("httpConfiguration");
166         Xpp3Dom httpHeaders = new Xpp3Dom("httpHeaders");
167         Xpp3Dom property = new Xpp3Dom("property");
168         Xpp3Dom headerName = new Xpp3Dom("name");
169         headerName.setValue("header");
170         Xpp3Dom headerValue = new Xpp3Dom("value");
171         headerValue.setValue("value");
172         property.addChild(headerName);
173         property.addChild(headerValue);
174         httpHeaders.addChild(property);
175         httpConfiguration.addChild(httpHeaders);
176 
177         server.setConfiguration(httpConfiguration);
178 
179         MavenExecutionRequest request = new DefaultMavenExecutionRequest();
180         request.setLocalRepository(getLocalRepository());
181         List<Server> servers = new ArrayList<>();
182         servers.add(server);
183         request.setServers(servers);
184 
185         DefaultRepositorySystemSessionFactory systemSessionFactory = new DefaultRepositorySystemSessionFactory(
186                 aetherRepositorySystem,
187                 settingsDecrypter,
188                 eventSpyDispatcher,
189                 information,
190                 defaultTypeRegistry,
191                 versionScheme,
192                 Collections.emptyMap(),
193                 Collections.emptyMap());
194 
195         Map<String, String> headers = (Map<String, String>) systemSessionFactory
196                 .newRepositorySession(request)
197                 .getConfigProperties()
198                 .get(ConfigurationProperties.HTTP_HEADERS + "." + server.getId());
199         assertNotNull(headers);
200         assertEquals(1, headers.size());
201         assertEquals("value", headers.get("header"));
202     }
203 
204     @Test
205     void connectTimeoutConfigurationTest() throws InvalidRepositoryException {
206         Server server = new Server();
207         server.setId("repository");
208         server.setUsername("jason");
209         server.setPassword("abc123");
210         Xpp3Dom configuration = new Xpp3Dom("configuration");
211         Xpp3Dom connectTimeoutConfiguration = new Xpp3Dom("connectTimeout");
212         connectTimeoutConfiguration.setValue("3000");
213         configuration.addChild(connectTimeoutConfiguration);
214 
215         server.setConfiguration(configuration);
216 
217         MavenExecutionRequest request = new DefaultMavenExecutionRequest();
218         request.setLocalRepository(getLocalRepository());
219         List<Server> servers = new ArrayList<>();
220         servers.add(server);
221         request.setServers(servers);
222 
223         DefaultRepositorySystemSessionFactory systemSessionFactory = new DefaultRepositorySystemSessionFactory(
224                 aetherRepositorySystem,
225                 settingsDecrypter,
226                 eventSpyDispatcher,
227                 information,
228                 defaultTypeRegistry,
229                 versionScheme,
230                 Collections.emptyMap(),
231                 Collections.emptyMap());
232 
233         int connectionTimeout = (Integer) systemSessionFactory
234                 .newRepositorySession(request)
235                 .getConfigProperties()
236                 .get(ConfigurationProperties.CONNECT_TIMEOUT + "." + server.getId());
237         assertEquals(3000, connectionTimeout);
238     }
239 
240     @Test
241     void connectionTimeoutFromHttpConfigurationTest() throws InvalidRepositoryException {
242         Server server = new Server();
243         server.setId("repository");
244         server.setUsername("jason");
245         server.setPassword("abc123");
246 
247         Xpp3Dom configuration = new Xpp3Dom("configuration");
248         Xpp3Dom httpConfiguration = new Xpp3Dom("httpConfiguration");
249         Xpp3Dom all = new Xpp3Dom("all");
250         Xpp3Dom connectTimeoutConfiguration = new Xpp3Dom("connectionTimeout");
251         connectTimeoutConfiguration.setValue("3000");
252 
253         all.addChild(connectTimeoutConfiguration);
254         httpConfiguration.addChild(all);
255         configuration.addChild(httpConfiguration);
256 
257         server.setConfiguration(configuration);
258 
259         MavenExecutionRequest request = new DefaultMavenExecutionRequest();
260         request.setLocalRepository(getLocalRepository());
261         List<Server> servers = new ArrayList<>();
262         servers.add(server);
263         request.setServers(servers);
264 
265         DefaultRepositorySystemSessionFactory systemSessionFactory = new DefaultRepositorySystemSessionFactory(
266                 aetherRepositorySystem,
267                 settingsDecrypter,
268                 eventSpyDispatcher,
269                 information,
270                 defaultTypeRegistry,
271                 versionScheme,
272                 Collections.emptyMap(),
273                 Collections.emptyMap());
274 
275         int connectionTimeout = (Integer) systemSessionFactory
276                 .newRepositorySession(request)
277                 .getConfigProperties()
278                 .get(ConfigurationProperties.CONNECT_TIMEOUT + "." + server.getId());
279         assertEquals(3000, connectionTimeout);
280     }
281 
282     @Test
283     void requestTimeoutConfigurationTest() throws InvalidRepositoryException {
284         Server server = new Server();
285         server.setId("repository");
286         server.setUsername("jason");
287         server.setPassword("abc123");
288         Xpp3Dom configuration = new Xpp3Dom("configuration");
289         Xpp3Dom requestTimeoutConfiguration = new Xpp3Dom("requestTimeout");
290         requestTimeoutConfiguration.setValue("3000");
291         configuration.addChild(requestTimeoutConfiguration);
292 
293         server.setConfiguration(configuration);
294 
295         MavenExecutionRequest request = new DefaultMavenExecutionRequest();
296         request.setLocalRepository(getLocalRepository());
297         List<Server> servers = new ArrayList<>();
298         servers.add(server);
299         request.setServers(servers);
300 
301         DefaultRepositorySystemSessionFactory systemSessionFactory = new DefaultRepositorySystemSessionFactory(
302                 aetherRepositorySystem,
303                 settingsDecrypter,
304                 eventSpyDispatcher,
305                 information,
306                 defaultTypeRegistry,
307                 versionScheme,
308                 Collections.emptyMap(),
309                 Collections.emptyMap());
310 
311         int requestTimeout = (Integer) systemSessionFactory
312                 .newRepositorySession(request)
313                 .getConfigProperties()
314                 .get(ConfigurationProperties.REQUEST_TIMEOUT + "." + server.getId());
315         assertEquals(3000, requestTimeout);
316     }
317 
318     @Test
319     void readTimeoutFromHttpConfigurationTest() throws InvalidRepositoryException {
320         Server server = new Server();
321         server.setId("repository");
322         server.setUsername("jason");
323         server.setPassword("abc123");
324 
325         Xpp3Dom configuration = new Xpp3Dom("configuration");
326         Xpp3Dom httpConfiguration = new Xpp3Dom("httpConfiguration");
327         Xpp3Dom all = new Xpp3Dom("all");
328         Xpp3Dom readTimeoutConfiguration = new Xpp3Dom("readTimeout");
329         readTimeoutConfiguration.setValue("3000");
330 
331         all.addChild(readTimeoutConfiguration);
332         httpConfiguration.addChild(all);
333         configuration.addChild(httpConfiguration);
334 
335         server.setConfiguration(configuration);
336 
337         MavenExecutionRequest request = new DefaultMavenExecutionRequest();
338         request.setLocalRepository(getLocalRepository());
339         List<Server> servers = new ArrayList<>();
340         servers.add(server);
341         request.setServers(servers);
342 
343         DefaultRepositorySystemSessionFactory systemSessionFactory = new DefaultRepositorySystemSessionFactory(
344                 aetherRepositorySystem,
345                 settingsDecrypter,
346                 eventSpyDispatcher,
347                 information,
348                 defaultTypeRegistry,
349                 versionScheme,
350                 Collections.emptyMap(),
351                 Collections.emptyMap());
352 
353         int requestTimeout = (Integer) systemSessionFactory
354                 .newRepositorySession(request)
355                 .getConfigProperties()
356                 .get(ConfigurationProperties.REQUEST_TIMEOUT + "." + server.getId());
357         assertEquals(3000, requestTimeout);
358     }
359 
360     @Test
361     void transportConfigurationTest() throws InvalidRepositoryException {
362         DefaultRepositorySystemSessionFactory systemSessionFactory = new DefaultRepositorySystemSessionFactory(
363                 aetherRepositorySystem,
364                 settingsDecrypter,
365                 eventSpyDispatcher,
366                 information,
367                 defaultTypeRegistry,
368                 versionScheme,
369                 Collections.emptyMap(),
370                 Collections.emptyMap());
371 
372         MavenExecutionRequest request = new DefaultMavenExecutionRequest();
373         request.setLocalRepository(getLocalRepository());
374 
375         // native
376         Properties properties = new Properties();
377         properties.setProperty("maven.resolver.transport", "apache");
378         request.setSystemProperties(properties);
379         Map<String, Object> configProperties =
380                 systemSessionFactory.newRepositorySession(request).getConfigProperties();
381         assertEquals(String.valueOf(Float.MAX_VALUE), configProperties.get("aether.priority.FileTransporterFactory"));
382         assertEquals(String.valueOf(Float.MAX_VALUE), configProperties.get("aether.priority.ApacheTransporterFactory"));
383         properties.remove("maven.resolver.transport");
384 
385         // wagon
386         properties.setProperty("maven.resolver.transport", "wagon");
387         request.setSystemProperties(properties);
388         assertEquals(
389                 String.valueOf(Float.MAX_VALUE),
390                 systemSessionFactory
391                         .newRepositorySession(request)
392                         .getConfigProperties()
393                         .get("aether.priority.WagonTransporterFactory"));
394         properties.remove("maven.resolver.transport");
395 
396         // illegal
397         properties.setProperty("maven.resolver.transport", "illegal");
398         request.setSystemProperties(properties);
399         IllegalArgumentException exception = assertThrowsExactly(
400                 IllegalArgumentException.class, () -> systemSessionFactory.newRepositorySession(request));
401         assertEquals(
402                 "Unknown resolver transport 'illegal'. Supported transports are: wagon, apache, jdk, auto",
403                 exception.getMessage());
404         properties.remove("maven.resolver.transport");
405     }
406 
407     @Test
408     void versionFilteringTest() throws InvalidRepositoryException {
409         DefaultRepositorySystemSessionFactory systemSessionFactory = new DefaultRepositorySystemSessionFactory(
410                 aetherRepositorySystem,
411                 settingsDecrypter,
412                 eventSpyDispatcher,
413                 information,
414                 defaultTypeRegistry,
415                 versionScheme,
416                 Collections.emptyMap(),
417                 Collections.emptyMap());
418 
419         MavenExecutionRequest request = new DefaultMavenExecutionRequest();
420         request.setLocalRepository(getLocalRepository());
421 
422         VersionFilter versionFilter;
423 
424         // single one
425         request.getUserProperties().put("maven.versionFilters", "s");
426         versionFilter = systemSessionFactory.newRepositorySession(request).getVersionFilter();
427         assertNotNull(versionFilter);
428         assertTrue(versionFilter instanceof ContextualSnapshotVersionFilter);
429 
430         request.getUserProperties().put("maven.versionFilters", "h");
431         versionFilter = systemSessionFactory.newRepositorySession(request).getVersionFilter();
432         assertNotNull(versionFilter);
433         assertTrue(versionFilter instanceof HighestVersionFilter);
434 
435         request.getUserProperties().put("maven.versionFilters", "h(5)");
436         versionFilter = systemSessionFactory.newRepositorySession(request).getVersionFilter();
437         assertNotNull(versionFilter);
438         assertTrue(versionFilter instanceof HighestVersionFilter);
439 
440         request.getUserProperties().put("maven.versionFilters", "l");
441         versionFilter = systemSessionFactory.newRepositorySession(request).getVersionFilter();
442         assertNotNull(versionFilter);
443         assertTrue(versionFilter instanceof LowestVersionFilter);
444 
445         request.getUserProperties().put("maven.versionFilters", "l(5)");
446         versionFilter = systemSessionFactory.newRepositorySession(request).getVersionFilter();
447         assertNotNull(versionFilter);
448         assertTrue(versionFilter instanceof LowestVersionFilter);
449 
450         request.getUserProperties().put("maven.versionFilters", "e(g:a:v)");
451         versionFilter = systemSessionFactory.newRepositorySession(request).getVersionFilter();
452         assertNotNull(versionFilter);
453         assertTrue(versionFilter instanceof PredicateVersionFilter);
454 
455         request.getUserProperties().put("maven.versionFilters", "e(g:a:[1,2])");
456         versionFilter = systemSessionFactory.newRepositorySession(request).getVersionFilter();
457         assertNotNull(versionFilter);
458         assertTrue(versionFilter instanceof PredicateVersionFilter);
459 
460         // chained
461         request.getUserProperties().put("maven.versionFilters", "h(5);s;e(org.foo:bar:1)");
462         versionFilter = systemSessionFactory.newRepositorySession(request).getVersionFilter();
463         assertNotNull(versionFilter);
464         assertTrue(versionFilter instanceof ChainedVersionFilter);
465     }
466 
467     protected ArtifactRepository getLocalRepository() throws InvalidRepositoryException {
468         File repoDir = new File(getBasedir(), "target/local-repo").getAbsoluteFile();
469 
470         return mavenRepositorySystem.createLocalRepository(repoDir);
471     }
472 }