blob: 1f81f765976297e757dc5f0d331bebde12ff25c5 [file] [log] [blame]
package org.apache.maven.plugins.dependency.fromDependencies;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import java.io.File;
import java.io.IOException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter;
import org.apache.maven.artifact.versioning.VersionRange;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.dependency.AbstractDependencyMojoTestCase;
import org.apache.maven.plugins.dependency.testUtils.DependencyArtifactStubFactory;
import org.apache.maven.plugins.dependency.utils.DependencyUtil;
import org.apache.maven.plugins.dependency.utils.markers.DefaultFileMarkerHandler;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.StringUtils;
import org.sonatype.aether.impl.internal.SimpleLocalRepositoryManager;
import org.sonatype.aether.util.DefaultRepositorySystemSession;
public class TestUnpackDependenciesMojo
extends AbstractDependencyMojoTestCase
{
private final String UNPACKABLE_FILE = "test.txt";
private final String UNPACKABLE_FILE_PATH = "target/test-classes/unit/unpack-dependencies-test/" + UNPACKABLE_FILE;
UnpackDependenciesMojo mojo;
protected void setUp()
throws Exception
{
// required for mojo lookups to work
super.setUp( "unpack-dependencies", true, false );
File testPom = new File( getBasedir(), "target/test-classes/unit/unpack-dependencies-test/plugin-config.xml" );
mojo = (UnpackDependenciesMojo) lookupMojo( "unpack-dependencies", testPom );
mojo.outputDirectory = new File( this.testDir, "outputDirectory" );
mojo.setUseJvmChmod( true );
// mojo.silent = true;
// it needs to get the archivermanager
stubFactory.setUnpackableFile( mojo.getArchiverManager() );
// i'm using one file repeatedly to archive so I can test the name
// programmatically.
stubFactory.setSrcFile( new File( getBasedir() + File.separatorChar + UNPACKABLE_FILE_PATH ) );
assertNotNull( mojo );
assertNotNull( mojo.getProject() );
MavenProject project = mojo.getProject();
MavenSession session = newMavenSession( project );
setVariableValueToObject( mojo, "session", session );
DefaultRepositorySystemSession repoSession = (DefaultRepositorySystemSession) session.getRepositorySession();
repoSession.setLocalRepositoryManager( new SimpleLocalRepositoryManager( stubFactory.getWorkingDir() ) );
Set<Artifact> artifacts = this.stubFactory.getScopedArtifacts();
Set<Artifact> directArtifacts = this.stubFactory.getReleaseAndSnapshotArtifacts();
artifacts.addAll( directArtifacts );
project.setArtifacts( artifacts );
project.setDependencyArtifacts( directArtifacts );
mojo.markersDirectory = new File( this.testDir, "markers" );
ArtifactHandlerManager manager = lookup( ArtifactHandlerManager.class );
setVariableValueToObject( mojo, "artifactHandlerManager", manager );
}
protected void tearDown()
{
super.tearDown();
mojo = null;
System.gc();
}
public void assertUnpacked( Artifact artifact )
{
assertUnpacked( true, artifact );
}
public void assertUnpacked( boolean val, Artifact artifact )
{
File folder =
DependencyUtil.getFormattedOutputDirectory( mojo.useSubDirectoryPerScope, mojo.useSubDirectoryPerType,
mojo.useSubDirectoryPerArtifact, mojo.useRepositoryLayout,
mojo.stripVersion, mojo.outputDirectory, artifact );
File destFile = new File( folder, DependencyArtifactStubFactory.getUnpackableFileName( artifact ) );
assertEquals( val, destFile.exists() );
assertMarkerFile( val, artifact );
}
public void assertMarkerFile( boolean val, Artifact artifact )
{
DefaultFileMarkerHandler handle = new DefaultFileMarkerHandler( artifact, mojo.markersDirectory );
try
{
assertEquals( val, handle.isMarkerSet() );
}
catch ( MojoExecutionException e )
{
fail( e.getLongMessage() );
}
}
public void testMojo()
throws Exception
{
mojo.execute();
for ( Artifact artifact : (Iterable<Artifact>) mojo.getProject().getArtifacts() )
{
assertUnpacked( artifact );
}
}
public void testNoTransitive()
throws Exception
{
mojo.excludeTransitive = true;
mojo.execute();
for ( Artifact artifact : (Iterable<Artifact>) mojo.getProject().getDependencyArtifacts() )
{
assertUnpacked( artifact );
}
}
public void testExcludeType()
throws Exception
{
mojo.getProject().setArtifacts( stubFactory.getTypedArchiveArtifacts() );
mojo.getProject().setDependencyArtifacts( new HashSet<Artifact>() );
mojo.excludeTypes = "jar";
mojo.execute();
for ( Artifact artifact : (Iterable<Artifact>) mojo.getProject().getArtifacts() )
{
assertUnpacked( !artifact.getType().equalsIgnoreCase( "jar" ), artifact );
}
}
public void testExcludeProvidedScope()
throws Exception
{
mojo.getProject().setArtifacts( stubFactory.getScopedArtifacts() );
mojo.getProject().setDependencyArtifacts( new HashSet<Artifact>() );
mojo.excludeScope = "provided";
// mojo.silent = false;
mojo.execute();
for ( Artifact artifact : (Iterable<Artifact>) mojo.getProject().getArtifacts() )
{
assertUnpacked( !artifact.getScope().equals( "provided" ), artifact );
}
}
public void testExcludeSystemScope()
throws Exception
{
mojo.getProject().setArtifacts( stubFactory.getScopedArtifacts() );
mojo.getProject().setDependencyArtifacts( new HashSet<Artifact>() );
mojo.excludeScope = "system";
// mojo.silent = false;
mojo.execute();
for ( Artifact artifact : (Iterable<Artifact>) mojo.getProject().getArtifacts() )
{
assertUnpacked( !artifact.getScope().equals( "system" ), artifact );
}
}
public void testExcludeCompileScope()
throws Exception
{
mojo.getProject().setArtifacts( stubFactory.getScopedArtifacts() );
mojo.getProject().setDependencyArtifacts( new HashSet<Artifact>() );
mojo.excludeScope = "compile";
mojo.execute();
ScopeArtifactFilter saf = new ScopeArtifactFilter( mojo.excludeScope );
for ( Artifact artifact : (Iterable<Artifact>) mojo.getProject().getArtifacts() )
{
assertUnpacked( !saf.include( artifact ), artifact );
}
}
public void testExcludeTestScope()
throws IOException, MojoFailureException
{
mojo.getProject().setArtifacts( stubFactory.getScopedArtifacts() );
mojo.getProject().setDependencyArtifacts( new HashSet<Artifact>() );
mojo.excludeScope = "test";
try
{
mojo.execute();
fail( "expected an exception" );
}
catch ( MojoExecutionException e )
{
}
}
public void testExcludeRuntimeScope()
throws Exception
{
mojo.getProject().setArtifacts( stubFactory.getScopedArtifacts() );
mojo.getProject().setDependencyArtifacts( new HashSet<Artifact>() );
mojo.excludeScope = "runtime";
mojo.execute();
ScopeArtifactFilter saf = new ScopeArtifactFilter( mojo.excludeScope );
for ( Artifact artifact : (Iterable<Artifact>) mojo.getProject().getArtifacts() )
{
assertUnpacked( !saf.include( artifact ), artifact );
}
}
public void testIncludeType()
throws Exception
{
mojo.getProject().setArtifacts( stubFactory.getTypedArchiveArtifacts() );
mojo.getProject().setDependencyArtifacts( new HashSet<Artifact>() );
mojo.includeTypes = "jar";
mojo.excludeTypes = "jar";
// shouldn't get anything
mojo.execute();
Iterator<Artifact> iter = mojo.getProject().getArtifacts().iterator();
while ( iter.hasNext() )
{
Artifact artifact = iter.next();
assertUnpacked( false, artifact );
}
mojo.excludeTypes = "";
mojo.execute();
iter = mojo.getProject().getArtifacts().iterator();
while ( iter.hasNext() )
{
Artifact artifact = iter.next();
assertUnpacked( artifact.getType().equalsIgnoreCase( "jar" ), artifact );
}
}
public void testSubPerType()
throws Exception
{
mojo.getProject().setArtifacts( stubFactory.getTypedArchiveArtifacts() );
mojo.getProject().setDependencyArtifacts( new HashSet<Artifact>() );
mojo.useSubDirectoryPerType = true;
mojo.execute();
for ( Artifact artifact : (Iterable<Artifact>) mojo.getProject().getArtifacts() )
{
assertUnpacked( artifact );
}
}
public void testSubPerArtifact()
throws Exception
{
mojo.useSubDirectoryPerArtifact = true;
mojo.execute();
for ( Artifact artifact : (Iterable<Artifact>) mojo.getProject().getArtifacts() )
{
assertUnpacked( artifact );
}
}
public void testSubPerArtifactAndType()
throws Exception
{
mojo.getProject().setArtifacts( stubFactory.getTypedArchiveArtifacts() );
mojo.getProject().setDependencyArtifacts( new HashSet<Artifact>() );
mojo.useSubDirectoryPerArtifact = true;
mojo.useSubDirectoryPerType = true;
mojo.execute();
for ( Artifact artifact : (Iterable<Artifact>) mojo.getProject().getArtifacts() )
{
assertUnpacked( artifact );
}
}
public void testSubPerArtifactRemoveVersion()
throws Exception
{
mojo.useSubDirectoryPerArtifact = true;
mojo.stripVersion = true;
mojo.execute();
for ( Artifact artifact : (Iterable<Artifact>) mojo.getProject().getArtifacts() )
{
assertUnpacked( artifact );
}
}
public void testSubPerArtifactAndTypeRemoveVersion()
throws Exception
{
mojo.getProject().setArtifacts( stubFactory.getTypedArchiveArtifacts() );
mojo.getProject().setDependencyArtifacts( new HashSet<Artifact>() );
mojo.useSubDirectoryPerArtifact = true;
mojo.useSubDirectoryPerType = true;
mojo.stripVersion = true;
mojo.execute();
for ( Artifact artifact : (Iterable<Artifact>) mojo.getProject().getArtifacts() )
{
assertUnpacked( artifact );
}
}
public void testIncludeCompileScope()
throws Exception
{
mojo.getProject().setArtifacts( stubFactory.getScopedArtifacts() );
mojo.getProject().setDependencyArtifacts( new HashSet<Artifact>() );
mojo.includeScope = "compile";
mojo.execute();
ScopeArtifactFilter saf = new ScopeArtifactFilter( mojo.includeScope );
for ( Artifact artifact : (Iterable<Artifact>) mojo.getProject().getArtifacts() )
{
assertUnpacked( saf.include( artifact ), artifact );
}
}
public void testIncludeTestScope()
throws Exception
{
mojo.getProject().setArtifacts( stubFactory.getScopedArtifacts() );
mojo.getProject().setDependencyArtifacts( new HashSet<Artifact>() );
mojo.includeScope = "test";
mojo.execute();
ScopeArtifactFilter saf = new ScopeArtifactFilter( mojo.includeScope );
for ( Artifact artifact : (Iterable<Artifact>) mojo.getProject().getArtifacts() )
{
assertUnpacked( saf.include( artifact ), artifact );
}
}
public void testIncludeRuntimeScope()
throws Exception
{
mojo.getProject().setArtifacts( stubFactory.getScopedArtifacts() );
mojo.getProject().setDependencyArtifacts( new HashSet<Artifact>() );
mojo.includeScope = "runtime";
mojo.execute();
ScopeArtifactFilter saf = new ScopeArtifactFilter( mojo.includeScope );
for ( Artifact artifact : (Iterable<Artifact>) mojo.getProject().getArtifacts() )
{
assertUnpacked( saf.include( artifact ), artifact );
}
}
public void testIncludeprovidedScope()
throws Exception
{
mojo.getProject().setArtifacts( stubFactory.getScopedArtifacts() );
mojo.getProject().setDependencyArtifacts( new HashSet<Artifact>() );
mojo.includeScope = "provided";
mojo.execute();
for ( Artifact artifact : (Iterable<Artifact>) mojo.getProject().getArtifacts() )
{
assertUnpacked( Artifact.SCOPE_PROVIDED.equals( artifact.getScope() ), artifact );
}
}
public void testIncludesystemScope()
throws Exception
{
mojo.getProject().setArtifacts( stubFactory.getScopedArtifacts() );
mojo.getProject().setDependencyArtifacts( new HashSet<Artifact>() );
mojo.includeScope = "system";
mojo.execute();
for ( Artifact artifact : (Iterable<Artifact>) mojo.getProject().getArtifacts() )
{
assertUnpacked( Artifact.SCOPE_SYSTEM.equals( artifact.getScope() ), artifact );
}
}
public void testIncludeArtifactId()
throws Exception
{
mojo.getProject().setArtifacts( stubFactory.getArtifactArtifacts() );
mojo.getProject().setDependencyArtifacts( new HashSet<Artifact>() );
mojo.includeArtifactIds = "one";
mojo.excludeArtifactIds = "one";
// shouldn't get anything
mojo.execute();
Iterator<Artifact> iter = mojo.getProject().getArtifacts().iterator();
while ( iter.hasNext() )
{
Artifact artifact = iter.next();
assertUnpacked( false, artifact );
}
mojo.excludeArtifactIds = "";
mojo.execute();
iter = mojo.getProject().getArtifacts().iterator();
while ( iter.hasNext() )
{
Artifact artifact = iter.next();
assertUnpacked( artifact.getArtifactId().equals( "one" ), artifact );
}
}
public void testExcludeArtifactId()
throws Exception
{
mojo.getProject().setArtifacts( stubFactory.getArtifactArtifacts() );
mojo.getProject().setDependencyArtifacts( new HashSet<Artifact>() );
mojo.excludeArtifactIds = "one";
mojo.execute();
// test - get all direct dependencies and verify that they exist if they
// do not have a classifier of "one"
// then delete the file and at the end, verify the folder is empty.
for ( Artifact artifact : (Iterable<Artifact>) mojo.getProject().getArtifacts() )
{
assertUnpacked( !artifact.getArtifactId().equals( "one" ), artifact );
}
}
public void testExcludeGroupId()
throws Exception
{
mojo.getProject().setArtifacts( stubFactory.getGroupIdArtifacts() );
mojo.getProject().setDependencyArtifacts( new HashSet<Artifact>() );
mojo.excludeGroupIds = "one";
mojo.execute();
for ( Artifact artifact : (Iterable<Artifact>) mojo.getProject().getArtifacts() )
{
assertUnpacked( !artifact.getGroupId().equals( "one" ), artifact );
}
}
public void testIncludeGroupId()
throws Exception
{
mojo.getProject().setArtifacts( stubFactory.getGroupIdArtifacts() );
mojo.getProject().setDependencyArtifacts( new HashSet<Artifact>() );
mojo.includeGroupIds = "one";
mojo.excludeGroupIds = "one";
// shouldn't get anything
mojo.execute();
Iterator<Artifact> iter = mojo.getProject().getArtifacts().iterator();
while ( iter.hasNext() )
{
Artifact artifact = iter.next();
// Testing with artifact id because group id is not in filename
assertUnpacked( false, artifact );
}
mojo.excludeGroupIds = "";
mojo.execute();
iter = mojo.getProject().getArtifacts().iterator();
while ( iter.hasNext() )
{
Artifact artifact = iter.next();
// Testing with artifact id because group id is not in filename
assertUnpacked( artifact.getGroupId().equals( "one" ), artifact );
}
}
public void testCDMClassifier()
throws Exception
{
dotestClassifierType( "jdk14", null );
}
public void testCDMType()
throws Exception
{
dotestClassifierType( null, "zip" );
}
public void testCDMClassifierType()
throws Exception
{
dotestClassifierType( "jdk14", "war" );
}
public void dotestClassifierType( String testClassifier, String testType )
throws Exception
{
mojo.classifier = testClassifier;
mojo.type = testType;
for ( Artifact artifact : mojo.getProject().getArtifacts() )
{
String type = testType != null ? testType : artifact.getType();
this.stubFactory.createArtifact( artifact.getGroupId(), artifact.getArtifactId(),
VersionRange.createFromVersion( artifact.getBaseVersion() ),
artifact.getScope(), type, testClassifier, false );
}
mojo.execute();
for ( Artifact artifact : mojo.getProject().getArtifacts() )
{
String useClassifier = artifact.getClassifier();
String useType = artifact.getType();
if ( StringUtils.isNotEmpty( testClassifier ) )
{
useClassifier = testClassifier;
// type is only used if classifier is used.
if ( StringUtils.isNotEmpty( testType ) )
{
useType = testType;
}
}
Artifact unpacked =
stubFactory.createArtifact( artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(),
Artifact.SCOPE_COMPILE, useType, useClassifier );
assertUnpacked( unpacked );
}
}
public void testArtifactNotFound()
throws Exception
{
dotestArtifactExceptions( false, true );
}
public void testArtifactResolutionException()
throws Exception
{
dotestArtifactExceptions( true, false );
}
public void dotestArtifactExceptions( boolean are, boolean anfe )
throws Exception
{
mojo.classifier = "jdk";
mojo.type = "java-sources";
try
{
mojo.execute();
fail( "ExpectedException" );
}
catch ( MojoExecutionException e )
{
}
}
public File getUnpackedFile( Artifact artifact )
{
File destDir =
DependencyUtil.getFormattedOutputDirectory( mojo.isUseSubDirectoryPerScope(),
mojo.isUseSubDirectoryPerType(),
mojo.isUseSubDirectoryPerArtifact(), mojo.useRepositoryLayout,
mojo.stripVersion, mojo.getOutputDirectory(), artifact );
File unpacked = new File( destDir, DependencyArtifactStubFactory.getUnpackableFileName( artifact ) );
assertTrue( unpacked.exists() );
return unpacked;
}
public DefaultFileMarkerHandler getUnpackedMarkerHandler( Artifact artifact )
{
return new DefaultFileMarkerHandler( artifact, mojo.getMarkersDirectory() );
}
public void assertUnpacked( Artifact artifact, boolean overWrite )
throws InterruptedException, MojoExecutionException, MojoFailureException
{
File unpackedFile = getUnpackedFile( artifact );
Thread.sleep( 100 );
// round down to the last second
long time = System.currentTimeMillis();
time = time - ( time % 1000 );
assertTrue( unpackedFile.setLastModified( time ) );
// wait at least a second for filesystems that only record to the
// nearest second.
Thread.sleep( 1000 );
assertEquals( time, unpackedFile.lastModified() );
mojo.execute();
if ( overWrite )
{
assertTrue( time != unpackedFile.lastModified() );
}
else
{
assertEquals( time, unpackedFile.lastModified() );
}
}
}