blob: 5867742e590bf818180260415324cbe8621d095a [file] [log] [blame]
package org.apache.maven.plugins.assembly.archive.task;
/*
* 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 static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Model;
import org.apache.maven.plugins.assembly.AssemblerConfigurationSource;
import org.apache.maven.plugins.assembly.InvalidAssemblerConfigurationException;
import org.apache.maven.plugins.assembly.archive.ArchiveCreationException;
import org.apache.maven.plugins.assembly.archive.DefaultAssemblyArchiverTest;
import org.apache.maven.plugins.assembly.format.AssemblyFormattingException;
import org.apache.maven.plugins.assembly.model.DependencySet;
import org.apache.maven.plugins.assembly.model.UnpackOptions;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.ProjectBuilder;
import org.apache.maven.project.ProjectBuildingException;
import org.apache.maven.project.ProjectBuildingRequest;
import org.apache.maven.project.ProjectBuildingResult;
import org.codehaus.plexus.archiver.ArchivedFileSet;
import org.codehaus.plexus.archiver.Archiver;
import org.codehaus.plexus.archiver.ArchiverException;
import org.codehaus.plexus.archiver.FileSet;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.logging.console.ConsoleLogger;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.junit.MockitoJUnitRunner;
@RunWith( MockitoJUnitRunner.class )
public class AddDependencySetsTaskTest
{
@Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder();
@Test
public void testAddDependencySet_ShouldInterpolateDefaultOutputFileNameMapping()
throws Exception
{
final String outDir = "tmp/";
final String mainAid = "main";
final String mainGid = "org.maingrp";
final String mainVer = "9";
final String depAid = "dep";
final String depGid = "org.depgrp";
final String depVer = "1";
final String depExt = "war";
final DependencySet ds = new DependencySet();
ds.setOutputDirectory( outDir );
ds.setDirectoryMode( Integer.toString( 10, 8 ) );
ds.setFileMode( Integer.toString( 10, 8 ) );
final Model mainModel = new Model();
mainModel.setArtifactId( mainAid );
mainModel.setGroupId( mainGid );
mainModel.setVersion( mainVer );
final MavenProject mainProject = new MavenProject( mainModel );
Artifact mainArtifact = mock( Artifact.class );
mainProject.setArtifact( mainArtifact );
final Model depModel = new Model();
depModel.setArtifactId( depAid );
depModel.setGroupId( depGid );
depModel.setVersion( depVer );
depModel.setPackaging( depExt );
final MavenProject depProject = new MavenProject( depModel );
Artifact depArtifact = mock( Artifact.class );
ArtifactHandler artifactHandler = mock( ArtifactHandler.class );
when( artifactHandler.getExtension() ).thenReturn( depExt );
when( depArtifact.getArtifactHandler() ).thenReturn( artifactHandler );
final File newFile = temporaryFolder.newFile();
when( depArtifact.getFile() ).thenReturn( newFile );
when( depArtifact.getGroupId() ).thenReturn( "GROUPID" );
depProject.setArtifact( depArtifact );
ProjectBuildingResult pbr = mock( ProjectBuildingResult.class );
when( pbr.getProject() ).thenReturn( depProject );
final ProjectBuilder projectBuilder = mock( ProjectBuilder.class );
when( projectBuilder.build( any( Artifact.class ), any( ProjectBuildingRequest.class ) ) ).thenReturn( pbr );
final MavenSession session = mock( MavenSession.class );
when( session.getProjectBuildingRequest() ).thenReturn( mock( ProjectBuildingRequest.class ) );
when( session.getExecutionProperties() ).thenReturn( new Properties() );
final AssemblerConfigurationSource configSource = mock( AssemblerConfigurationSource.class );
when( configSource.getFinalName() ).thenReturn( mainAid + "-" + mainVer );
when( configSource.getProject() ).thenReturn( mainProject );
when( configSource.getMavenSession() ).thenReturn( session );
final Archiver archiver = mock( Archiver.class );
when( archiver.getDestFile() ).thenReturn( new File( "junk" ) );
when( archiver.getOverrideDirectoryMode() ).thenReturn( 0222 );
when( archiver.getOverrideFileMode() ).thenReturn( 0222 );
DefaultAssemblyArchiverTest.setupInterpolators( configSource, mainProject );
final Logger logger = new ConsoleLogger( Logger.LEVEL_DEBUG, "test" );
final AddDependencySetsTask task =
new AddDependencySetsTask( Collections.singletonList( ds ), Collections.singleton( depArtifact ),
depProject, projectBuilder, logger );
task.addDependencySet( ds, archiver, configSource );
// result of easymock migration, should be assert of expected result instead of verifying methodcalls
verify( configSource ).getFinalName();
verify( configSource, atLeastOnce() ).getMavenSession();
verify( configSource, atLeastOnce() ).getProject();
verify( archiver, atLeastOnce() ).getDestFile();
verify( archiver ).addFile( newFile, outDir + depAid + "-" + depVer + "." + depExt, 10 );
verify( archiver ).getOverrideDirectoryMode();
verify( archiver ).getOverrideFileMode();
verify( archiver ).setDirectoryMode( 10 );
verify( archiver ).setDirectoryMode( 146 );
verify( archiver ).setFileMode( 10 );
verify( archiver ).setFileMode( 146 );
verify( session ).getProjectBuildingRequest();
verify( session, times( 2 ) ).getExecutionProperties();
verify( projectBuilder ).build( any( Artifact.class ), any( ProjectBuildingRequest.class ) );
}
@Test
public void testAddDependencySet_ShouldNotAddDependenciesWhenProjectHasNone()
throws Exception
{
final MavenProject project = new MavenProject( new Model() );
final DependencySet ds = new DependencySet();
ds.setOutputDirectory( "/out" );
final Logger logger = new ConsoleLogger( Logger.LEVEL_DEBUG, "test" );
final AddDependencySetsTask task =
new AddDependencySetsTask( Collections.singletonList( ds ), null, project, null, logger );
task.addDependencySet( ds, null, null );
}
// TODO: Find a better way of testing the project-stubbing behavior when a ProjectBuildingException takes place.
@Test
public void testAddDependencySet_ShouldNotAddDependenciesWhenProjectIsStubbed()
throws Exception
{
final MavenProject project = new MavenProject( new Model() );
final ProjectBuildingException pbe = new ProjectBuildingException( "test", "Test error.", new Throwable() );
final String aid = "test-dep";
final String version = "2.0-SNAPSHOT";
final String type = "jar";
final File file = new File( "dep-artifact.jar" );
Artifact depArtifact = mock( Artifact.class );
when( depArtifact.getGroupId() ).thenReturn( "GROUPID" );
when( depArtifact.getArtifactId() ).thenReturn( aid );
when( depArtifact.getBaseVersion() ).thenReturn( version );
when( depArtifact.getFile() ).thenReturn( file );
ArtifactHandler artifactHandler = mock( ArtifactHandler.class );
when( artifactHandler.getExtension() ).thenReturn( type );
when( depArtifact.getArtifactHandler() ).thenReturn( artifactHandler );
final File destFile = new File( "assembly-dep-set.zip" );
final Archiver archiver = mock( Archiver.class );
when( archiver.getDestFile() ).thenReturn( destFile );
when( archiver.getOverrideDirectoryMode() ).thenReturn( 0222 );
when( archiver.getOverrideFileMode() ).thenReturn( 0222 );
final ProjectBuilder projectBuilder = mock( ProjectBuilder.class );
when( projectBuilder.build( any(Artifact.class), any(ProjectBuildingRequest.class) ) ).thenThrow( pbe );
final MavenSession session = mock( MavenSession.class );
when( session.getProjectBuildingRequest() ).thenReturn( mock( ProjectBuildingRequest.class ) );
when( session.getExecutionProperties() ).thenReturn( new Properties() );
final AssemblerConfigurationSource configSource = mock( AssemblerConfigurationSource.class );
when( configSource.getFinalName() ).thenReturn( "final-name" );
when( configSource.getMavenSession() ).thenReturn( session );
when( configSource.getProject() ).thenReturn( project );
final DependencySet ds = new DependencySet();
ds.setOutputDirectory( "/out" );
DefaultAssemblyArchiverTest.setupInterpolators( configSource, project );
final Logger logger = new ConsoleLogger( Logger.LEVEL_DEBUG, "test" );
final AddDependencySetsTask task =
new AddDependencySetsTask( Collections.singletonList( ds ), Collections.singleton( depArtifact ),
project, projectBuilder, logger );
task.addDependencySet( ds, archiver, configSource );
// result of easymock migration, should be assert of expected result instead of verifying methodcalls
verify( configSource ).getFinalName();
verify( configSource, atLeastOnce() ).getMavenSession();
verify( configSource, atLeastOnce() ).getProject();
verify( archiver ).addFile( file, "out/" + aid + "-" + version + "." + type );
verify( archiver, atLeastOnce() ).getDestFile();
verify( archiver ).getOverrideDirectoryMode();
verify( archiver ).getOverrideFileMode();
verify( session ).getProjectBuildingRequest();
verify( session, times( 2 ) ).getExecutionProperties();
verify( projectBuilder ).build( any(Artifact.class), any(ProjectBuildingRequest.class) );
}
@Test
public void testAddDependencySet_ShouldAddOneDependencyFromProjectWithoutUnpacking()
throws Exception
{
verifyOneDependencyAdded( "out", false );
}
@Test
public void testAddDependencySet_ShouldAddOneDependencyFromProjectUnpacked()
throws Exception
{
verifyOneDependencyAdded( "out", true );
}
private void verifyOneDependencyAdded( final String outputLocation, final boolean unpack )
throws AssemblyFormattingException, ArchiverException, ArchiveCreationException, IOException,
InvalidAssemblerConfigurationException, ProjectBuildingException
{
final MavenProject project = new MavenProject( new Model() );
final DependencySet ds = new DependencySet();
ds.setOutputDirectory( outputLocation );
ds.setOutputFileNameMapping( "artifact" );
ds.setUnpack( unpack );
ds.setScope( Artifact.SCOPE_COMPILE );
ds.setDirectoryMode( Integer.toString( 10, 8 ) );
ds.setFileMode( Integer.toString( 10, 8 ) );
final MavenSession session = mock( MavenSession.class );
when( session.getProjectBuildingRequest() ).thenReturn( mock( ProjectBuildingRequest.class ) );
when( session.getExecutionProperties() ).thenReturn( new Properties() );
final AssemblerConfigurationSource configSource = mock( AssemblerConfigurationSource.class );
when( configSource.getMavenSession() ).thenReturn( session );
when( configSource.getFinalName() ).thenReturn( "final-name" );
Artifact artifact = mock( Artifact.class );
final File artifactFile = temporaryFolder.newFile();
when( artifact.getFile() ).thenReturn( artifactFile );
when( artifact.getGroupId() ).thenReturn( "GROUPID" );
final Archiver archiver = mock( Archiver.class );
when( archiver.getDestFile() ).thenReturn( new File( "junk" ) );
when( archiver.getOverrideDirectoryMode() ).thenReturn( 0222 );
when( archiver.getOverrideFileMode() ).thenReturn( 0222 );
if ( !unpack )
{
when( configSource.getProject() ).thenReturn( project );
}
final MavenProject depProject = new MavenProject( new Model() );
depProject.setGroupId( "GROUPID" );
ProjectBuildingResult pbr = mock( ProjectBuildingResult.class );
when( pbr.getProject() ).thenReturn( depProject );
final ProjectBuilder projectBuilder = mock( ProjectBuilder.class );
when( projectBuilder.build( any( Artifact.class ), any( ProjectBuildingRequest.class ) ) ).thenReturn( pbr );
final Logger logger = new ConsoleLogger( Logger.LEVEL_DEBUG, "test" );
final AddDependencySetsTask task = new AddDependencySetsTask( Collections.singletonList( ds ),
Collections.singleton(
artifact ), project,
projectBuilder, logger );
DefaultAssemblyArchiverTest.setupInterpolators( configSource, project );
task.addDependencySet( ds, archiver, configSource );
// result of easymock migration, should be assert of expected result instead of verifying methodcalls
verify( configSource ).getFinalName();
verify( configSource, atLeastOnce() ).getMavenSession();
verify( archiver, atLeastOnce() ).getDestFile();
verify( archiver ).getOverrideDirectoryMode();
verify( archiver ).getOverrideFileMode();
verify( archiver ).setFileMode( 10 );
verify( archiver ).setFileMode( 146 );
verify( archiver ).setDirectoryMode( 10 );
verify( archiver ).setDirectoryMode( 146 );
verify( session ).getProjectBuildingRequest();
verify( session, atLeastOnce() ).getExecutionProperties();
verify( projectBuilder ).build( any( Artifact.class ), any( ProjectBuildingRequest.class ) );
if ( unpack )
{
verify( archiver ).addArchivedFileSet( any( ArchivedFileSet.class ), isNull( Charset.class ) );
}
else
{
verify( archiver ).addFile( artifactFile, outputLocation + "/artifact", 10 );
verify( configSource, atLeastOnce() ).getProject();
}
}
@Test
public void testGetDependencyArtifacts_ShouldGetOneDependencyArtifact()
throws Exception
{
final MavenProject project = new MavenProject( new Model() );
Artifact artifact = mock( Artifact.class );
project.setArtifacts( Collections.singleton( artifact ) );
final DependencySet dependencySet = new DependencySet();
final Logger logger = new ConsoleLogger( Logger.LEVEL_DEBUG, "test" );
final AddDependencySetsTask task = new AddDependencySetsTask( Collections.singletonList( dependencySet ),
Collections.singleton(
artifact ), project,
null, logger );
final Set<Artifact> result = task.resolveDependencyArtifacts( dependencySet );
assertNotNull( result );
assertEquals( 1, result.size() );
assertSame( artifact, result.iterator().next() );
}
@Test
public void testGetDependencyArtifacts_ShouldFilterOneDependencyArtifactViaInclude()
throws Exception
{
final MavenProject project = new MavenProject( new Model() );
final Set<Artifact> artifacts = new HashSet<>();
Artifact am1 = mock( Artifact.class );
when( am1.getGroupId() ).thenReturn( "group" );
when( am1.getArtifactId() ).thenReturn( "artifact" );
when( am1.getId() ).thenReturn( "group:artifact:1.0:jar" );
artifacts.add( am1 );
Artifact am2 = mock( Artifact.class );
when( am2.getGroupId() ).thenReturn( "group2" );
when( am2.getArtifactId() ).thenReturn( "artifact2" );
when( am2.getId() ).thenReturn( "group2:artifact2:1.0:jar" );
when( am2.getDependencyConflictId() ).thenReturn( "group2:artifact2:jar" );
artifacts.add( am2 );
final DependencySet dependencySet = new DependencySet();
dependencySet.addInclude( "group:artifact" );
dependencySet.setUseTransitiveFiltering( true );
final Logger logger = new ConsoleLogger( Logger.LEVEL_DEBUG, "test" );
final AddDependencySetsTask task =
new AddDependencySetsTask( Collections.singletonList( dependencySet ), artifacts, project, null, logger );
final Set<Artifact> result = task.resolveDependencyArtifacts( dependencySet );
assertNotNull( result );
assertEquals( 1, result.size() );
assertSame( am1, result.iterator().next() );
}
@Test
public void testGetDependencyArtifacts_ShouldIgnoreTransitivePathFilteringWhenIncludeNotTransitive()
throws Exception
{
final MavenProject project = new MavenProject( new Model() );
final Set<Artifact> artifacts = new HashSet<>();
Artifact am1 = mock( Artifact.class );
when( am1.getGroupId() ).thenReturn( "group" );
when( am1.getArtifactId() ).thenReturn( "artifact" );
when( am1.getId() ).thenReturn( "group:artifact:1.0:jar" );
artifacts.add( am1 );
Artifact am2 = mock( Artifact.class );
when( am2.getGroupId() ).thenReturn( "group2" );
when( am2.getArtifactId() ).thenReturn( "artifact2" );
when( am2.getId() ).thenReturn( "group2:artifact2:1.0:jar" );
when( am2.getDependencyConflictId() ).thenReturn( "group2:artifact2:jar" );
artifacts.add( am2 );
final DependencySet dependencySet = new DependencySet();
dependencySet.addInclude( "group:artifact" );
dependencySet.setUseTransitiveFiltering( false );
final Logger logger = new ConsoleLogger( Logger.LEVEL_DEBUG, "test" );
final AddDependencySetsTask task =
new AddDependencySetsTask( Collections.singletonList( dependencySet ), artifacts, project, null, logger );
final Set<Artifact> result = task.resolveDependencyArtifacts( dependencySet );
assertNotNull( result );
assertEquals( 1, result.size() );
assertSame( am1, result.iterator().next() );
}
// MASSEMBLY-879
@Test
public void useDefaultExcludes() throws Exception
{
Artifact zipArtifact = mock( Artifact.class );
when( zipArtifact.getGroupId() ).thenReturn( "some-artifact" );
when( zipArtifact.getArtifactId() ).thenReturn( "of-type-zip" );
when( zipArtifact.getId() ).thenReturn( "some-artifact:of-type-zip:1.0:zip" );
when( zipArtifact.getFile() ).thenReturn( temporaryFolder.newFile( "of-type-zip.zip" ) );
Artifact dirArtifact = mock( Artifact.class );
when( dirArtifact.getGroupId() ).thenReturn( "some-artifact" );
when( dirArtifact.getArtifactId() ).thenReturn( "of-type-zip" );
when( dirArtifact.getId() ).thenReturn( "some-artifact:of-type-zip:1.0:dir" );
when( dirArtifact.getFile() ).thenReturn( temporaryFolder.newFolder( "of-type-zip" ) );
final Set<Artifact> artifacts = new HashSet<>( Arrays.asList( zipArtifact, dirArtifact ) );
final DependencySet dependencySet = new DependencySet();
dependencySet.setUseProjectArtifact( false );
dependencySet.setIncludes( Collections.singletonList( "some-artifact:of-type-zip" ) );
dependencySet.setOutputDirectory( "MyOutputDir" );
dependencySet.setUnpack( true );
UnpackOptions unpackOptions = new UnpackOptions();
unpackOptions.setUseDefaultExcludes( false );
dependencySet.setUnpackOptions( unpackOptions );
final MavenProject project = new MavenProject( new Model() );
project.setGroupId( "GROUPID" );
ProjectBuildingRequest pbReq = mock( ProjectBuildingRequest.class );
ProjectBuildingResult pbRes = mock( ProjectBuildingResult.class );
when( pbRes.getProject() ).thenReturn( project );
final ProjectBuilder projectBuilder = mock( ProjectBuilder.class );
when( projectBuilder.build( any( Artifact.class ), eq( pbReq ) ) ).thenReturn( pbRes );
final AddDependencySetsTask task = new AddDependencySetsTask( Collections.singletonList( dependencySet ),
artifacts, project, projectBuilder, mock( Logger.class ) );
final MavenSession session = mock( MavenSession.class );
when( session.getProjectBuildingRequest() ).thenReturn( pbReq );
final AssemblerConfigurationSource configSource = mock( AssemblerConfigurationSource.class );
when( configSource.getMavenSession() ).thenReturn( session );
DefaultAssemblyArchiverTest.setupInterpolators( configSource, project );
final Archiver archiver = mock( Archiver.class );
task.addDependencySet( dependencySet, archiver, configSource );
ArgumentCaptor<ArchivedFileSet> archivedFileSet = ArgumentCaptor.forClass( ArchivedFileSet.class );
verify( archiver ).addArchivedFileSet( archivedFileSet.capture(), isNull( Charset.class ) );
assertThat( archivedFileSet.getValue().isUsingDefaultExcludes(), is( false ) );
ArgumentCaptor<FileSet> fileSet = ArgumentCaptor.forClass( FileSet.class );
verify( archiver ).addFileSet( fileSet.capture() );
assertThat( fileSet.getValue().isUsingDefaultExcludes(), is( false ) );
}
}