001 package org.apache.maven.project;
002
003 /*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements. See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership. The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License. You may obtain a copy of the License at
011 *
012 * http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied. See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022 import java.io.File;
023 import java.util.Iterator;
024
025 import org.apache.maven.artifact.Artifact;
026 import org.apache.maven.repository.RepositorySystem;
027 import org.apache.maven.repository.internal.DefaultArtifactDescriptorReader;
028 import org.sonatype.aether.impl.ArtifactDescriptorReader;
029 import org.sonatype.aether.impl.ArtifactResolver;
030
031 public class ProjectClasspathTest
032 extends AbstractMavenProjectTestCase
033 {
034 static final String dir = "projects/scope/";
035
036 public void setUp()
037 throws Exception
038 {
039 ArtifactResolver resolver = lookup( ArtifactResolver.class, "classpath" );
040 DefaultArtifactDescriptorReader pomReader = (DefaultArtifactDescriptorReader)lookup(ArtifactDescriptorReader.class);
041 pomReader.setArtifactResolver( resolver );
042
043 projectBuilder = lookup( ProjectBuilder.class, "classpath" );
044
045 // the metadata source looks up the default impl, so we have to trick it
046 getContainer().addComponent( projectBuilder, ProjectBuilder.class, "default" );
047
048 repositorySystem = lookup( RepositorySystem.class );
049 }
050
051 @Override
052 protected String getCustomConfigurationName()
053 {
054 return null;
055 }
056
057 public void testProjectClasspath()
058 throws Exception
059 {
060 File f = getFileForClasspathResource( dir + "project-with-scoped-dependencies.xml" );
061
062 MavenProject project = getProjectWithDependencies( f );
063
064 Artifact artifact;
065
066 assertNotNull( "Test project can't be null!", project );
067
068 checkArtifactIdScope( project, "provided", "provided" );
069 checkArtifactIdScope( project, "test", "test" );
070 checkArtifactIdScope( project, "compile", "compile" );
071 checkArtifactIdScope( project, "runtime", "runtime" );
072 checkArtifactIdScope( project, "default", "compile" );
073
074 // check all transitive deps of a test dependency are test, except test and provided which is skipped
075 artifact = getArtifact( project, "maven-test-test", "scope-provided" );
076 assertNull( "Check no provided dependencies are transitive", artifact );
077 artifact = getArtifact( project, "maven-test-test", "scope-test" );
078 assertNull( "Check no test dependencies are transitive", artifact );
079
080 artifact = getArtifact( project, "maven-test-test", "scope-compile" );
081 assertNotNull( artifact );
082
083 System.out.println( "a = " + artifact );
084 System.out.println( "b = " + artifact.getScope() );
085 assertEquals( "Check scope", "test", artifact.getScope() );
086 artifact = getArtifact( project, "maven-test-test", "scope-default" );
087 assertEquals( "Check scope", "test", artifact.getScope() );
088 artifact = getArtifact( project, "maven-test-test", "scope-runtime" );
089 assertEquals( "Check scope", "test", artifact.getScope() );
090
091 // check all transitive deps of a provided dependency are provided scope, except for test
092 checkGroupIdScope( project, "provided", "maven-test-provided" );
093 artifact = getArtifact( project, "maven-test-provided", "scope-runtime" );
094 assertEquals( "Check scope", "provided", artifact.getScope() );
095
096 // check all transitive deps of a runtime dependency are runtime scope, except for test
097 checkGroupIdScope( project, "runtime", "maven-test-runtime" );
098 artifact = getArtifact( project, "maven-test-runtime", "scope-runtime" );
099 assertEquals( "Check scope", "runtime", artifact.getScope() );
100
101 // check all transitive deps of a compile dependency are compile scope, except for runtime and test
102 checkGroupIdScope( project, "compile", "maven-test-compile" );
103 artifact = getArtifact( project, "maven-test-compile", "scope-runtime" );
104 assertEquals( "Check scope", "runtime", artifact.getScope() );
105
106 // check all transitive deps of a default dependency are compile scope, except for runtime and test
107 checkGroupIdScope( project, "compile", "maven-test-default" );
108 artifact = getArtifact( project, "maven-test-default", "scope-runtime" );
109 assertEquals( "Check scope", "runtime", artifact.getScope() );
110 }
111
112 private void checkGroupIdScope( MavenProject project, String scopeValue, String groupId )
113 {
114 Artifact artifact;
115 artifact = getArtifact( project, groupId, "scope-compile" );
116 assertEquals( "Check scope", scopeValue, artifact.getScope() );
117 artifact = getArtifact( project, groupId, "scope-test" );
118 assertNull( "Check test dependency is not transitive", artifact );
119 artifact = getArtifact( project, groupId, "scope-provided" );
120 assertNull( "Check provided dependency is not transitive", artifact );
121 artifact = getArtifact( project, groupId, "scope-default" );
122 assertEquals( "Check scope", scopeValue, artifact.getScope() );
123 }
124
125 private void checkArtifactIdScope( MavenProject project, String scope, String scopeValue )
126 {
127 String artifactId = "scope-" + scope;
128 Artifact artifact = getArtifact( project, "maven-test", artifactId );
129 assertNotNull( artifact );
130 assertEquals( "Check scope", scopeValue, artifact.getScope() );
131 }
132
133 private Artifact getArtifact( MavenProject project, String groupId, String artifactId )
134 {
135 System.out.println( "[ Looking for " + groupId + ":" + artifactId + " ]" );
136 for ( Iterator<Artifact> i = project.getArtifacts().iterator(); i.hasNext(); )
137 {
138 Artifact a = i.next();
139 System.out.println( a.toString() );
140 if ( artifactId.equals( a.getArtifactId() ) && a.getGroupId().equals( groupId ) )
141 {
142 System.out.println( "RETURN" );
143 return a;
144 }
145 }
146 System.out.println( "Return null" );
147 return null;
148 }
149
150 }