View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
3    * agreements. See the NOTICE file distributed with this work for additional information regarding
4    * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
5    * "License"); you may not use this file except in compliance with the License. You may obtain a
6    * copy of the License at
7    *
8    * http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software distributed under the License
11   * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12   * or implied. See the License for the specific language governing permissions and limitations under
13   * the License.
14   */
15  package org.apache.maven.graph;
16  
17  import junit.framework.TestCase;
18  import org.apache.maven.execution.ProjectDependencyGraph;
19  import org.apache.maven.model.Dependency;
20  import org.apache.maven.project.DuplicateProjectException;
21  import org.apache.maven.project.MavenProject;
22  import org.codehaus.plexus.util.dag.CycleDetectedException;
23  
24  import java.util.Arrays;
25  import java.util.List;
26  
27  /**
28   * @author Kristian Rosenvold
29   */
30  public class DefaultProjectDependencyGraphTest
31      extends TestCase
32  {
33  
34      private final MavenProject aProject = createA();
35  
36      private final MavenProject depender1 = createProject( Arrays.asList( toDependency( aProject ) ), "depender1" );
37  
38      private final MavenProject depender2 = createProject( Arrays.asList( toDependency( aProject ) ), "depender2" );
39  
40      private final MavenProject depender3 = createProject( Arrays.asList( toDependency( aProject ) ), "depender3" );
41  
42      private final MavenProject depender4 =
43          createProject( Arrays.asList( toDependency( aProject ), toDependency( depender3 ) ), "depender4" );
44  
45      private final MavenProject transitiveOnly =
46          createProject( Arrays.asList( toDependency( depender3 ) ), "depender5" );
47  
48      public void testGetSortedProjects()
49          throws DuplicateProjectException, CycleDetectedException
50      {
51          ProjectDependencyGraph graph = new DefaultProjectDependencyGraph( Arrays.asList( depender1, aProject ) );
52          final List<MavenProject> sortedProjects = graph.getSortedProjects();
53          assertEquals( aProject, sortedProjects.get( 0 ) );
54          assertEquals( depender1, sortedProjects.get( 1 ) );
55      }
56  
57      public void testVerifyExpectedParentStructure()
58          throws CycleDetectedException, DuplicateProjectException
59      {
60          // This test verifies the baseline structure used in subsequent tests. If this fails, the rest will fail.
61          ProjectDependencyGraph graph = threeProjectsDependingOnASingle();
62          final List<MavenProject> sortedProjects = graph.getSortedProjects();
63          assertEquals( aProject, sortedProjects.get( 0 ) );
64          assertEquals( depender1, sortedProjects.get( 1 ) );
65          assertEquals( depender2, sortedProjects.get( 2 ) );
66          assertEquals( depender3, sortedProjects.get( 3 ) );
67      }
68  
69      public void testVerifyThatDownstreamProjectsComeInSortedOrder()
70          throws CycleDetectedException, DuplicateProjectException
71      {
72          final List<MavenProject> downstreamProjects =
73              threeProjectsDependingOnASingle().getDownstreamProjects( aProject, true );
74          assertEquals( depender1, downstreamProjects.get( 0 ) );
75          assertEquals( depender2, downstreamProjects.get( 1 ) );
76          assertEquals( depender3, downstreamProjects.get( 2 ) );
77      }
78  
79      public void testTransitivesInOrder()
80          throws CycleDetectedException, DuplicateProjectException
81      {
82          final ProjectDependencyGraph graph =
83              new DefaultProjectDependencyGraph( Arrays.asList( depender1, depender4, depender2, depender3, aProject ) );
84  
85          final List<MavenProject> downstreamProjects = graph.getDownstreamProjects( aProject, true );
86          assertEquals( depender1, downstreamProjects.get( 0 ) );
87          assertEquals( depender3, downstreamProjects.get( 1 ) );
88          assertEquals( depender4, downstreamProjects.get( 2 ) );
89          assertEquals( depender2, downstreamProjects.get( 3 ) );
90      }
91  
92      public void testNonTransitivesInOrder()
93          throws CycleDetectedException, DuplicateProjectException
94      {
95          final ProjectDependencyGraph graph =
96              new DefaultProjectDependencyGraph( Arrays.asList( depender1, depender4, depender2, depender3, aProject ) );
97  
98          final List<MavenProject> downstreamProjects = graph.getDownstreamProjects( aProject, false );
99          assertEquals( depender1, downstreamProjects.get( 0 ) );
100         assertEquals( depender3, downstreamProjects.get( 1 ) );
101         assertEquals( depender4, downstreamProjects.get( 2 ) );
102         assertEquals( depender2, downstreamProjects.get( 3 ) );
103     }
104 
105     public void testWithTransitiveOnly()
106         throws CycleDetectedException, DuplicateProjectException
107     {
108         final ProjectDependencyGraph graph = new DefaultProjectDependencyGraph(
109             Arrays.asList( depender1, transitiveOnly, depender2, depender3, aProject ) );
110 
111         final List<MavenProject> downstreamProjects = graph.getDownstreamProjects( aProject, true );
112         assertEquals( depender1, downstreamProjects.get( 0 ) );
113         assertEquals( depender3, downstreamProjects.get( 1 ) );
114         assertEquals( transitiveOnly, downstreamProjects.get( 2 ) );
115         assertEquals( depender2, downstreamProjects.get( 3 ) );
116     }
117 
118     public void testWithMissingTransitiveOnly()
119         throws CycleDetectedException, DuplicateProjectException
120     {
121         final ProjectDependencyGraph graph = new DefaultProjectDependencyGraph(
122             Arrays.asList( depender1, transitiveOnly, depender2, depender3, aProject ) );
123 
124         final List<MavenProject> downstreamProjects = graph.getDownstreamProjects( aProject, false );
125         assertEquals( depender1, downstreamProjects.get( 0 ) );
126         assertEquals( depender3, downstreamProjects.get( 1 ) );
127         assertEquals( depender2, downstreamProjects.get( 2 ) );
128     }
129 
130     public void testGetUpstreamProjects()
131         throws CycleDetectedException, DuplicateProjectException
132     {
133         ProjectDependencyGraph graph = threeProjectsDependingOnASingle();
134         final List<MavenProject> downstreamProjects = graph.getUpstreamProjects( depender1, true );
135         assertEquals( aProject, downstreamProjects.get( 0 ) );
136     }
137 
138     private ProjectDependencyGraph threeProjectsDependingOnASingle()
139         throws CycleDetectedException, DuplicateProjectException
140     {
141         return new DefaultProjectDependencyGraph( Arrays.asList( depender1, depender2, depender3, aProject ) );
142     }
143 
144     private static MavenProject createA()
145     {
146         MavenProject result = new MavenProject();
147         result.setGroupId( "org.apache" );
148         result.setArtifactId( "A" );
149         result.setVersion( "1.2" );
150         return result;
151     }
152 
153     static Dependency toDependency( MavenProject mavenProject )
154     {
155         final Dependency dependency = new Dependency();
156         dependency.setArtifactId( mavenProject.getArtifactId() );
157         dependency.setGroupId( mavenProject.getGroupId() );
158         dependency.setVersion( mavenProject.getVersion() );
159         return dependency;
160     }
161 
162     private static MavenProject createProject( List<Dependency> dependencies, String artifactId )
163     {
164         MavenProject result = new MavenProject();
165         result.setGroupId( "org.apache" );
166         result.setArtifactId( artifactId );
167         result.setVersion( "1.2" );
168         result.setDependencies( dependencies );
169         return result;
170     }
171 
172 }