blob: 07d2a71802b6fb59fd4e7621925d25b4acd6dfd1 [file] [log] [blame]
package org.apache.maven.plugins.assembly.archive.phase;
/*
* 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 junit.framework.Assert;
import junit.framework.TestCase;
import org.apache.maven.model.Model;
import org.apache.maven.plugins.assembly.AssemblerConfigurationSource;
import org.apache.maven.plugins.assembly.archive.ArchiveCreationException;
import org.apache.maven.plugins.assembly.format.AssemblyFormattingException;
import org.apache.maven.plugins.assembly.model.Assembly;
import org.apache.maven.plugins.assembly.model.FileItem;
import org.apache.maven.plugins.assembly.testutils.TestFileManager;
import org.apache.maven.plugins.assembly.utils.TypeConversionUtils;
import org.apache.maven.project.MavenProject;
import org.apache.maven.shared.utils.Os;
import org.codehaus.plexus.archiver.Archiver;
import org.codehaus.plexus.archiver.ArchiverException;
import org.codehaus.plexus.components.io.resources.PlexusIoResource;
import org.codehaus.plexus.interpolation.fixed.FixedStringSearchInterpolator;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.logging.console.ConsoleLogger;
import org.easymock.classextension.EasyMockSupport;
import java.io.File;
import java.io.IOException;
import static org.easymock.EasyMock.anyInt;
import static org.easymock.EasyMock.anyObject;
import static org.easymock.EasyMock.expect;
public class FileItemAssemblyPhaseTest
extends TestCase
{
private final TestFileManager fileManager = new TestFileManager( "file-item-phase.test.", "" );
@Override
public void tearDown()
throws IOException
{
fileManager.cleanUp();
}
public void testExecute_ShouldAddNothingWhenNoFileItemsArePresent()
throws ArchiveCreationException, AssemblyFormattingException
{
final EasyMockSupport mm = new EasyMockSupport();
final MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
final File basedir = fileManager.createTempDir();
macCS.expectGetBasedir( basedir );
final MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
final Assembly assembly = new Assembly();
assembly.setId( "test" );
mm.replayAll();
createPhase( macLogger.logger ).execute( assembly, null, macCS.configSource );
mm.verifyAll();
}
public void testExecute_ShouldAddAbsoluteFileNoFilterNoLineEndingConversion()
throws ArchiveCreationException, AssemblyFormattingException, IOException
{
final EasyMockSupport mm = new EasyMockSupport();
final MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
final File basedir = fileManager.createTempDir();
final File file = fileManager.createFile( basedir, "file.txt", "This is a test file." );
macCS.expectGetBasedir( basedir );
macCS.expectGetProject( new MavenProject( new Model() ) );
macCS.expectGetFinalName( "final-name" );
macCS.expectInterpolators();
final MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
final MockAndControlForArchiver macArchiver = new MockAndControlForArchiver( mm );
final Assembly assembly = new Assembly();
assembly.setId( "test" );
final FileItem fi = new FileItem();
fi.setSource( file.getAbsolutePath() );
fi.setFiltered( false );
fi.setLineEnding( "keep" );
fi.setFileMode( "777" );
macArchiver.expectAddFile( file, "file.txt", TypeConversionUtils.modeToInt( "777", new ConsoleLogger(
Logger.LEVEL_DEBUG, "test" ) ) );
assembly.addFile( fi );
mm.replayAll();
createPhase( macLogger.logger ).execute( assembly, macArchiver.archiver, macCS.configSource );
mm.verifyAll();
}
public void testExecute_ShouldAddRelativeFileNoFilterNoLineEndingConversion()
throws ArchiveCreationException, AssemblyFormattingException, IOException
{
final EasyMockSupport mm = new EasyMockSupport();
final MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
final File basedir = fileManager.createTempDir();
final File file = fileManager.createFile( basedir, "file.txt", "This is a test file." );
macCS.expectGetBasedir( basedir );
macCS.expectGetProject( new MavenProject( new Model() ) );
macCS.expectGetFinalName( "final-name" );
macCS.expectInterpolators();
final MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
final MockAndControlForArchiver macArchiver = new MockAndControlForArchiver( mm );
final Assembly assembly = new Assembly();
assembly.setId( "test" );
final FileItem fi = new FileItem();
fi.setSource( "file.txt" );
fi.setFiltered( false );
fi.setLineEnding( "keep" );
fi.setFileMode( "777" );
macArchiver.expectAddFile( file, "file.txt", TypeConversionUtils.modeToInt( "777", new ConsoleLogger(
Logger.LEVEL_DEBUG, "test" ) ) );
assembly.addFile( fi );
mm.replayAll();
createPhase( macLogger.logger ).execute( assembly, macArchiver.archiver, macCS.configSource );
mm.verifyAll();
}
public void testExecute_WithOutputDirectory()
throws Exception
{
final EasyMockSupport mm = new EasyMockSupport();
final MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
final File basedir = fileManager.createTempDir();
final File readmeFile = fileManager.createFile( basedir, "README.txt", "This is a test file for README.txt." );
final File licenseFile =
fileManager.createFile( basedir, "LICENSE.txt", "This is a test file for LICENSE.txt." );
final File configFile =
fileManager.createFile( basedir, "config/config.txt", "This is a test file for config/config.txt" );
macCS.expectGetBasedir( basedir );
macCS.expectGetProject( new MavenProject( new Model() ) );
macCS.expectGetFinalName( "final-name" );
macCS.expectInterpolators();
final MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
if ( Os.isFamily( Os.FAMILY_WINDOWS ) )
{
macLogger.logger.error( "OS=Windows and the assembly descriptor contains a *nix-specific "
+ "root-relative reference (starting with slash): /" );
}
else
{
macLogger.logger.warn( (String) anyObject() );
}
final MockAndControlForArchiver macArchiver = new MockAndControlForArchiver( mm );
final Assembly assembly = new Assembly();
assembly.setId( "test" );
assembly.setIncludeBaseDirectory( true );
final FileItem readmeFileItem = new FileItem();
readmeFileItem.setSource( "README.txt" );
readmeFileItem.setOutputDirectory( "" );
readmeFileItem.setFiltered( false );
readmeFileItem.setLineEnding( "keep" );
readmeFileItem.setFileMode( "777" );
final FileItem licenseFileItem = new FileItem();
licenseFileItem.setSource( "LICENSE.txt" );
licenseFileItem.setOutputDirectory( "/" );
licenseFileItem.setFiltered( false );
licenseFileItem.setLineEnding( "keep" );
licenseFileItem.setFileMode( "777" );
final FileItem configFileItem = new FileItem();
configFileItem.setSource( "config/config.txt" );
configFileItem.setOutputDirectory( "config" );
configFileItem.setFiltered( false );
configFileItem.setLineEnding( "keep" );
configFileItem.setFileMode( "777" );
macArchiver.expectAddFile( readmeFile, "README.txt", TypeConversionUtils.modeToInt( "777", new ConsoleLogger(
Logger.LEVEL_DEBUG, "test" ) ) );
macArchiver.expectAddFile( licenseFile, "LICENSE.txt", TypeConversionUtils.modeToInt( "777", new ConsoleLogger(
Logger.LEVEL_DEBUG, "test" ) ) );
macArchiver.expectAddFile( configFile, "config/config.txt", TypeConversionUtils.modeToInt( "777",
new ConsoleLogger(
Logger
.LEVEL_DEBUG,
"test" ) ) );
assembly.addFile( readmeFileItem );
assembly.addFile( licenseFileItem );
assembly.addFile( configFileItem );
mm.replayAll();
createPhase( macLogger.logger ).execute( assembly, macArchiver.archiver, macCS.configSource );
mm.verifyAll();
}
public void testExecute_WithOutputDirectoryAndDestName()
throws Exception
{
final EasyMockSupport mm = new EasyMockSupport();
final MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
final File basedir = fileManager.createTempDir();
final File readmeFile = fileManager.createFile( basedir, "README.txt", "This is a test file for README.txt." );
final File licenseFile =
fileManager.createFile( basedir, "LICENSE.txt", "This is a test file for LICENSE.txt." );
final File configFile =
fileManager.createFile( basedir, "config/config.txt", "This is a test file for config/config.txt" );
macCS.expectGetBasedir( basedir );
macCS.expectGetProject( new MavenProject( new Model() ) );
macCS.expectGetFinalName( "final-name" );
macCS.expectInterpolators();
final MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
if ( Os.isFamily( Os.FAMILY_WINDOWS ) )
{
macLogger.logger.error( "OS=Windows and the assembly descriptor contains a *nix-specific "
+ "root-relative reference (starting with slash): /" );
}
else
{
macLogger.logger.warn( (String) anyObject() );
}
final MockAndControlForArchiver macArchiver = new MockAndControlForArchiver( mm );
final Assembly assembly = new Assembly();
assembly.setId( "test" );
assembly.setIncludeBaseDirectory( true );
final FileItem readmeFileItem = new FileItem();
readmeFileItem.setSource( "README.txt" );
readmeFileItem.setOutputDirectory( "" );
readmeFileItem.setDestName( "README_renamed.txt" );
readmeFileItem.setFiltered( false );
readmeFileItem.setLineEnding( "keep" );
readmeFileItem.setFileMode( "777" );
final FileItem licenseFileItem = new FileItem();
licenseFileItem.setSource( "LICENSE.txt" );
licenseFileItem.setOutputDirectory( "/" );
licenseFileItem.setDestName( "LICENSE_renamed.txt" );
licenseFileItem.setFiltered( false );
licenseFileItem.setLineEnding( "keep" );
licenseFileItem.setFileMode( "777" );
final FileItem configFileItem = new FileItem();
configFileItem.setSource( "config/config.txt" );
configFileItem.setDestName( "config_renamed.txt" );
configFileItem.setOutputDirectory( "config" );
configFileItem.setFiltered( false );
configFileItem.setLineEnding( "keep" );
configFileItem.setFileMode( "777" );
macArchiver.expectAddFile( readmeFile, "README_renamed.txt", TypeConversionUtils.modeToInt( "777",
new ConsoleLogger(
Logger
.LEVEL_DEBUG,
"test" ) ) );
macArchiver.expectAddFile( licenseFile, "LICENSE_renamed.txt", TypeConversionUtils.modeToInt( "777",
new ConsoleLogger(
Logger
.LEVEL_DEBUG,
"test" ) ) );
macArchiver.expectAddFile( configFile, "config/config_renamed.txt", TypeConversionUtils.modeToInt( "777",
new ConsoleLogger(
Logger
.LEVEL_DEBUG,
"test"
) ) );
assembly.addFile( readmeFileItem );
assembly.addFile( licenseFileItem );
assembly.addFile( configFileItem );
mm.replayAll();
createPhase( macLogger.logger ).execute( assembly, macArchiver.archiver, macCS.configSource );
mm.verifyAll();
}
public void testExecute_WithOutputDirectoryAndDestNameAndIncludeBaseDirectoryFalse()
throws Exception
{
final EasyMockSupport mm = new EasyMockSupport();
final MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
final File basedir = fileManager.createTempDir();
final File readmeFile = fileManager.createFile( basedir, "README.txt", "This is a test file for README.txt." );
final File licenseFile =
fileManager.createFile( basedir, "LICENSE.txt", "This is a test file for LICENSE.txt." );
final File configFile =
fileManager.createFile( basedir, "config/config.txt", "This is a test file for config/config.txt" );
macCS.expectGetBasedir( basedir );
macCS.expectGetProject( new MavenProject( new Model() ) );
macCS.expectGetFinalName( "final-name" );
macCS.expectInterpolators();
final MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
final MockAndControlForArchiver macArchiver = new MockAndControlForArchiver( mm );
final Assembly assembly = new Assembly();
assembly.setId( "test" );
assembly.setIncludeBaseDirectory( false );
final FileItem readmeFileItem = new FileItem();
readmeFileItem.setSource( "README.txt" );
readmeFileItem.setDestName( "README_renamed.txt" );
readmeFileItem.setFiltered( false );
readmeFileItem.setLineEnding( "keep" );
readmeFileItem.setFileMode( "777" );
final FileItem licenseFileItem = new FileItem();
licenseFileItem.setSource( "LICENSE.txt" );
licenseFileItem.setDestName( "LICENSE_renamed.txt" );
licenseFileItem.setFiltered( false );
licenseFileItem.setLineEnding( "keep" );
licenseFileItem.setFileMode( "777" );
final FileItem configFileItem = new FileItem();
configFileItem.setSource( "config/config.txt" );
configFileItem.setDestName( "config_renamed.txt" );
configFileItem.setOutputDirectory( "config" );
configFileItem.setFiltered( false );
configFileItem.setLineEnding( "keep" );
configFileItem.setFileMode( "777" );
macArchiver.expectAddFile( readmeFile, "README_renamed.txt", TypeConversionUtils.modeToInt( "777",
new ConsoleLogger(
Logger
.LEVEL_DEBUG,
"test" ) ) );
macArchiver.expectAddFile( licenseFile, "LICENSE_renamed.txt", TypeConversionUtils.modeToInt( "777",
new ConsoleLogger(
Logger
.LEVEL_DEBUG,
"test" ) ) );
macArchiver.expectAddFile( configFile, "config/config_renamed.txt", TypeConversionUtils.modeToInt( "777",
new ConsoleLogger(
Logger
.LEVEL_DEBUG,
"test"
) ) );
assembly.addFile( readmeFileItem );
assembly.addFile( licenseFileItem );
assembly.addFile( configFileItem );
mm.replayAll();
createPhase( macLogger.logger ).execute( assembly, macArchiver.archiver, macCS.configSource );
mm.verifyAll();
}
private FileItemAssemblyPhase createPhase( final Logger logger )
{
final FileItemAssemblyPhase phase = new FileItemAssemblyPhase();
phase.enableLogging( logger );
return phase;
}
private final class MockAndControlForArchiver
{
final Archiver archiver;
public MockAndControlForArchiver( final EasyMockSupport mockManager )
{
archiver = mockManager.createMock( Archiver.class );
}
public void expectAddFile( final File file, final String outputLocation, final int fileMode )
{
try
{
archiver.addResource( (PlexusIoResource) anyObject(), (String) anyObject(), anyInt() );
}
catch ( final ArchiverException e )
{
Assert.fail( "Should never happen." );
}
}
}
private final class MockAndControlForConfigSource
{
final AssemblerConfigurationSource configSource;
public MockAndControlForConfigSource( final EasyMockSupport mockManager )
{
configSource = mockManager.createMock( AssemblerConfigurationSource.class );
expect( configSource.getMavenSession() ).andReturn( null ).anyTimes();
}
public void expectGetProject( final MavenProject project )
{
expect( configSource.getProject() ).andReturn( project ).atLeastOnce();
}
public void expectGetFinalName( final String finalName )
{
expect( configSource.getFinalName() ).andReturn( finalName ).atLeastOnce();
}
public void expectInterpolators()
{
expect( configSource.getCommandLinePropsInterpolator() ).andReturn(
FixedStringSearchInterpolator.empty() ).anyTimes();
expect( configSource.getEnvInterpolator() ).andReturn( FixedStringSearchInterpolator.empty() ).anyTimes();
expect( configSource.getMainProjectInterpolator() ).andReturn(
FixedStringSearchInterpolator.empty() ).anyTimes();
}
public void expectGetBasedir( final File basedir )
{
expect( configSource.getBasedir() ).andReturn( basedir ).atLeastOnce();
}
}
private final class MockAndControlForLogger
{
final Logger logger;
public MockAndControlForLogger( final EasyMockSupport mockManager )
{
logger = mockManager.createMock( Logger.class );
}
}
}