blob: d54a138d1c3a9c91b1dd178f79ce73e7b8d88837 [file] [log] [blame]
package org.apache.maven.plugin.assembly.format;
/*
* 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 org.apache.maven.model.Build;
import org.apache.maven.model.Model;
import org.apache.maven.plugin.assembly.AssemblerConfigurationSource;
import org.apache.maven.plugin.assembly.testutils.TestFileManager;
import org.apache.maven.project.MavenProject;
import org.apache.maven.shared.filtering.MavenFileFilter;
import org.codehaus.plexus.PlexusTestCase;
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 java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static org.easymock.EasyMock.expect;
public class FileFormatterTest
extends PlexusTestCase
{
private final Logger logger = new ConsoleLogger( Logger.LEVEL_DEBUG, "test" );
private final TestFileManager fileManager = new TestFileManager( "fileFormatterTest.", "" );
private final EasyMockSupport mockManager = new EasyMockSupport();
private AssemblerConfigurationSource configSource;
@Override
public void setUp()
throws Exception
{
super.setUp();
configSource = mockManager.createMock(AssemblerConfigurationSource.class);
}
@Override
public void tearDown()
throws IOException
{
fileManager.cleanUp();
}
public void testTemporaryRootDirectoryNotExist()
throws IOException, AssemblyFormattingException
{
final File basedir = fileManager.createTempDir();
final File tempRoot = new File( basedir, "tempdir" );
expect( configSource.getTemporaryRootDirectory()).andReturn( tempRoot );
final File file = fileManager.createFile( basedir, "one.txt", "This is a\ntest." );
mockManager.replayAll();
final File result = new FileFormatter( configSource, logger ).format( file, false, "dos", "UTF-8" );
assertTrue( !file.equals( result ) );
mockManager.verifyAll();
}
public void testShouldNotTransformOneFile()
throws IOException, AssemblyFormattingException
{
final File basedir = fileManager.createTempDir();
expect( configSource.getTemporaryRootDirectory()).andReturn( basedir );
// Model model = new Model();
// model.setArtifactId( "artifact" );
// model.setGroupId( "group" );
// model.setVersion( "version" );
//
// MavenProject project = new MavenProject( model );
//
// configSource.getProject();
// configSourceControl.setReturnValue( project );
final File file = fileManager.createFile( basedir, "one.txt", "This is a test." );
mockManager.replayAll();
final File result = new FileFormatter( configSource, logger ).format( file, false, null, "UTF-8" );
assertEquals( file, result );
mockManager.verifyAll();
}
public void testShouldConvertCRLFLineEndingsInFile()
throws IOException, AssemblyFormattingException
{
final File basedir = fileManager.createTempDir();
expect( configSource.getTemporaryRootDirectory()).andReturn( basedir );
final File file = fileManager.createFile( basedir, "one.txt", "This is a\ntest." );
mockManager.replayAll();
final File result = new FileFormatter( configSource, logger ).format( file, false, "dos", "UTF-8" );
assertEquals( "This is a\r\ntest.", fileManager.getFileContents( result ) );
mockManager.verifyAll();
}
public void testShouldConvertLFLineEndingsInFile()
throws IOException, AssemblyFormattingException
{
final File basedir = fileManager.createTempDir();
expect( configSource.getTemporaryRootDirectory()).andReturn( basedir );
final File file = fileManager.createFile( basedir, "one.txt", "This is a\r\ntest." );
mockManager.replayAll();
final File result = new FileFormatter( configSource, logger ).format( file, false, "unix", "UTF-8" );
assertEquals( "This is a\ntest.", fileManager.getFileContents( result ) );
mockManager.verifyAll();
}
public void testShouldFilterProjectExpressionInFile()
throws Exception
{
final File basedir = fileManager.createTempDir();
enableBasicFilteringConfiguration( basedir, null );
final File file =
fileManager.createFile( basedir, "one.txt", "This is a test for project: ${artifactId} @artifactId@." );
mockManager.replayAll();
final File result = new FileFormatter( configSource, logger ).format( file, true, null, "UTF-8" );
assertEquals( "This is a test for project: artifact artifact.", fileManager.getFileContents( result ) );
mockManager.verifyAll();
}
public void testShouldFilterExpressionInPropertiesFileWithWindowsEscapes()
throws Exception
{
final File sourceDir = fileManager.createTempDir();
final MavenProject project = createBasicMavenProject();
final Build build = new Build();
// project.build.outputDirectory = C:\out\deeper
build.setOutputDirectory( "C:\\out\\deeper" );
project.setBuild( build );
enableBasicFilteringConfiguration( project, sourceDir, null );
final File file = fileManager.createFile( sourceDir, "one.properties", "out=${project.build.outputDirectory}" );
mockManager.replayAll();
final File result = new FileFormatter( configSource, logger ).format( file, true, null, "UTF-8" );
// expect: C:\\out\\deeper
assertEquals( "out=C:\\\\out\\\\deeper", fileManager.getFileContents( result ) );
mockManager.verifyAll();
}
public void testShouldFilterExpressionInPropertiesFileWithoutWindowsEscapes()
throws Exception
{
final File sourceDir = fileManager.createTempDir();
final MavenProject project = createBasicMavenProject();
final Build build = new Build();
build.setOutputDirectory( "C:\\out\\deeper" );
project.setBuild( build );
enableBasicFilteringConfiguration( project, sourceDir, null );
final File file =
fileManager.createFile( sourceDir, "one.txt", "project.basedirA=${project.build.outputDirectory}" );
mockManager.replayAll();
final File result = new FileFormatter( configSource, logger ).format( file, true, null, "UTF-8" );
assertEquals( "project.basedirA=C:\\out\\deeper", fileManager.getFileContents( result ) );
mockManager.verifyAll();
}
public void testShouldFilterExpressionFromFiltersFileInFile()
throws Exception
{
final File basedir = fileManager.createTempDir();
final File filterProps = fileManager.createFile( basedir, "filter.properties", "property=Test" );
enableBasicFilteringConfiguration( basedir, Collections.singletonList( filterProps.getCanonicalPath() ) );
final File file =
fileManager.createFile( basedir, "one.txt", "This is a test for project: ${property} @property@." );
mockManager.replayAll();
final File result = new FileFormatter( configSource, logger ).format( file, true, null, "UTF-8" );
assertEquals( "This is a test for project: Test Test.", fileManager.getFileContents( result ) );
mockManager.verifyAll();
}
public void testShouldFilterExpressionFromFiltersFileInPropertiesFileWithoutWindowsEscapes()
throws Exception
{
final File basedir = fileManager.createTempDir();
final File filterProps = fileManager.createFile( basedir, "filter.properties", "property=C:\\\\Test" );
enableBasicFilteringConfiguration( basedir, Collections.singletonList( filterProps.getCanonicalPath() ) );
final File file = fileManager.createFile( basedir, "one.properties", "project: ${property} @property@." );
mockManager.replayAll();
final File result = new FileFormatter( configSource, logger ).format( file, true, null, "UTF-8" );
assertEquals( "project: C:\\\\Test C:\\\\Test.", fileManager.getFileContents( result ) );
mockManager.verifyAll();
}
public void testShouldFilterExpressionFromFiltersFileInNonPropertiesFileWithoutWindowsEscapes()
throws Exception
{
final File basedir = fileManager.createTempDir();
final File filterProps = fileManager.createFile( basedir, "filter.properties", "property=C:\\\\Test" );
enableBasicFilteringConfiguration( basedir, Collections.singletonList( filterProps.getCanonicalPath() ) );
final File file =
fileManager.createFile( basedir, "one.txt", "This is a test for project: ${property} @property@." );
mockManager.replayAll();
final File result = new FileFormatter( configSource, logger ).format( file, true, null, "UTF-8" );
assertEquals( "This is a test for project: C:\\Test C:\\Test.", fileManager.getFileContents( result ) );
mockManager.verifyAll();
}
public void testShouldNotIgnoreFirstWordInDotNotationExpressions()
throws Exception
{
final File basedir = fileManager.createTempDir();
enableBasicFilteringConfiguration( basedir, null );
final File file =
fileManager.createFile( basedir, "one.txt", "testing ${bean.id} which used to resolve to project.id" );
mockManager.replayAll();
final File result = new FileFormatter( configSource, logger ).format( file, true, null, "UTF-8" );
assertEquals( "testing ${bean.id} which used to resolve to project.id", fileManager.getFileContents( result ) );
mockManager.verifyAll();
}
public void testShouldFilterExpressionsFromTwoFiltersFilesInFile()
throws Exception
{
final File basedir = fileManager.createTempDir();
final File filterProps = fileManager.createFile( basedir, "filter.properties", "property=Test" );
final File filterProps2 = fileManager.createFile( basedir, "filter2.properties", "otherProperty=OtherValue" );
final List<String> filters = new ArrayList<String>();
filters.add( filterProps.getCanonicalPath() );
filters.add( filterProps2.getCanonicalPath() );
enableBasicFilteringConfiguration( basedir, filters );
final File file =
fileManager.createFile( basedir, "one.txt",
"property: ${property} @property@ otherProperty: ${otherProperty} @otherProperty@." );
mockManager.replayAll();
final File result = new FileFormatter( configSource, logger ).format( file, true, null, "UTF-8" );
assertEquals( "property: Test Test otherProperty: OtherValue OtherValue.", fileManager.getFileContents( result ) );
mockManager.verifyAll();
}
public void testShouldOverrideOneFilterValueWithAnotherAndFilterFile()
throws Exception
{
final File basedir = fileManager.createTempDir();
final File filterProps = fileManager.createFile( basedir, "filter.properties", "property=Test" );
final File filterProps2 = fileManager.createFile( basedir, "filter2.properties", "property=OtherValue" );
final List<String> filters = new ArrayList<String>();
filters.add( filterProps.getCanonicalPath() );
filters.add( filterProps2.getCanonicalPath() );
enableBasicFilteringConfiguration( basedir, filters );
final File file = fileManager.createFile( basedir, "one.txt", "property: ${property} @property@." );
mockManager.replayAll();
final File result = new FileFormatter( configSource, logger ).format( file, true, null, "UTF-8" );
assertEquals( "property: OtherValue OtherValue.", fileManager.getFileContents( result ) );
mockManager.verifyAll();
}
public void testShouldOverrideProjectValueWithFilterValueAndFilterFile()
throws Exception
{
final File basedir = fileManager.createTempDir();
final File filterProps = fileManager.createFile( basedir, "filter.properties", "artifactId=Test" );
final List<String> filters = new ArrayList<String>();
filters.add( filterProps.getCanonicalPath() );
enableBasicFilteringConfiguration( basedir, filters );
final File file =
fileManager.createFile( basedir, "one.txt", "project artifact-id: ${artifactId} @artifactId@." );
mockManager.replayAll();
final File result = new FileFormatter( configSource, logger ).format( file, true, null, "UTF-8" );
assertEquals( "project artifact-id: Test Test.", fileManager.getFileContents( result ) );
mockManager.verifyAll();
}
public void testShouldCombineProjectValueWithFilterValueAndFilterFile()
throws Exception
{
final File basedir = fileManager.createTempDir();
final File buildFilterProps =
fileManager.createFile( basedir, "build-filter.properties", "common=build\r\nbuild.test=build\r\n" );
final File configFilterProps =
fileManager.createFile( basedir, "config-filter.properties", "common=config\r\nconfig.test=config\r\n" );
final List<String> buildFilters = new ArrayList<String>();
buildFilters.add( buildFilterProps.getCanonicalPath() );
final List<String> configFilters = new ArrayList<String>();
configFilters.add( configFilterProps.getCanonicalPath() );
enableFilteringConfiguration( basedir, buildFilters, configFilters, true );
final File file =
fileManager.createFile( basedir, "one.txt",
"filtered common=${common} build.test=${build.test} config.test=${config.test}." );
mockManager.replayAll();
final File result = new FileFormatter( configSource, logger ).format( file, true, null, "UTF-8" );
assertEquals( "filtered common=build build.test=build config.test=config.",
fileManager.getFileContents( result ) );
mockManager.verifyAll();
}
public void testShouldIgnoreProjectValueWithFilterValueAndFilterFile()
throws Exception
{
final File basedir = fileManager.createTempDir();
final File buildFilterProps =
fileManager.createFile( basedir, "build-filter.properties", "common=build\r\nbuild.test=build\r\n" );
final File configFilterProps =
fileManager.createFile( basedir, "config-filter.properties", "common=config\r\nconfig.test=config\r\n" );
final List<String> buildFilters = new ArrayList<String>();
buildFilters.add( buildFilterProps.getCanonicalPath() );
final List<String> configFilters = new ArrayList<String>();
configFilters.add( configFilterProps.getCanonicalPath() );
enableFilteringConfiguration( basedir, buildFilters, configFilters, false );
final File file =
fileManager.createFile( basedir, "config.txt",
"filtered common=${common} build.test=${build.test} config.test=${config.test}." );
mockManager.replayAll();
final File result = new FileFormatter( configSource, logger ).format( file, true, null, "UTF-8" );
assertEquals( "filtered common=config build.test=${build.test} config.test=config.",
fileManager.getFileContents( result ) );
mockManager.verifyAll();
}
public void testShouldFilterExpressionFromFiltersFileInFileAddCustomDelimiters()
throws Exception
{
final File basedir = fileManager.createTempDir();
final File filterProps = fileManager.createFile( basedir, "filter.properties", "property=Test" );
final List<String> delimiters = Collections.unmodifiableList( Arrays.asList( "${*}", "@", "#", "(*)" ) );
enableBasicFilteringConfiguration( basedir, Collections.singletonList( filterProps.getCanonicalPath() ),
delimiters );
final File file =
fileManager.createFile( basedir, "one.txt",
"This is a test for project: ${property} @property@ #property# (property)." );
mockManager.replayAll();
final File result = new FileFormatter( configSource, logger ).format( file, true, null, "UTF-8" );
assertEquals( "This is a test for project: Test Test Test Test.", fileManager.getFileContents( result ) );
mockManager.verifyAll();
}
public void testShouldFilterExpressionFromFiltersFileInFileCustomDelimiters()
throws Exception
{
final File basedir = fileManager.createTempDir();
final File filterProps = fileManager.createFile( basedir, "filter.properties", "property=Test" );
final List<String> delimiters = Collections.unmodifiableList( Arrays.asList( "#", "(*)" ) );
enableBasicFilteringConfiguration( basedir, Collections.singletonList( filterProps.getCanonicalPath() ),
delimiters );
final File file =
fileManager.createFile( basedir, "one.txt",
"This is a test for project: ${property} @property@ #property# (property)." );
mockManager.replayAll();
final File result = new FileFormatter( configSource, logger ).format( file, true, null, "UTF-8" );
assertEquals( "This is a test for project: ${property} @property@ Test Test.",
fileManager.getFileContents( result ) );
mockManager.verifyAll();
}
private MavenProject createBasicMavenProject()
{
final Model model = new Model();
model.setArtifactId( "artifact" );
model.setGroupId( "group" );
model.setVersion( "version" );
return new MavenProject( model );
}
private void enableBasicFilteringConfiguration( final MavenProject project, final File basedir, final List<String> delimiters )
throws Exception
{
enableFilteringConfiguration( project, basedir, delimiters, Collections.<String> emptyList(), true );
}
private void enableFilteringConfiguration( final MavenProject project, final File basedir, final List<String> delimiters,
final List<String> filters, final boolean includeProjectBuildFilters )
throws Exception
{
expect( configSource.getTemporaryRootDirectory()).andReturn( basedir ).atLeastOnce();
expect( configSource.getEscapeString()).andReturn( null ).atLeastOnce();
expect( configSource.getProject()).andReturn( project).atLeastOnce();
expect( configSource.getMavenFileFilter()).andReturn(
(MavenFileFilter) lookup( "org.apache.maven.shared.filtering.MavenFileFilter" ) );
expect( configSource.getMavenSession()).andReturn( null );
expect( configSource.getFilters()).andReturn( filters );
expect( configSource.isIncludeProjectBuildFilters()).andReturn( includeProjectBuildFilters );
expect( configSource.getDelimiters()).andReturn( delimiters );
}
private void enableBasicFilteringConfiguration( final File basedir, final List<String> buildFilterFilenames )
throws Exception
{
final MavenProject project = createBasicMavenProject();
if ( buildFilterFilenames != null )
{
project.getBuild().setFilters( buildFilterFilenames );
}
enableBasicFilteringConfiguration( project, basedir, null );
}
private void enableFilteringConfiguration( final File basedir, final List<String> buildFilterFilenames,
final List<String> configFilterFilenames,
boolean includeProjectBuildFilters )
throws Exception
{
final MavenProject project = createBasicMavenProject();
if ( buildFilterFilenames != null )
{
project.getBuild().setFilters( buildFilterFilenames );
}
enableFilteringConfiguration( project, basedir, null, configFilterFilenames, includeProjectBuildFilters );
}
private void enableBasicFilteringConfiguration( final File basedir, final List<String> buildFilterFilenames, final List<String> delimiters )
throws Exception
{
final MavenProject project = createBasicMavenProject();
if ( buildFilterFilenames != null )
{
project.getBuild().setFilters( buildFilterFilenames );
}
enableBasicFilteringConfiguration( project, basedir, delimiters );
}
}