001package org.apache.maven.repository;
002
003/*
004 * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
005 * agreements. See the NOTICE file distributed with this work for additional information regarding
006 * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance with the License. You may obtain a
008 * copy of the License at
009 * 
010 * http://www.apache.org/licenses/LICENSE-2.0
011 * 
012 * Unless required by applicable law or agreed to in writing, software distributed under the License
013 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
014 * or implied. See the License for the specific language governing permissions and limitations under
015 * the License.
016 */
017
018import java.io.File;
019import java.util.Arrays;
020import java.util.List;
021
022import org.apache.maven.artifact.Artifact;
023import org.apache.maven.artifact.repository.ArtifactRepository;
024import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
025import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
026import org.apache.maven.artifact.resolver.ResolutionErrorHandler;
027import org.apache.maven.execution.DefaultMavenExecutionRequest;
028import org.apache.maven.execution.DefaultMavenExecutionResult;
029import org.apache.maven.execution.MavenSession;
030import org.apache.maven.model.Dependency;
031import org.apache.maven.model.Repository;
032import org.apache.maven.model.RepositoryPolicy;
033import org.apache.maven.plugin.LegacySupport;
034import org.apache.maven.repository.RepositorySystem;
035import org.codehaus.plexus.ContainerConfiguration;
036import org.codehaus.plexus.PlexusTestCase;
037import org.eclipse.aether.DefaultRepositorySystemSession;
038import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
039import org.eclipse.aether.repository.LocalRepository;
040
041/**
042 * Tests {@link LegacyRepositorySystem}.
043 * 
044 * @author Benjamin Bentmann
045 */
046public class LegacyRepositorySystemTest
047    extends PlexusTestCase
048{
049    private RepositorySystem repositorySystem;
050
051    private ResolutionErrorHandler resolutionErrorHandler;
052
053    @Override
054    protected void customizeContainerConfiguration( ContainerConfiguration containerConfiguration )
055    {
056        super.customizeContainerConfiguration( containerConfiguration );
057        containerConfiguration.setAutoWiring( true );
058    }
059
060    @Override
061    protected void setUp()
062        throws Exception
063    {
064        super.setUp();
065        repositorySystem = lookup( RepositorySystem.class, "default" );
066        resolutionErrorHandler = lookup( ResolutionErrorHandler.class );
067    }
068
069    @Override
070    protected void tearDown()
071        throws Exception
072    {
073        repositorySystem = null;
074        resolutionErrorHandler = null;
075        super.tearDown();
076    }
077    
078    protected List<ArtifactRepository> getRemoteRepositories()
079        throws Exception
080    {
081        File repoDir = new File( getBasedir(), "src/test/remote-repo" ).getAbsoluteFile();
082
083        RepositoryPolicy policy = new RepositoryPolicy();
084        policy.setEnabled( true );
085        policy.setChecksumPolicy( "ignore" );
086        policy.setUpdatePolicy( "always" );
087
088        Repository repository = new Repository();
089        repository.setId( RepositorySystem.DEFAULT_REMOTE_REPO_ID );
090        repository.setUrl( "file://" + repoDir.toURI().getPath() );
091        repository.setReleases( policy );
092        repository.setSnapshots( policy );
093
094        return Arrays.asList( repositorySystem.buildArtifactRepository( repository ) );
095    }
096
097    protected ArtifactRepository getLocalRepository()
098        throws Exception
099    {
100        File repoDir = new File( getBasedir(), "target/local-repo" ).getAbsoluteFile();
101
102        return repositorySystem.createLocalRepository( repoDir );
103    }
104
105    public void testThatASystemScopedDependencyIsNotResolvedFromRepositories()
106        throws Exception
107    {
108        //
109        // We should get a whole slew of dependencies resolving this artifact transitively
110        //
111        Dependency d = new Dependency();
112        d.setGroupId( "org.apache.maven.its" );
113        d.setArtifactId( "b" );
114        d.setVersion( "0.1" );
115        d.setScope( Artifact.SCOPE_COMPILE );
116        Artifact artifact = repositorySystem.createDependencyArtifact( d );
117        
118        ArtifactResolutionRequest request = new ArtifactResolutionRequest()
119            .setArtifact( artifact )
120            .setResolveRoot( true )
121            .setResolveTransitively( true )
122            .setRemoteRepositories( getRemoteRepositories() )
123            .setLocalRepository( getLocalRepository() );            
124                            
125        DefaultRepositorySystemSession session = new DefaultRepositorySystemSession();
126        LocalRepository localRepo = new LocalRepository( request.getLocalRepository().getBasedir() );
127        session.setLocalRepositoryManager( new SimpleLocalRepositoryManagerFactory().newInstance( session, localRepo ) );
128        LegacySupport legacySupport = lookup( LegacySupport.class );
129        legacySupport.setSession( new MavenSession( getContainer(), session, new DefaultMavenExecutionRequest(),
130                                                    new DefaultMavenExecutionResult() ) );
131
132        ArtifactResolutionResult result = repositorySystem.resolve( request );
133        resolutionErrorHandler.throwErrors( request, result );        
134        assertEquals( 2, result.getArtifacts().size() );
135        
136        //
137        // System scoped version which should 
138        //        
139        d.setScope( Artifact.SCOPE_SYSTEM );
140        File file = new File( getBasedir(), "src/test/repository-system/maven-core-2.1.0.jar" );
141        assertTrue( file.exists() );
142        d.setSystemPath( file.getCanonicalPath() );
143        
144        artifact = repositorySystem.createDependencyArtifact( d );
145        
146        //
147        // The request has not set any local or remote repositories as the system scoped dependency being resolved should only
148        // give us the dependency off the disk and nothing more.
149        //
150        request = new ArtifactResolutionRequest()
151            .setArtifact( artifact )
152            .setResolveRoot( true )
153            .setResolveTransitively( true );
154                            
155        result = repositorySystem.resolve( request );
156        resolutionErrorHandler.throwErrors( request, result );        
157        assertEquals( 1, result.getArtifacts().size() );       
158
159        //
160        // Put in a bogus file to make sure missing files cause the resolution to fail.
161        //        
162        file = new File( getBasedir(), "src/test/repository-system/maven-monkey-2.1.0.jar" );
163        assertFalse( file.exists() );
164        d.setSystemPath( file.getCanonicalPath() );
165        artifact = repositorySystem.createDependencyArtifact( d );
166        
167        //
168        // The request has not set any local or remote repositories as the system scoped dependency being resolved should only
169        // give us the dependency off the disk and nothing more.
170        //
171        request = new ArtifactResolutionRequest()
172            .setArtifact( artifact )
173            .setResolveRoot( true )
174            .setResolveTransitively( true );
175                     
176        try
177        {
178            result = repositorySystem.resolve( request );
179            resolutionErrorHandler.throwErrors( request, result );
180        }
181        catch( Exception e )
182        {
183            assertTrue( result.hasMissingArtifacts() );
184        }
185    }
186
187    public void testLocalRepositoryBasedir()
188        throws Exception
189    {
190        File localRepoDir = new File( "" ).getAbsoluteFile();
191
192        ArtifactRepository localRepo = repositorySystem.createLocalRepository( localRepoDir );
193
194        String basedir = localRepo.getBasedir();
195
196        assertFalse( basedir.endsWith( "/" ) );
197        assertFalse( basedir.endsWith( "\\" ) );
198
199        assertEquals( localRepoDir, new File( basedir ) );
200
201        assertEquals( localRepoDir.getPath(), basedir );
202    }
203
204}