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    }