001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
003 * agreements. See the NOTICE file distributed with this work for additional information regarding
004 * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
005 * "License"); you may not use this file except in compliance with the License. You may obtain a
006 * copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software distributed under the License
011 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
012 * or implied. See the License for the specific language governing permissions and limitations under
013 * the License.
014 */
015package org.apache.maven;
016
017import junit.framework.TestCase;
018import org.apache.maven.execution.ProjectDependencyGraph;
019import org.apache.maven.model.Dependency;
020import org.apache.maven.project.DuplicateProjectException;
021import org.apache.maven.project.MavenProject;
022import org.codehaus.plexus.util.dag.CycleDetectedException;
023
024import java.util.Arrays;
025import java.util.List;
026
027/**
028 * @author Kristian Rosenvold
029 */
030public class DefaultProjectDependencyGraphTest
031    extends TestCase
032{
033
034    private final MavenProject aProject = createA();
035
036    private final MavenProject depender1 = createProject( Arrays.asList( toDependency( aProject ) ), "depender1" );
037
038    private final MavenProject depender2 = createProject( Arrays.asList( toDependency( aProject ) ), "depender2" );
039
040    private final MavenProject depender3 = createProject( Arrays.asList( toDependency( aProject ) ), "depender3" );
041
042    private final MavenProject depender4 =
043        createProject( Arrays.asList( toDependency( aProject ), toDependency( depender3 ) ), "depender4" );
044
045    private final MavenProject transitiveOnly =
046        createProject( Arrays.asList( toDependency( depender3 ) ), "depender5" );
047
048    public void testGetSortedProjects()
049        throws DuplicateProjectException, CycleDetectedException
050    {
051        ProjectDependencyGraph graph = new DefaultProjectDependencyGraph( Arrays.asList( depender1, aProject ) );
052        final List<MavenProject> sortedProjects = graph.getSortedProjects();
053        assertEquals( aProject, sortedProjects.get( 0 ) );
054        assertEquals( depender1, sortedProjects.get( 1 ) );
055    }
056
057    public void testVerifyExpectedParentStructure()
058        throws CycleDetectedException, DuplicateProjectException
059    {
060        // This test verifies the baseline structure used in susequent tests. If this fails, the rest will fail.
061        ProjectDependencyGraph graph = threeProjectsDependingOnASingle();
062        final List<MavenProject> sortedProjects = graph.getSortedProjects();
063        assertEquals( aProject, sortedProjects.get( 0 ) );
064        assertEquals( depender1, sortedProjects.get( 1 ) );
065        assertEquals( depender2, sortedProjects.get( 2 ) );
066        assertEquals( depender3, sortedProjects.get( 3 ) );
067    }
068
069    public void testVerifyThatDownsteamProjectsComeInSortedOrder()
070        throws CycleDetectedException, DuplicateProjectException
071    {
072        final List<MavenProject> downstreamProjects =
073            threeProjectsDependingOnASingle().getDownstreamProjects( aProject, true );
074        assertEquals( depender1, downstreamProjects.get( 0 ) );
075        assertEquals( depender2, downstreamProjects.get( 1 ) );
076        assertEquals( depender3, downstreamProjects.get( 2 ) );
077    }
078
079    public void testTransitivesInOrder()
080        throws CycleDetectedException, DuplicateProjectException
081    {
082        final ProjectDependencyGraph graph =
083            new DefaultProjectDependencyGraph( Arrays.asList( depender1, depender4, depender2, depender3, aProject ) );
084
085        final List<MavenProject> downstreamProjects = graph.getDownstreamProjects( aProject, true );
086        assertEquals( depender1, downstreamProjects.get( 0 ) );
087        assertEquals( depender3, downstreamProjects.get( 1 ) );
088        assertEquals( depender4, downstreamProjects.get( 2 ) );
089        assertEquals( depender2, downstreamProjects.get( 3 ) );
090    }
091
092    public void testNonTransitivesInOrder()
093        throws CycleDetectedException, DuplicateProjectException
094    {
095        final ProjectDependencyGraph graph =
096            new DefaultProjectDependencyGraph( Arrays.asList( depender1, depender4, depender2, depender3, aProject ) );
097
098        final List<MavenProject> downstreamProjects = graph.getDownstreamProjects( aProject, false );
099        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 testWithTranistiveOnly()
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 testWithMissingTranistiveOnly()
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}