View Javadoc
1   package org.apache.maven.project;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *  http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
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          // draw the NPE.
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 }