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