package org.codehaus.mojo.setup.settings; import java.io.File; import java.io.FileInputStream; import java.util.Properties; import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.settings.Profile; import org.apache.maven.settings.Settings; import org.apache.maven.settings.io.DefaultSettingsReader; import org.apache.maven.settings.io.SettingsReader; import org.apache.maven.settings.io.xpp3.SettingsXpp3Reader; import org.codehaus.mojo.setup.AbstractSetupMojo; import org.codehaus.mojo.setup.AbstractSetupMojoTest; import org.codehaus.plexus.util.FileUtils; import org.sonatype.plexus.components.sec.dispatcher.DefaultSecDispatcher; public abstract class AbstractSettingsSetupMojoTest extends AbstractSetupMojoTest { private static final String TEST_RESOURCE_BASEFOLDER = "src/test/resources/basefolder"; private static final String SETTINGS_TEMPLATE = "templateFilename"; public static final String PARAMETER_MERGE = "merge"; protected abstract AbstractSetupMojo getMojo(); protected abstract String getSettingsPathVariableName(); protected abstract String getPropertyValueSuffix(); @Override protected String getTemplateBase() { return "settings"; } @Override protected void prepareMojo( File workDirectory ) throws Exception { super.prepareMojo( workDirectory ); FileUtils.copyDirectoryStructure( getTestFile( "src/test/resources/encryptableUserHome" ), workDirectory ); MavenSession session = (MavenSession) getVariableValueFromObject( getMojo(), "session" ); Properties properties = new Properties(); properties.put( DefaultSecDispatcher.SYSTEM_PROPERTY_SEC_LOCATION, FileUtils.resolveFile( workDirectory, ".m2/settings-security.xml" ).getAbsolutePath() ); session.getRequest().setUserProperties( properties ); } public void testFilterSystemProperties() throws Exception { File currentTestWorkDirectory = new File( getWorkDirectory(), getTestPrefix() + "-filterSystemProperties" ); prepareDirectoryStructure( getDirectoryMissingTargetFile(), currentTestWorkDirectory ); File sourceFile = new File( TEST_RESOURCE_BASEFOLDER, getPropertyFileFilteredTemplateFileArgument() ); FileUtils.copyFileToDirectory( sourceFile, currentTestWorkDirectory ); prepareMojo( currentTestWorkDirectory ); setVariableValueToObject( getMojo(), SETTINGS_TEMPLATE, getPropertyFileFilteredTemplateFileArgument() ); getMojo().execute(); SettingsXpp3Reader reader = new SettingsXpp3Reader(); Settings mergedSettings = reader.read( new FileInputStream( getTargetFile() ) ); assertEquals( System.getProperty( "user.name" ) + "-dev", ( (Profile) mergedSettings.getProfiles().get( 0 ) ).getId() ); } public void testEncryptPasswordsDefaultTemplate() throws Exception { File currentTestWorkDirectory = new File( getWorkDirectory(), getTestPrefix() + "-encryptPasswordsDefaultTemplate" ); prepareDirectoryStructure( getDirectoryDefaultTargetFile(), currentTestWorkDirectory ); File sourceFile = new File( TEST_RESOURCE_BASEFOLDER, getDefaultTemplateFilename() ); FileUtils.copyFileToDirectory( sourceFile, currentTestWorkDirectory ); prepareMojo( currentTestWorkDirectory ); setVariableValueToObject( getMojo(), "encryptPasswords", Boolean.TRUE ); setVariableValueToObject( getMojo(), "merge", "overwrite" ); getMojo().execute(); SettingsXpp3Reader reader = new SettingsXpp3Reader(); Settings mergedSettings = reader.read( new FileInputStream( getTargetFile() ) ); assertEquals( "dt_username_defaultTemplate", mergedSettings.getServer( "dt" ).getUsername() ); assertFalse( "dt_password_defaultTemplate".equals( mergedSettings.getServer( "dt" ).getPassword() ) ); } public void testInvalidPassword() throws Exception { File currentTestWorkDirectory = new File( getWorkDirectory(), getTestPrefix() + "-invalidPassword" ); prepareDirectoryStructure( getDirectoryDefaultTargetFile(), currentTestWorkDirectory ); String invalidSettingsFileArgument = "settings-invalid.xml"; File sourceFile = new File( TEST_RESOURCE_BASEFOLDER, invalidSettingsFileArgument ); FileUtils.copyFileToDirectory( sourceFile, currentTestWorkDirectory ); prepareMojo( currentTestWorkDirectory ); setVariableValueToObject( getMojo(), SETTINGS_TEMPLATE, invalidSettingsFileArgument ); setVariableValueToObject( getMojo(), "encryptPasswords", Boolean.TRUE ); setVariableValueToObject( getMojo(), "merge", "overwrite" ); try { getMojo().execute(); fail( "Test should fail, because settingsfile contains an unencryptable password." ); } catch ( MojoFailureException mfe ) { // nop } } public void testEncryptEncryptedPassword() throws Exception { File currentTestWorkDirectory = new File( getWorkDirectory(), getTestPrefix() + "-entryptEncryptedPassword" ); prepareDirectoryStructure( getDirectoryDefaultTargetFile(), currentTestWorkDirectory ); String encryptedSettingsFileArgument = "settings-encrypted.xml"; File sourceFile = new File( TEST_RESOURCE_BASEFOLDER, encryptedSettingsFileArgument ); FileUtils.copyFileToDirectory( sourceFile, currentTestWorkDirectory ); prepareMojo( currentTestWorkDirectory ); setVariableValueToObject( getMojo(), SETTINGS_TEMPLATE, encryptedSettingsFileArgument ); setVariableValueToObject( getMojo(), "encryptPasswords", Boolean.TRUE ); setVariableValueToObject( getMojo(), "merge", "overwrite" ); getMojo().execute(); SettingsXpp3Reader reader = new SettingsXpp3Reader(); Settings mergedSettings = reader.read( new FileInputStream( getTargetFile() ) ); assertEquals( "dt_username_defaultTemplate", mergedSettings.getServer( "dt" ).getUsername() ); assertEquals( "{OxhDEWjvOzsHR3km+NFZXMIR/S2Qucv1WbcRjstHviPZ45uvrJ1l3Jd80EhLBs9q}", mergedSettings.getServer( "dt" ).getPassword() ); } @Override protected void validateAsDefaultTemplate() throws Exception { SettingsXpp3Reader reader = new SettingsXpp3Reader(); Settings settings = reader.read( new FileInputStream( getTargetFile() ) ); assertEquals( "localRepository_defaultTemplate", settings.getLocalRepository() ); assertEquals( false, settings.isInteractiveMode() ); assertEquals( true, settings.isOffline() ); assertEquals( true, settings.isUsePluginRegistry() ); } @Override protected void validateAsCustomTemplate() throws Exception { SettingsXpp3Reader reader = new SettingsXpp3Reader(); Settings settings = reader.read( new FileInputStream( getTargetFile() ) ); assertEquals( "localRepository_customTemplate", settings.getLocalRepository() ); assertEquals( false, settings.isInteractiveMode() ); assertEquals( true, settings.isOffline() ); assertEquals( true, settings.isUsePluginRegistry() ); } @Override protected void validateAsFilteredTemplate() throws Exception { SettingsReader reader = new DefaultSettingsReader(); Settings settings = reader.read( getTargetFile(), null ); assertEquals( "localRepository_filteredTemplate", settings.getLocalRepository() ); assertEquals( false, settings.isInteractiveMode() ); assertEquals( true, settings.isOffline() ); assertEquals( true, settings.isUsePluginRegistry() ); } @Override protected void validateAsNoSettings() throws Exception { assertEquals( false, getTargetFile().exists() ); } @Override protected void validateAsMinimumTemplate() throws Exception { SettingsReader reader = new DefaultSettingsReader(); Settings settings = reader.read( getTargetFile(), null ); assertEquals( null, settings.getLocalRepository() ); assertEquals( true, settings.isInteractiveMode() ); assertEquals( false, settings.isOffline() ); assertEquals( false, settings.isUsePluginRegistry() ); } /** * The {@link org.apache.maven.settings.SettingsUtils#merge(Settings, Settings, String)} * ignores boolean values from the recessive settings */ @Override protected void validateAsMinimalTargetExpandedWithDefaultTemplate() throws Exception { SettingsReader reader = new DefaultSettingsReader(); Settings settings = reader.read( getTargetFile(), null ); assertEquals( "localRepository_defaultTemplate", settings.getLocalRepository() ); assertEquals( true, settings.isInteractiveMode() ); assertEquals( false, settings.isOffline() ); assertEquals( false, settings.isUsePluginRegistry() ); } }