001package 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
022import java.io.File;
023import java.util.ArrayList;
024import java.util.Iterator;
025import java.util.List;
026
027import org.apache.maven.artifact.Artifact;
028import org.apache.maven.artifact.repository.ArtifactRepository;
029import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
030import org.codehaus.plexus.util.FileUtils;
031
032public class DefaultMavenProjectBuilderTest
033    extends AbstractMavenProjectTestCase
034{
035
036    private List<File> filesToDelete = new ArrayList<File>();
037
038    private File localRepoDir;
039
040    @Override
041    public void setUp()
042        throws Exception
043    {
044        super.setUp();
045
046        projectBuilder = lookup( ProjectBuilder.class );
047
048        localRepoDir = new File( System.getProperty( "java.io.tmpdir" ), "local-repo." + System.currentTimeMillis() );
049        localRepoDir.mkdirs();
050
051        filesToDelete.add( localRepoDir );
052    }
053
054    @Override
055    public void tearDown()
056        throws Exception
057    {
058        super.tearDown();
059
060        if ( !filesToDelete.isEmpty() )
061        {
062            for ( File file : filesToDelete )
063            {
064                if ( file.exists() )
065                {
066                    if ( file.isDirectory() )
067                    {
068                        FileUtils.deleteDirectory( file );
069                    }
070                    else
071                    {
072                        file.delete();
073                    }
074                }
075            }
076        }
077    }
078
079    protected MavenProject getProject( Artifact pom, boolean allowStub )
080        throws Exception
081    {
082        ProjectBuildingRequest configuration = new DefaultProjectBuildingRequest();
083        configuration.setLocalRepository( getLocalRepository() );
084        initRepoSession( configuration );
085
086        return projectBuilder.build( pom, allowStub, configuration ).getProject();
087    }
088
089    /**
090     * Check that we can build ok from the middle pom of a (parent,child,grandchild) heirarchy
091     * @throws Exception
092     */
093    public void testBuildFromMiddlePom() throws Exception
094    {
095        File f1 = getTestFile( "src/test/resources/projects/grandchild-check/child/pom.xml");
096        File f2 = getTestFile( "src/test/resources/projects/grandchild-check/child/grandchild/pom.xml");
097
098        getProject( f1 );
099
100        // it's the building of the grandchild project, having already cached the child project
101        // (but not the parent project), which causes the problem.
102        getProject( f2 );
103    }
104
105    public void testDuplicatePluginDefinitionsMerged()
106        throws Exception
107    {
108        File f1 = getTestFile( "src/test/resources/projects/duplicate-plugins-merged-pom.xml" );
109
110        MavenProject project = getProject( f1 );
111        assertEquals( 2, project.getBuildPlugins().get( 0 ).getDependencies().size() );
112        assertEquals( 2, project.getBuildPlugins().get( 0 ).getExecutions().size() );
113        assertEquals( "first", project.getBuildPlugins().get( 0 ).getExecutions().get( 0 ).getId() );
114    }
115
116    public void testBuildStubModelForMissingRemotePom()
117        throws Exception
118    {
119        Artifact pom = repositorySystem.createProjectArtifact( "org.apache.maven.its", "missing", "0.1" );
120        MavenProject project = getProject( pom, true );
121
122        assertNotNull( project.getArtifactId() );
123
124        assertNotNull( project.getRemoteArtifactRepositories() );
125        assertFalse( project.getRemoteArtifactRepositories().isEmpty() );
126
127        assertNotNull( project.getPluginArtifactRepositories() );
128        assertFalse( project.getPluginArtifactRepositories().isEmpty() );
129
130        assertNull( project.getParent() );
131        assertNull( project.getParentArtifact() );
132
133        assertFalse( project.isExecutionRoot() );
134    }
135
136    @Override
137    protected ArtifactRepository getLocalRepository()
138        throws Exception
139    {
140        ArtifactRepositoryLayout repoLayout = lookup( ArtifactRepositoryLayout.class, "default" );
141        ArtifactRepository r =
142            repositorySystem.createArtifactRepository( "local", "file://" + localRepoDir.getAbsolutePath(), repoLayout,
143                                                       null, null );
144        return r;
145    }
146
147    public void xtestLoop()
148        throws Exception
149    {
150        while ( true )
151        {
152            File f1 = getTestFile( "src/test/resources/projects/duplicate-plugins-merged-pom.xml" );
153            getProject( f1 );
154        }
155    }
156
157    public void testPartialResultUponBadDependencyDeclaration()
158        throws Exception
159    {
160        File pomFile = getTestFile( "src/test/resources/projects/bad-dependency.xml" );
161
162        try
163        {
164            ProjectBuildingRequest request = newBuildingRequest();
165            request.setProcessPlugins( false );
166            request.setResolveDependencies( true );
167            projectBuilder.build( pomFile, request );
168            fail( "Project building did not fail despite invalid POM" );
169        }
170        catch ( ProjectBuildingException e )
171        {
172            List<ProjectBuildingResult> results = e.getResults();
173            assertNotNull( results );
174            assertEquals( 1, results.size() );
175            ProjectBuildingResult result = results.get( 0 );
176            assertNotNull( result );
177            assertNotNull( result.getProject() );
178            assertEquals( 1, result.getProblems().size() );
179            assertEquals( 1, result.getProject().getArtifacts().size() );
180            assertNotNull( result.getDependencyResolutionResult() );
181        }
182    }
183
184    public void testImportScopePomResolvesFromPropertyBasedRepository()
185            throws Exception
186    {
187        File pomFile = getTestFile( "src/test/resources/projects/import-scope-pom-resolves-from-property-based-repository.xml" );
188        ProjectBuildingRequest request = newBuildingRequest();
189        request.setProcessPlugins( false );
190        request.setResolveDependencies( true );
191        projectBuilder.build( pomFile, request );
192    }
193}