1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
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
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
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
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
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
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 }