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() ); } } }