1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.impl.model;
20
21 import java.lang.reflect.Field;
22 import java.nio.file.Path;
23 import java.nio.file.Paths;
24 import java.util.Arrays;
25 import java.util.List;
26 import java.util.Map;
27
28 import org.apache.maven.api.RemoteRepository;
29 import org.apache.maven.api.Session;
30 import org.apache.maven.api.model.Model;
31 import org.apache.maven.api.model.Repository;
32 import org.apache.maven.api.services.ModelBuilder;
33 import org.apache.maven.api.services.ModelBuilderRequest;
34 import org.apache.maven.api.services.ModelBuilderResult;
35 import org.apache.maven.api.services.Sources;
36 import org.apache.maven.impl.standalone.ApiRunner;
37 import org.junit.jupiter.api.BeforeEach;
38 import org.junit.jupiter.api.Test;
39
40 import static org.junit.jupiter.api.Assertions.assertEquals;
41 import static org.junit.jupiter.api.Assertions.assertNotNull;
42
43
44
45
46 class DefaultModelBuilderTest {
47
48 Session session;
49 ModelBuilder builder;
50
51 @BeforeEach
52 void setup() {
53 session = ApiRunner.createSession();
54 builder = session.getService(ModelBuilder.class);
55 assertNotNull(builder);
56 }
57
58 @Test
59 public void testPropertiesAndProfiles() {
60 ModelBuilderRequest request = ModelBuilderRequest.builder()
61 .session(session)
62 .requestType(ModelBuilderRequest.RequestType.BUILD_PROJECT)
63 .source(Sources.buildSource(getPom("props-and-profiles")))
64 .build();
65 ModelBuilderResult result = builder.newSession().build(request);
66 assertNotNull(result);
67 assertEquals("21", result.getEffectiveModel().getProperties().get("maven.compiler.release"));
68 }
69
70 @Test
71 public void testMergeRepositories() throws Exception {
72
73 ModelBuilderRequest request = ModelBuilderRequest.builder()
74 .session(session)
75 .userProperties(Map.of("firstParentRepo", "https://some.repo"))
76 .requestType(ModelBuilderRequest.RequestType.BUILD_PROJECT)
77 .source(Sources.buildSource(getPom("props-and-profiles")))
78 .build();
79 ModelBuilder.ModelBuilderSession session = builder.newSession();
80 session.build(request);
81
82 Field mainSessionField = DefaultModelBuilder.ModelBuilderSessionImpl.class.getDeclaredField("mainSession");
83 mainSessionField.setAccessible(true);
84 DefaultModelBuilder.ModelBuilderSessionState state =
85 (DefaultModelBuilder.ModelBuilderSessionState) mainSessionField.get(session);
86 Field repositoriesField = DefaultModelBuilder.ModelBuilderSessionState.class.getDeclaredField("repositories");
87 repositoriesField.setAccessible(true);
88
89 List<RemoteRepository> repositories;
90
91 repositories = (List<RemoteRepository>) repositoriesField.get(state);
92 assertEquals(1, repositories.size());
93
94 Model model = Model.newBuilder()
95 .repositories(Arrays.asList(
96 Repository.newBuilder()
97 .id("first")
98 .url("${firstParentRepo}")
99 .build(),
100 Repository.newBuilder()
101 .id("second")
102 .url("${secondParentRepo}")
103 .build()))
104 .build();
105 state.mergeRepositories(model, false);
106
107
108 repositories = (List<RemoteRepository>) repositoriesField.get(state);
109 assertEquals(3, repositories.size());
110 assertEquals("first", repositories.get(0).getId());
111 assertEquals("https://some.repo", repositories.get(0).getUrl()); // interpolated
112 assertEquals("second", repositories.get(1).getId());
113 assertEquals("${secondParentRepo}", repositories.get(1).getUrl());
114 assertEquals("central", repositories.get(2).getId());
115 }
116
117 private Path getPom(String name) {
118 return Paths.get("src/test/resources/poms/factory/" + name + ".xml").toAbsolutePath();
119 }
120 }