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.project;
20  
21  import java.io.File;
22  import java.io.IOException;
23  import java.util.List;
24  import java.util.Map;
25  
26  import org.apache.maven.model.DependencyManagement;
27  import org.apache.maven.model.Model;
28  import org.apache.maven.model.Parent;
29  import org.apache.maven.model.Profile;
30  import org.junit.jupiter.api.Test;
31  
32  import static org.junit.jupiter.api.Assertions.assertEquals;
33  import static org.junit.jupiter.api.Assertions.assertFalse;
34  import static org.junit.jupiter.api.Assertions.assertNotNull;
35  import static org.junit.jupiter.api.Assertions.assertNotSame;
36  import static org.junit.jupiter.api.Assertions.assertTrue;
37  
38  class MavenProjectTest extends AbstractMavenProjectTestCase {
39  
40      @Test
41      void testShouldInterpretChildPathAdjustmentBasedOnModulePaths() throws IOException {
42          Model parentModel = new Model();
43          parentModel.addModule("../child");
44  
45          MavenProject parentProject = new MavenProject(parentModel);
46  
47          Model childModel = new Model();
48          childModel.setArtifactId("artifact");
49  
50          MavenProject childProject = new MavenProject(childModel);
51  
52          File childFile = new File(
53                  System.getProperty("java.io.tmpdir"),
54                  "maven-project-tests" + System.currentTimeMillis() + "/child/pom.xml");
55  
56          childProject.setFile(childFile);
57  
58          String adjustment = parentProject.getModulePathAdjustment(childProject);
59  
60          assertNotNull(adjustment);
61  
62          assertEquals("..", adjustment);
63      }
64  
65      @Test
66      void testIdentityProtoInheritance() {
67          Parent parent = new Parent();
68  
69          parent.setGroupId("test-group");
70          parent.setVersion("1000");
71          parent.setArtifactId("test-artifact");
72  
73          Model model = new Model();
74  
75          model.setParent(parent);
76          model.setArtifactId("real-artifact");
77  
78          MavenProject project = new MavenProject(model);
79  
80          assertEquals("test-group", project.getGroupId(), "groupId proto-inheritance failed.");
81          assertEquals("real-artifact", project.getArtifactId(), "artifactId is masked.");
82          assertEquals("1000", project.getVersion(), "version proto-inheritance failed.");
83  
84          // draw the NPE.
85          project.getId();
86      }
87  
88      @Test
89      void testEmptyConstructor() {
90          MavenProject project = new MavenProject();
91  
92          assertEquals(
93                  MavenProject.EMPTY_PROJECT_GROUP_ID + ":" + MavenProject.EMPTY_PROJECT_ARTIFACT_ID + ":jar:"
94                          + MavenProject.EMPTY_PROJECT_VERSION,
95                  project.getId());
96      }
97  
98      @Test
99      void testClone() throws Exception {
100         File f = getFileForClasspathResource("canonical-pom.xml");
101         MavenProject projectToClone = getProject(f);
102 
103         MavenProject clonedProject = projectToClone.clone();
104         assertEquals("maven-core", clonedProject.getArtifactId());
105         Map<?, ?> clonedMap = clonedProject.getManagedVersionMap();
106         assertNotNull(clonedMap, "ManagedVersionMap not copied");
107         assertTrue(clonedMap.isEmpty(), "ManagedVersionMap is not empty");
108     }
109 
110     @Test
111     void testCloneWithDependencyManagement() throws Exception {
112         File f = getFileForClasspathResource("dependencyManagement-pom.xml");
113         MavenProject projectToClone = getProjectWithDependencies(f);
114         DependencyManagement dep = projectToClone.getDependencyManagement();
115         assertNotNull(dep, "No dependencyManagement");
116         List<?> list = dep.getDependencies();
117         assertNotNull(list, "No dependencies");
118         assertTrue(!list.isEmpty(), "Empty dependency list");
119 
120         Map<?, ?> map = projectToClone.getManagedVersionMap();
121         assertNotNull(map, "No ManagedVersionMap");
122         assertTrue(!map.isEmpty(), "ManagedVersionMap is empty");
123 
124         MavenProject clonedProject = projectToClone.clone();
125         assertEquals("maven-core", clonedProject.getArtifactId());
126         Map<?, ?> clonedMap = clonedProject.getManagedVersionMap();
127         assertNotNull(clonedMap, "ManagedVersionMap not copied");
128         assertTrue(!clonedMap.isEmpty(), "ManagedVersionMap is empty");
129         assertTrue(clonedMap.containsKey("maven-test:maven-test-b:jar"), "ManagedVersionMap does not contain test key");
130     }
131 
132     @Test
133     void testGetModulePathAdjustment() throws IOException {
134         Model moduleModel = new Model();
135 
136         MavenProject module = new MavenProject(moduleModel);
137         module.setFile(new File("module-dir/pom.xml"));
138 
139         Model parentModel = new Model();
140         parentModel.addModule("../module-dir");
141 
142         MavenProject parent = new MavenProject(parentModel);
143         parent.setFile(new File("parent-dir/pom.xml"));
144 
145         String pathAdjustment = parent.getModulePathAdjustment(module);
146 
147         assertEquals("..", pathAdjustment);
148     }
149 
150     @Test
151     void testCloneWithDistributionManagement() throws Exception {
152 
153         File f = getFileForClasspathResource("distributionManagement-pom.xml");
154         MavenProject projectToClone = getProject(f);
155 
156         MavenProject clonedProject = projectToClone.clone();
157         assertNotNull(
158                 clonedProject.getDistributionManagementArtifactRepository(), "clonedProject - distributionManagement");
159     }
160 
161     @Test
162     void testCloneWithActiveProfile() throws Exception {
163 
164         File f = getFileForClasspathResource("withActiveByDefaultProfile-pom.xml");
165         MavenProject projectToClone = getProject(f);
166         List<Profile> activeProfilesOrig = projectToClone.getActiveProfiles();
167 
168         assertEquals(1, activeProfilesOrig.size(), "Expecting 1 active profile");
169 
170         MavenProject clonedProject = projectToClone.clone();
171 
172         List<Profile> activeProfilesClone = clonedProject.getActiveProfiles();
173 
174         assertEquals(1, activeProfilesClone.size(), "Expecting 1 active profile");
175 
176         assertNotSame(
177                 activeProfilesOrig,
178                 activeProfilesClone,
179                 "The list of active profiles should have been cloned too but is same");
180     }
181 
182     @Test
183     void testCloneWithBaseDir() throws Exception {
184         File f = getFileForClasspathResource("canonical-pom.xml");
185         MavenProject projectToClone = getProject(f);
186         projectToClone.setPomFile(new File(new File(f.getParentFile(), "target"), "flattened.xml"));
187         MavenProject clonedProject = projectToClone.clone();
188         assertEquals(projectToClone.getFile(), clonedProject.getFile(), "POM file is preserved across clone");
189         assertEquals(
190                 projectToClone.getBasedir(), clonedProject.getBasedir(), "Base directory is preserved across clone");
191     }
192 
193     @Test
194     void testUndefinedOutputDirectory() throws Exception {
195         MavenProject p = new MavenProject();
196         assertNoNulls(p.getCompileClasspathElements());
197         assertNoNulls(p.getSystemClasspathElements());
198         assertNoNulls(p.getRuntimeClasspathElements());
199         assertNoNulls(p.getTestClasspathElements());
200     }
201 
202     @Test
203     void testAddDotFile() {
204         MavenProject project = new MavenProject();
205 
206         File basedir = new File(System.getProperty("java.io.tmpdir"));
207         project.setFile(new File(basedir, "file"));
208 
209         project.addCompileSourceRoot(basedir.getAbsolutePath());
210         project.addCompileSourceRoot(".");
211 
212         assertEquals(1, project.getCompileSourceRoots().size());
213     }
214 
215     private void assertNoNulls(List<String> elements) {
216         assertFalse(elements.contains(null));
217     }
218 }