1 package org.apache.maven.project;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.File;
23 import java.io.IOException;
24 import java.util.Collections;
25 import java.util.List;
26 import java.util.Map;
27 import java.util.Set;
28 import java.util.concurrent.atomic.AtomicReference;
29
30 import org.apache.maven.artifact.Artifact;
31 import org.apache.maven.model.DependencyManagement;
32 import org.apache.maven.model.Model;
33 import org.apache.maven.model.Parent;
34 import org.apache.maven.model.Profile;
35 import org.mockito.Mockito;
36
37 public class MavenProjectTest
38 extends AbstractMavenProjectTestCase
39 {
40
41 public void testShouldInterpretChildPathAdjustmentBasedOnModulePaths()
42 throws IOException
43 {
44 Model parentModel = new Model();
45 parentModel.addModule( "../child" );
46
47 MavenProject parentProject = new MavenProject( parentModel );
48
49 Model childModel = new Model();
50 childModel.setArtifactId( "artifact" );
51
52 MavenProject childProject = new MavenProject( childModel );
53
54 File childFile =
55 new File( System.getProperty( "java.io.tmpdir" ), "maven-project-tests" + System.currentTimeMillis()
56 + "/child/pom.xml" );
57
58 childProject.setFile( childFile );
59
60 String adjustment = parentProject.getModulePathAdjustment( childProject );
61
62 assertNotNull( adjustment );
63
64 assertEquals( "..", adjustment );
65 }
66
67 public void testIdentityProtoInheritance()
68 {
69 Parent parent = new Parent();
70
71 parent.setGroupId( "test-group" );
72 parent.setVersion( "1000" );
73 parent.setArtifactId( "test-artifact" );
74
75 Model model = new Model();
76
77 model.setParent( parent );
78 model.setArtifactId( "real-artifact" );
79
80 MavenProject project = new MavenProject( model );
81
82 assertEquals( "groupId proto-inheritance failed.", "test-group", project.getGroupId() );
83 assertEquals( "artifactId is masked.", "real-artifact", project.getArtifactId() );
84 assertEquals( "version proto-inheritance failed.", "1000", project.getVersion() );
85
86
87 project.getId();
88 }
89
90 public void testEmptyConstructor()
91 {
92 MavenProject project = new MavenProject();
93
94 assertEquals( MavenProject.EMPTY_PROJECT_GROUP_ID + ":" + MavenProject.EMPTY_PROJECT_ARTIFACT_ID + ":jar:"
95 + MavenProject.EMPTY_PROJECT_VERSION, project.getId() );
96 }
97
98 public void testClone()
99 throws Exception
100 {
101 File f = getFileForClasspathResource( "canonical-pom.xml" );
102 MavenProject projectToClone = getProject( f );
103
104 MavenProject clonedProject = projectToClone.clone();
105 assertEquals( "maven-core", clonedProject.getArtifactId() );
106 Map<?, ?> clonedMap = clonedProject.getManagedVersionMap();
107 assertNotNull( "ManagedVersionMap not copied", clonedMap );
108 assertTrue( "ManagedVersionMap is not empty", clonedMap.isEmpty() );
109 }
110
111 public void testCloneWithDependencyManagement()
112 throws Exception
113 {
114 File f = getFileForClasspathResource( "dependencyManagement-pom.xml" );
115 MavenProject projectToClone = getProjectWithDependencies( f );
116 DependencyManagement dep = projectToClone.getDependencyManagement();
117 assertNotNull( "No dependencyManagement", dep );
118 List<?> list = dep.getDependencies();
119 assertNotNull( "No dependencies", list );
120 assertTrue( "Empty dependency list", !list.isEmpty() );
121
122 Map<?, ?> map = projectToClone.getManagedVersionMap();
123 assertNotNull( "No ManagedVersionMap", map );
124 assertTrue( "ManagedVersionMap is empty", !map.isEmpty() );
125
126 MavenProject clonedProject = projectToClone.clone();
127 assertEquals( "maven-core", clonedProject.getArtifactId() );
128 Map<?, ?> clonedMap = clonedProject.getManagedVersionMap();
129 assertNotNull( "ManagedVersionMap not copied", clonedMap );
130 assertTrue( "ManagedVersionMap is empty", !clonedMap.isEmpty() );
131 assertTrue( "ManagedVersionMap does not contain test key",
132 clonedMap.containsKey( "maven-test:maven-test-b:jar" ) );
133 }
134
135 public void testGetModulePathAdjustment()
136 throws IOException
137 {
138 Model moduleModel = new Model();
139
140 MavenProject module = new MavenProject( moduleModel );
141 module.setFile( new File( "module-dir/pom.xml" ) );
142
143 Model parentModel = new Model();
144 parentModel.addModule( "../module-dir" );
145
146 MavenProject parent = new MavenProject( parentModel );
147 parent.setFile( new File( "parent-dir/pom.xml" ) );
148
149 String pathAdjustment = parent.getModulePathAdjustment( module );
150
151 assertEquals( "..", pathAdjustment );
152 }
153
154 public void testCloneWithDistributionManagement()
155 throws Exception
156 {
157
158 File f = getFileForClasspathResource( "distributionManagement-pom.xml" );
159 MavenProject projectToClone = getProject( f );
160
161 MavenProject clonedProject = projectToClone.clone();
162 assertNotNull( "clonedProject - distributionManagement", clonedProject.getDistributionManagementArtifactRepository() );
163 }
164
165 public void testCloneWithActiveProfile()
166 throws Exception
167 {
168
169 File f = getFileForClasspathResource( "withActiveByDefaultProfile-pom.xml" );
170 MavenProject projectToClone = getProject( f );
171 List<Profile> activeProfilesOrig = projectToClone.getActiveProfiles();
172
173 assertEquals( "Expecting 1 active profile", 1, activeProfilesOrig.size() );
174
175 MavenProject clonedProject = projectToClone.clone();
176
177 List<Profile> activeProfilesClone = clonedProject.getActiveProfiles();
178
179 assertEquals( "Expecting 1 active profile", 1, activeProfilesClone.size() );
180
181 assertNotSame( "The list of active profiles should have been cloned too but is same", activeProfilesOrig,
182 activeProfilesClone );
183 }
184
185 public void testCloneWithBaseDir()
186 throws Exception
187 {
188 File f = getFileForClasspathResource( "canonical-pom.xml" );
189 MavenProject projectToClone = getProject( f );
190 projectToClone.setPomFile( new File( new File( f.getParentFile(), "target" ), "flattened.xml" ) );
191 MavenProject clonedProject = projectToClone.clone();
192 assertEquals( "POM file is preserved across clone", projectToClone.getFile(), clonedProject.getFile() );
193 assertEquals( "Base directory is preserved across clone", projectToClone.getBasedir(), clonedProject.getBasedir() );
194 }
195
196 public void testCloneWithArtifacts()
197 throws InterruptedException
198 {
199 Artifact initialArtifact = Mockito.mock( Artifact.class, "initialArtifact" );
200 MavenProject originalProject = new MavenProject();
201 originalProject.setArtifacts( Collections.singleton( initialArtifact ) );
202 assertEquals( "Sanity check: originalProject returns artifact that has just been set",
203 Collections.singleton( initialArtifact ), originalProject.getArtifacts() );
204
205 final MavenProject clonedProject = originalProject.clone();
206
207 assertEquals( "Cloned project returns the artifact that was set for the original project",
208 Collections.singleton( initialArtifact ), clonedProject.getArtifacts() );
209
210 Artifact anotherArtifact = Mockito.mock( Artifact.class, "anotherArtifact" );
211 clonedProject.setArtifacts( Collections.singleton( anotherArtifact ) );
212 assertEquals( "Sanity check: clonedProject returns artifact that has just been set",
213 Collections.singleton( anotherArtifact ), clonedProject.getArtifacts() );
214
215 assertEquals( "Original project returns the artifact that was set initially (not the one for clonedProject)",
216 Collections.singleton( initialArtifact ), originalProject.getArtifacts() );
217
218 final AtomicReference<Set<Artifact>> artifactsFromThread = new AtomicReference<>();
219 Thread thread = new Thread( new Runnable()
220 {
221 @Override
222 public void run()
223 {
224 artifactsFromThread.set( clonedProject.getArtifacts() );
225 }
226 } );
227 thread.start();
228 thread.join();
229
230 assertEquals( "Another thread does not see the same artifacts",
231 Collections.emptySet(), artifactsFromThread.get() );
232 }
233
234 public void testUndefinedOutputDirectory()
235 throws Exception
236 {
237 MavenProject p = new MavenProject();
238 assertNoNulls( p.getCompileClasspathElements() );
239 assertNoNulls( p.getSystemClasspathElements() );
240 assertNoNulls( p.getRuntimeClasspathElements() );
241 assertNoNulls( p.getTestClasspathElements() );
242 }
243
244 public void testAddDotFile()
245 {
246 MavenProject project = new MavenProject();
247
248 File basedir = new File( System.getProperty( "java.io.tmpdir" ) );
249 project.setFile( new File( basedir, "file" ) );
250
251 project.addCompileSourceRoot( basedir.getAbsolutePath() );
252 project.addCompileSourceRoot( "." );
253
254 assertEquals( 1, project.getCompileSourceRoots().size() );
255 }
256
257 private void assertNoNulls( List<String> elements )
258 {
259 assertFalse( elements.contains( null ) );
260 }
261
262 }