blob: 1a41152b19ae07801d4c0f42f387729fe36a8d22 [file] [log] [blame]
package org.apache.maven.shared.filtering;
/*
* 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 java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Properties;
import org.codehaus.plexus.PlexusTestCase;
import org.codehaus.plexus.logging.Logger;
/**
* @author Olivier Lamy
* @since 1.0-beta-1
* @version $Id$
*/
public class PropertyUtilsTest
extends PlexusTestCase
{
private static File testDirectory = new File( getBasedir(), "target/test-classes/" );
public void testBasic()
throws Exception
{
File basicProp = new File( testDirectory, "basic.properties" );
if ( basicProp.exists() )
{
basicProp.delete();
}
basicProp.createNewFile();
try ( FileWriter writer = new FileWriter( basicProp ) )
{
writer.write( "ghost=${non_existent}\n" );
writer.write( "key=${untat_na_damgo}\n" );
writer.write( "untat_na_damgo=gani_man\n" );
writer.flush();
}
Properties prop = PropertyUtils.loadPropertyFile( basicProp, false, false );
assertTrue( prop.getProperty( "key" ).equals( "gani_man" ) );
assertTrue( prop.getProperty( "ghost" ).equals( "${non_existent}" ) );
}
public void testSystemProperties()
throws Exception
{
File systemProp = new File( testDirectory, "system.properties" );
if ( systemProp.exists() )
{
systemProp.delete();
}
systemProp.createNewFile();
try ( FileWriter writer = new FileWriter( systemProp ) )
{
writer.write( "key=${user.dir}" );
writer.flush();
}
Properties prop = PropertyUtils.loadPropertyFile( systemProp, false, true );
assertTrue( prop.getProperty( "key" ).equals( System.getProperty( "user.dir" ) ) );
}
public void testException()
throws Exception
{
File nonExistent = new File( testDirectory, "not_existent_file" );
assertFalse( "property file exist: " + nonExistent.toString(), nonExistent.exists() );
try
{
PropertyUtils.loadPropertyFile( nonExistent, true, false );
assertTrue( "Exception failed", false );
}
catch ( Exception ex )
{
// exception ok
}
}
public void testloadpropertiesFile()
throws Exception
{
File propertyFile = new File( getBasedir() + "/src/test/units-files/propertyutils-test.properties" );
Properties baseProps = new Properties();
baseProps.put( "pom.version", "realVersion" );
Properties interpolated = PropertyUtils.loadPropertyFile( propertyFile, baseProps );
assertEquals( "realVersion", interpolated.get( "version" ) );
assertEquals( "${foo}", interpolated.get( "foo" ) );
assertEquals( "realVersion", interpolated.get( "bar" ) );
assertEquals( "none filtered", interpolated.get( "none" ) );
}
/**
* Test case to reproduce MSHARED-417
*
* @throws IOException if problem writing file
*/
public void testCircularReferences()
throws IOException
{
File basicProp = new File( testDirectory, "circular.properties" );
if ( basicProp.exists() )
{
basicProp.delete();
}
basicProp.createNewFile();
try( FileWriter writer = new FileWriter( basicProp ) )
{
writer.write( "test=${test2}\n" );
writer.write( "test2=${test2}\n" );
writer.flush();
}
MockLogger logger = new MockLogger();
Properties prop = PropertyUtils.loadPropertyFile( basicProp, null, logger );
assertEquals( "${test2}", prop.getProperty( "test" ) );
assertEquals( "${test2}", prop.getProperty( "test2" ) );
assertEquals( 2, logger.warnMsgs.size() );
assertWarn( "Circular reference between properties detected: test2 => test2", logger );
assertWarn( "Circular reference between properties detected: test => test2 => test2", logger );
}
/**
* Test case to reproduce MSHARED-417
*
* @throws IOException if problem writing file
*/
public void testCircularReferences3Vars()
throws IOException
{
File basicProp = new File( testDirectory, "circular.properties" );
if ( basicProp.exists() )
{
basicProp.delete();
}
basicProp.createNewFile();
try ( FileWriter writer = new FileWriter( basicProp ) )
{
writer.write( "test=${test2}\n" );
writer.write( "test2=${test3}\n" );
writer.write( "test3=${test}\n" );
writer.flush();
}
MockLogger logger = new MockLogger();
Properties prop = PropertyUtils.loadPropertyFile( basicProp, null, logger );
assertEquals( "${test2}", prop.getProperty( "test" ) );
assertEquals( "${test3}", prop.getProperty( "test2" ) );
assertEquals( "${test}", prop.getProperty( "test3" ) );
assertEquals( 3, logger.warnMsgs.size() );
assertWarn( "Circular reference between properties detected: test3 => test => test2 => test3", logger );
assertWarn( "Circular reference between properties detected: test2 => test3 => test => test2", logger );
assertWarn( "Circular reference between properties detected: test => test2 => test3 => test", logger );
}
private void assertWarn( String expected, MockLogger logger )
{
assertTrue( logger.warnMsgs.contains( expected ) );
}
private static class MockLogger
implements Logger
{
ArrayList<String> warnMsgs = new ArrayList<>();
@Override
public void debug( String message )
{
// nothing
}
@Override
public void debug( String message, Throwable throwable )
{
// nothing
}
@Override
public boolean isDebugEnabled()
{
return false;
}
@Override
public void info( String message )
{
// nothing
}
@Override
public void info( String message, Throwable throwable )
{
// nothing
}
@Override
public boolean isInfoEnabled()
{
return false;
}
@Override
public void warn( String message )
{
warnMsgs.add( message );
}
@Override
public void warn( String message, Throwable throwable )
{
// nothing
}
@Override
public boolean isWarnEnabled()
{
return false;
}
@Override
public void error( String message )
{
// nothing
}
@Override
public void error( String message, Throwable throwable )
{
// nothing
}
@Override
public boolean isErrorEnabled()
{
return false;
}
@Override
public void fatalError( String message )
{
// nothing
}
@Override
public void fatalError( String message, Throwable throwable )
{
// nothing
}
@Override
public boolean isFatalErrorEnabled()
{
return false;
}
@Override
public int getThreshold()
{
return 0;
}
@Override
public void setThreshold( int threshold )
{
// nothing
}
@Override
public Logger getChildLogger( String name )
{
return null;
}
@Override
public String getName()
{
return null;
}
}
}