package org.codehaus.mojo.setup; import java.io.File; import java.io.IOException; import org.apache.maven.execution.DefaultMavenExecutionRequest; import org.apache.maven.execution.DefaultMavenExecutionResult; import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugin.testing.AbstractMojoTestCase; import org.apache.maven.repository.internal.MavenRepositorySystemSession; import org.codehaus.plexus.util.FileUtils; import org.sonatype.aether.RepositorySystemSession; public abstract class AbstractSetupMojoTest extends AbstractMojoTestCase { private final String PROPERTY_MERGE = "merge"; private final String PROPERTY_SETTINGSFILE = "templateFilename"; private final String testWorkPath = "target/test-work"; protected File testWorkDirectory; protected abstract AbstractSetupMojo getMojo(); protected String getPropertiesFilename() { return getMojo().getPropertiesFilename(); } protected String getDefaultTemplateFilename() { return getMojo().getDefaultTemplateFilename(); } protected void prepareDirectoryStructure( File resourceDirectory, File workDirectory ) throws IOException { // prepare directory-structure if ( workDirectory.exists() ) { FileUtils.cleanDirectory( workDirectory ); } FileUtils.copyDirectoryStructure( resourceDirectory, workDirectory ); } protected void prepareMojo( File workDirectory ) throws Exception { DefaultMavenExecutionRequest mavenRequest = new DefaultMavenExecutionRequest(); mavenRequest.setSystemProperties( System.getProperties() ).setBaseDirectory( workDirectory ); setVariableValueToObject( getMojo(), "session", new MavenSession( this.getContainer(), new MavenRepositorySystemSession(), mavenRequest, new DefaultMavenExecutionResult() ) ); setVariableValueToObject( getMojo(), "baseDirectory", workDirectory ); } @Override protected final void setUp() throws Exception { super.setUp(); testWorkDirectory = getTestFile( testWorkPath ); testWorkDirectory.mkdirs(); // force creating all required directories onSetUp(); } public File getWorkDirectory() { return testWorkDirectory; } protected abstract File getDirectoryDefaultTargetFile(); protected abstract File getDirectoryMissingTargetFile(); protected abstract File getDirectoryMinimumTargetFile(); protected abstract String getTestPrefix(); protected abstract String getTemplateBase(); protected String getCustomTemplateFileArgument() { return getTemplateBase() + "-custom.xml"; } protected String getPropertyFileFilteredTemplateFileArgument() { return getTemplateBase() + "-filefilter.xml"; } protected String getSystemPropertyFilteredTemplateFileArgument() { return getTemplateBase() + "-systemfilter.xml"; } protected abstract File getTargetFile(); protected void onSetUp() throws Exception { } /** * Just to be sure the plugin is available * * @throws Exception */ public void testAvailable() throws Exception { assertNotNull( getMojo() ); } /** * Testing conditions: * <ul> * <li>Default template available</li> * <li>Target file doesn't exist</li> * <li>No merge-type defined</li> * </ul> * Expected situation: * <ul> * <li>A prototype file is copied to the baseDirectory</li> * </ul> * * @throws Exception */ public void testNoTargetDefaultTemplateNoMerge() throws Exception { File currentTestWorkDirectory = new File( getWorkDirectory(), getTestPrefix() + "-noTrgtDefTmpltNoMrg" ); prepareDirectoryStructure( getDirectoryMissingTargetFile(), currentTestWorkDirectory ); prepareMojo( currentTestWorkDirectory ); assertFalse( getTargetFile().exists() ); assertFalse( FileUtils.resolveFile( currentTestWorkDirectory, getMojo().getDefaultTemplateFilename() ).exists() ); // execute the mojo getMojo().execute(); assertTrue( FileUtils.resolveFile( currentTestWorkDirectory, getMojo().getDefaultTemplateFilename() ).exists() ); validateAsNoSettings(); } /** * Testing conditions: * <ul> * <li>Target file already exists</li> * <li>No template defined</li> * <li>No merge-type defined</li> * </ul> * Expected situation: * <ul> * <li>Target file is copied to the baseDirectory</li> * </ul> * * @throws Exception */ public void testDefaultTargetNoTemplateNoMerge() throws Exception { // prepare File currentTestWorkDirectory = new File( getWorkDirectory(), getTestPrefix() + "-noTmpltDefTrgtNoMrg" ); prepareDirectoryStructure( getDirectoryDefaultTargetFile(), currentTestWorkDirectory ); prepareMojo( currentTestWorkDirectory ); assertTrue( getTargetFile().exists() ); assertFalse( FileUtils.resolveFile( currentTestWorkDirectory, getMojo().getDefaultTemplateFilename() ).exists() ); getMojo().execute(); assertTrue( FileUtils.resolveFile( currentTestWorkDirectory, getMojo().getDefaultTemplateFilename() ).exists() ); } /** * Testing conditions: * <ul> * <li>Target file already exists</li> * <li>No template defined</li> * <li>merge-type set to <strong>none</strong></li> * </ul> * Expected situation: * <ul> * <li>Target file is copied to the baseDirectory</li> * </ul> * * @throws Exception */ public void testDefaultTargetNoTemplateMergeNONE() throws Exception { // prepare File currentTestWorkDirectory = new File( getWorkDirectory(), getTestPrefix() + "-defTrgtNoTmpltNone" ); prepareDirectoryStructure( getDirectoryDefaultTargetFile(), currentTestWorkDirectory ); prepareMojo( currentTestWorkDirectory ); setVariableValueToObject( getMojo(), PROPERTY_MERGE, "none" ); assertTrue( getTargetFile().exists() ); assertFalse( FileUtils.resolveFile( currentTestWorkDirectory, getMojo().getDefaultTemplateFilename() ).exists() ); // execute the mojo try { getMojo().execute(); fail( "Mergetype was set while there's no template available." ); } catch ( MojoFailureException mfe ) { } } /** * Testing conditions: * <ul> * <li>Target file already exists</li> * <li>No template defined or available in baseDirectory</li> * <li>Merge-type set to <strong>overwrite</strong></li> * </ul> * Expected situation: * <ul> * <li>Exception: merge was set, but there's no template</li> * </ul> * * @throws Exception */ public void testDefaultTargetNoTemplateMergeOVERWRITE() throws Exception { // prepare File currentTestWorkDirectory = new File( getWorkDirectory(), getTestPrefix() + "-noTmpltDefTrgtOverwrite" ); prepareDirectoryStructure( getDirectoryDefaultTargetFile(), currentTestWorkDirectory ); prepareMojo( currentTestWorkDirectory ); setVariableValueToObject( getMojo(), PROPERTY_MERGE, "overwrite" ); assertTrue( getTargetFile().exists() ); assertFalse( FileUtils.resolveFile( currentTestWorkDirectory, getMojo().getDefaultTemplateFilename() ).exists() ); // execute the mojo try { getMojo().execute(); fail( "Mergetype was set while there's no template available." ); } catch ( MojoFailureException mfe ) { } } /** * Testing conditions: * <ul> * <li>Target file already exists</li> * <li>No template defined or available in baseDirectory</li> * <li>Merge-type set to <strong>overwrite</strong></li> * </ul> * Expected situation: * <ul> * <li>Exception: merge was set, but there's no template</li> * </ul> * * @throws Exception */ public void testDefaultTargetNoTemplateMergeEXPAND() throws Exception { // prepare File currentTestWorkDirectory = new File( getWorkDirectory(), getTestPrefix() + "-defTrgtNoTmpltExpand" ); prepareDirectoryStructure( getDirectoryDefaultTargetFile(), currentTestWorkDirectory ); prepareMojo( currentTestWorkDirectory ); setVariableValueToObject( getMojo(), PROPERTY_MERGE, "expand" ); assertTrue( getTargetFile().exists() ); assertFalse( FileUtils.resolveFile( currentTestWorkDirectory, getMojo().getDefaultTemplateFilename() ).exists() ); // execute the mojo try { getMojo().execute(); fail( "Mergetype was set while there's no template available." ); } catch ( MojoFailureException mfe ) { } } /** * Testing conditions: * <ul> * <li>Target file already exists</li> * <li>No template defined or available in baseDirectory</li> * <li>Merge-type set to <strong>update</strong></li> * </ul> * Expected situation: * <ul> * <li>Exception: merge was set, but there's no template</li> * </ul> * * @throws Exception */ public void testDefaultTargetNoTemplateMergeUPDATE() throws Exception { // prepare File currentTestWorkDirectory = new File( getWorkDirectory(), getTestPrefix() + "-DefTrgtNoTmpltUpdate" ); prepareDirectoryStructure( getDirectoryDefaultTargetFile(), currentTestWorkDirectory ); prepareMojo( currentTestWorkDirectory ); setVariableValueToObject( getMojo(), PROPERTY_MERGE, "update" ); assertTrue( getTargetFile().exists() ); assertFalse( FileUtils.resolveFile( currentTestWorkDirectory, getMojo().getDefaultTemplateFilename() ).exists() ); // execute the mojo try { getMojo().execute(); fail( "Mergetype was set while there's no template available." ); } catch ( MojoFailureException mfe ) { } } /** * Test to see if a template will be filtered with the values of the property file * * @throws Exception */ public void testPropertyFileFilter() throws Exception { // prepare File currentTestWorkDirectory = new File( getWorkDirectory(), getTestPrefix() + "-filter" ); prepareDirectoryStructure( getDirectoryMissingTargetFile(), currentTestWorkDirectory ); prepareMojo( currentTestWorkDirectory ); setVariableValueToObject( getMojo(), PROPERTY_SETTINGSFILE, getPropertyFileFilteredTemplateFileArgument() ); File sourceFile = new File( "src/test/resources/basefolder", getPropertyFileFilteredTemplateFileArgument() ); FileUtils.copyFileToDirectory( sourceFile, currentTestWorkDirectory ); File propertyFile = new File( "src/test/resources/basefolder", getPropertiesFilename() ); FileUtils.copyFileToDirectory( propertyFile, currentTestWorkDirectory ); getMojo().execute(); validateAsFilteredTemplate(); } /** * Testing conditions: * <ul> * <li>Target file already exists</li> * <li>The default template is available in baseDirectory</li> * <li>No merge-type defined</li> * </ul> * Expected situation: * <ul> * <li>Target file is copied to the baseDirectory</li> * </ul> * * @throws Exception */ public void testDefaultTargetDefaultTemplateNoMerge() throws Exception { // prepare File currentTestWorkDirectory = new File( getWorkDirectory(), getTestPrefix() + "-defTrgtDefTmpltNoMrg" ); prepareDirectoryStructure( getDirectoryDefaultTargetFile(), currentTestWorkDirectory ); prepareMojo( currentTestWorkDirectory ); File targetFile = getTargetFile(); assertTrue( targetFile.getAbsolutePath() + " should not exist, but does", targetFile.exists() ); assertFalse( FileUtils.resolveFile( currentTestWorkDirectory, getMojo().getDefaultTemplateFilename() ).exists() ); // execute the mojo getMojo().execute(); validateAsDefaultSettings(); } public void testDefaultTargetDefaultTemplateMergeNONE() throws Exception { // prepare File currentTestWorkDirectory = new File( getWorkDirectory(), getTestPrefix() + "-defTmpltDefTrgtNone" ); prepareDirectoryStructure( getDirectoryDefaultTargetFile(), currentTestWorkDirectory ); prepareMojo( currentTestWorkDirectory ); setVariableValueToObject( getMojo(), PROPERTY_MERGE, "none" ); File sourceFile = new File( "src/test/resources/basefolder", getMojo().getDefaultTemplateFilename() ); FileUtils.copyFileToDirectory( sourceFile, currentTestWorkDirectory ); getMojo().execute(); validateAsDefaultSettings(); } public void testDefaultTargetDefaultTemplateMergeOVERWRITE() throws Exception { // prepare File currentTestWorkDirectory = new File( getWorkDirectory(), getTestPrefix() + "-defTmpltDefTrgtOverwrite" ); prepareDirectoryStructure( getDirectoryDefaultTargetFile(), currentTestWorkDirectory ); prepareMojo( currentTestWorkDirectory ); setVariableValueToObject( getMojo(), PROPERTY_MERGE, "overwrite" ); File sourceFile = new File( "src/test/resources/basefolder", getMojo().getDefaultTemplateFilename() ); FileUtils.copyFileToDirectory( sourceFile, currentTestWorkDirectory ); getMojo().execute(); validateAsDefaultTemplate(); } public void testDefaultTargetDefaultTemplateMergeEXPAND() throws Exception { // prepare File currentTestWorkDirectory = new File( getWorkDirectory(), getTestPrefix() + "-defTmpltDefTrgtExpand" ); prepareDirectoryStructure( getDirectoryDefaultTargetFile(), currentTestWorkDirectory ); prepareMojo( currentTestWorkDirectory ); setVariableValueToObject( getMojo(), PROPERTY_MERGE, "expand" ); File sourceFile = new File( "src/test/resources/basefolder", getMojo().getDefaultTemplateFilename() ); FileUtils.copyFileToDirectory( sourceFile, currentTestWorkDirectory ); getMojo().execute(); validateAsDefaultSettings(); ; } public void testDefaultTargetDefaultTemplateMergeUPDATE() throws Exception { // prepare File currentTestWorkDirectory = new File( getWorkDirectory(), getTestPrefix() + "-defTmpltDefTrgtUpdate" ); prepareDirectoryStructure( getDirectoryDefaultTargetFile(), currentTestWorkDirectory ); prepareMojo( currentTestWorkDirectory ); setVariableValueToObject( getMojo(), PROPERTY_MERGE, "update" ); File sourceFile = new File( "src/test/resources/basefolder", getMojo().getDefaultTemplateFilename() ); FileUtils.copyFileToDirectory( sourceFile, currentTestWorkDirectory ); getMojo().execute(); validateAsDefaultTemplate(); } public void testMinimumTargetDefaultTemplateMergeNONE() throws Exception { // prepare File currentTestWorkDirectory = new File( getWorkDirectory(), getTestPrefix() + "-defTmpltMinTrgtNone" ); prepareDirectoryStructure( getDirectoryMinimumTargetFile(), currentTestWorkDirectory ); prepareMojo( currentTestWorkDirectory ); setVariableValueToObject( getMojo(), PROPERTY_MERGE, "none" ); File sourceFile = new File( "src/test/resources/basefolder", getMojo().getDefaultTemplateFilename() ); FileUtils.copyFileToDirectory( sourceFile, currentTestWorkDirectory ); getMojo().execute(); validateAsMinimumTemplate(); } public void testMinimumTargetDefaultTemplateMergeOVERWRITE() throws Exception { // prepare File currentTestWorkDirectory = new File( getWorkDirectory(), getTestPrefix() + "-defTmpltMinTrgtOverwrite" ); prepareDirectoryStructure( getDirectoryMinimumTargetFile(), currentTestWorkDirectory ); prepareMojo( currentTestWorkDirectory ); setVariableValueToObject( getMojo(), PROPERTY_MERGE, "overwrite" ); File sourceFile = new File( "src/test/resources/basefolder", getMojo().getDefaultTemplateFilename() ); FileUtils.copyFileToDirectory( sourceFile, currentTestWorkDirectory ); getMojo().execute(); validateAsDefaultTemplate(); } public void testMinimumTargetDefaultTemplateMergeEXPAND() throws Exception { // prepare File currentTestWorkDirectory = new File( getWorkDirectory(), getTestPrefix() + "-defTmpltMinTrgtExpand" ); prepareDirectoryStructure( getDirectoryMinimumTargetFile(), currentTestWorkDirectory ); prepareMojo( currentTestWorkDirectory ); setVariableValueToObject( getMojo(), PROPERTY_MERGE, "expand" ); File sourceFile = new File( "src/test/resources/basefolder", getMojo().getDefaultTemplateFilename() ); FileUtils.copyFileToDirectory( sourceFile, currentTestWorkDirectory ); getMojo().execute(); validateAsMinimalTargetExpandedWithDefaultTemplate(); } public void testMinimumTargetDefaultTemplateMergeUPDATE() throws Exception { // prepare File currentTestWorkDirectory = new File( getWorkDirectory(), getTestPrefix() + "-defTmpltMinTrgtUpdate" ); prepareDirectoryStructure( getDirectoryMinimumTargetFile(), currentTestWorkDirectory ); prepareMojo( currentTestWorkDirectory ); setVariableValueToObject( getMojo(), PROPERTY_MERGE, "update" ); File sourceFile = new File( "src/test/resources/basefolder", getMojo().getDefaultTemplateFilename() ); FileUtils.copyFileToDirectory( sourceFile, currentTestWorkDirectory ); getMojo().execute(); validateAsMinimalTargetUpdatedWithDefaultTemplate(); } public void testFromBaseDir() throws Exception { File currentTestWorkDirectory = new File( getWorkDirectory(), getTestPrefix() + "-fromBaseDir" ); prepareDirectoryStructure( getDirectoryMissingTargetFile(), currentTestWorkDirectory ); prepareMojo( currentTestWorkDirectory ); File sourceFile = new File( "src/test/resources/basefolder", getMojo().getDefaultTemplateFilename() ); FileUtils.copyFileToDirectory( sourceFile, currentTestWorkDirectory ); getMojo().execute(); File newSettingsFile = getTargetFile(); assertTrue( newSettingsFile.getAbsolutePath() + " doesn't exist", newSettingsFile.exists() ); assertEquals( sourceFile.length(), newSettingsFile.length() ); validateAsDefaultTemplate(); } public void testFromParameterRelative() throws Exception { File currentTestWorkDirectory = new File( getWorkDirectory(), getTestPrefix() + "-fromParameterRelative" ); prepareDirectoryStructure( getDirectoryMissingTargetFile(), currentTestWorkDirectory ); prepareMojo( currentTestWorkDirectory ); setVariableValueToObject( getMojo(), PROPERTY_SETTINGSFILE, getCustomTemplateFileArgument() ); File sourceFile = new File( "src/test/resources/basefolder", getCustomTemplateFileArgument() ); FileUtils.copyFileToDirectory( sourceFile, currentTestWorkDirectory ); getMojo().execute(); File newSettingsFile = getTargetFile(); assertEquals( true, newSettingsFile.exists() ); assertEquals( sourceFile.length(), newSettingsFile.length() ); validateAsCustomTemplate(); } public void testFromParameterAbsolute() throws Exception { File currentTestWorkDirectory = new File( getWorkDirectory(), getTestPrefix() + "-fromParameterAbsolute" ); prepareDirectoryStructure( getDirectoryMissingTargetFile(), currentTestWorkDirectory ); prepareMojo( currentTestWorkDirectory ); setVariableValueToObject( getMojo(), PROPERTY_SETTINGSFILE, FileUtils.resolveFile( currentTestWorkDirectory, getCustomTemplateFileArgument() ).getAbsolutePath() ); File sourceFile = new File( "src/test/resources/basefolder", getCustomTemplateFileArgument() ); FileUtils.copyFileToDirectory( sourceFile, currentTestWorkDirectory ); getMojo().execute(); File newSettingsFile = getTargetFile(); assertTrue( newSettingsFile.getAbsolutePath() + " doens't exist", newSettingsFile.exists() ); assertEquals( sourceFile.length(), newSettingsFile.length() ); validateAsCustomTemplate(); } public void testFromUrl() throws Exception { File currentTestWorkDirectory = new File( getWorkDirectory(), getTestPrefix() + "-fromUrl" ); prepareDirectoryStructure( getDirectoryMissingTargetFile(), currentTestWorkDirectory ); prepareMojo( currentTestWorkDirectory ); setVariableValueToObject( getMojo(), PROPERTY_SETTINGSFILE, FileUtils.resolveFile( currentTestWorkDirectory, getCustomTemplateFileArgument() ).toURI().toURL().toExternalForm() ); File sourceFile = new File( "src/test/resources/basefolder", getCustomTemplateFileArgument() ); FileUtils.copyFileToDirectory( sourceFile, currentTestWorkDirectory ); getMojo().execute(); File newSettingsFile = getTargetFile(); assertTrue( newSettingsFile.getAbsolutePath() + " doesn't exist", newSettingsFile.exists() ); assertEquals( sourceFile.length(), newSettingsFile.length() ); validateAsCustomTemplate(); } public void testTemplateDefaultSettings() throws Exception { File currentTestWorkDirectory = new File( getWorkDirectory(), getTestPrefix() + "-templateDefaultSettings" ); prepareDirectoryStructure( getDirectoryDefaultTargetFile(), currentTestWorkDirectory ); prepareMojo( currentTestWorkDirectory ); setVariableValueToObject( getMojo(), PROPERTY_SETTINGSFILE, getCustomTemplateFileArgument() ); File sourceFile = new File( "src/test/resources/basefolder", getCustomTemplateFileArgument() ); FileUtils.copyFileToDirectory( sourceFile, currentTestWorkDirectory ); try { getMojo().execute(); fail( "mergetype is required, targetfile already exists" ); } catch ( MojoExecutionException mee ) { // mergetype required } catch ( MojoFailureException mfe ) { // mergetype required } } protected abstract void validateAsDefaultTemplate() throws Exception; protected abstract void validateAsCustomTemplate() throws Exception; protected abstract void validateAsFilteredTemplate() throws Exception; protected void validateAsMinimumTemplate() throws Exception { validateAsNoSettings(); } protected void validateAsMinimalTargetExpandedWithDefaultTemplate() throws Exception { validateAsDefaultTemplate(); } protected void validateAsMinimalTargetUpdatedWithDefaultTemplate() throws Exception { validateAsDefaultTemplate(); } protected abstract void validateAsDefaultSettings() throws Exception; protected abstract void validateAsNoSettings() throws Exception; }