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}