blob: 92acf6a388a44d27a04a7029811021d280c414b9 [file] [log] [blame]
/**
* 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.
*/
#include "PropertiesTest.h"
#include <memory>
#include <decaf/util/Properties.h>
#include <decaf/io/ByteArrayInputStream.h>
#include <decaf/io/ByteArrayOutputStream.h>
using namespace std;
using namespace decaf;
using namespace decaf::util;
using namespace decaf::io;
////////////////////////////////////////////////////////////////////////////////
void PropertiesTest::setUp() {
this->testProperties.setProperty( "test.prop", "this is a test property" );
this->testProperties.setProperty( "bogus.prop", "bogus" );
}
////////////////////////////////////////////////////////////////////////////////
void PropertiesTest::tearDown() {
}
////////////////////////////////////////////////////////////////////////////////
void PropertiesTest::testPutAndGet() {
Properties properties;
CPPUNIT_ASSERT( properties.isEmpty() == true );
CPPUNIT_ASSERT( properties.getProperty( "Bob" ) == NULL );
CPPUNIT_ASSERT( properties.getProperty( "Bob", "Steve" ) == "Steve" );
CPPUNIT_ASSERT( properties.size() == 0 );
properties.setProperty( "Bob", "Foo" );
CPPUNIT_ASSERT( properties.isEmpty() == false );
CPPUNIT_ASSERT( properties.hasProperty( "Steve" ) == false );
properties.setProperty( "Steve", "Foo" );
CPPUNIT_ASSERT( properties.hasProperty( "Steve" ) == true );
CPPUNIT_ASSERT( properties.size() == 2 );
CPPUNIT_ASSERT( properties.getProperty( "Bob" ) == std::string( "Foo" ) );
CPPUNIT_ASSERT( properties.getProperty( "Bob", "Steve" ) == "Foo" );
}
////////////////////////////////////////////////////////////////////////////////
void PropertiesTest::testAssign() {
Properties properties1;
Properties properties2;
properties1.setProperty( "A", "A" );
properties1.setProperty( "B", "B" );
properties1.setProperty( "C", "C" );
properties1.setProperty( "D", "D" );
CPPUNIT_ASSERT( properties2.hasProperty( "A" ) == false );
CPPUNIT_ASSERT( properties2.hasProperty( "B" ) == false );
CPPUNIT_ASSERT( properties2.hasProperty( "C" ) == false );
CPPUNIT_ASSERT( properties2.hasProperty( "D" ) == false );
properties2 = properties1;
CPPUNIT_ASSERT( properties2.hasProperty( "A" ) == true );
CPPUNIT_ASSERT( properties2.hasProperty( "B" ) == true );
CPPUNIT_ASSERT( properties2.hasProperty( "C" ) == true );
CPPUNIT_ASSERT( properties2.hasProperty( "D" ) == true );
CPPUNIT_ASSERT( properties1.size() == properties2.size() );
}
////////////////////////////////////////////////////////////////////////////////
void PropertiesTest::testCopy() {
Properties properties1;
Properties properties2;
properties1.setProperty( "A", "A" );
properties1.setProperty( "B", "B" );
properties1.setProperty( "C", "C" );
properties1.setProperty( "D", "D" );
CPPUNIT_ASSERT( properties2.hasProperty( "A" ) == false );
CPPUNIT_ASSERT( properties2.hasProperty( "B" ) == false );
CPPUNIT_ASSERT( properties2.hasProperty( "C" ) == false );
CPPUNIT_ASSERT( properties2.hasProperty( "D" ) == false );
properties2.copy( properties1 );
CPPUNIT_ASSERT( properties2.hasProperty( "A" ) == true );
CPPUNIT_ASSERT( properties2.hasProperty( "B" ) == true );
CPPUNIT_ASSERT( properties2.hasProperty( "C" ) == true );
CPPUNIT_ASSERT( properties2.hasProperty( "D" ) == true );
CPPUNIT_ASSERT( properties1.size() == properties2.size() );
}
////////////////////////////////////////////////////////////////////////////////
void PropertiesTest::testClone() {
Properties properties1;
std::auto_ptr<Properties> properties2;
properties1.setProperty( "A", "A" );
properties1.setProperty( "B", "B" );
properties1.setProperty( "C", "C" );
properties1.setProperty( "D", "D" );
properties2.reset( properties1.clone() );
CPPUNIT_ASSERT( properties2->hasProperty( "A" ) == true );
CPPUNIT_ASSERT( properties2->hasProperty( "B" ) == true );
CPPUNIT_ASSERT( properties2->hasProperty( "C" ) == true );
CPPUNIT_ASSERT( properties2->hasProperty( "D" ) == true );
CPPUNIT_ASSERT( properties1.size() == properties2->size() );
}
////////////////////////////////////////////////////////////////////////////////
void PropertiesTest::testRemove() {
Properties properties1;
properties1.setProperty( "A", "A" );
properties1.setProperty( "B", "B" );
properties1.setProperty( "C", "C" );
properties1.setProperty( "D", "D" );
properties1.remove( "A" );
properties1.remove( "C" );
CPPUNIT_ASSERT( properties1.hasProperty( "A" ) == false );
CPPUNIT_ASSERT( properties1.hasProperty( "B" ) == true );
CPPUNIT_ASSERT( properties1.hasProperty( "C" ) == false );
CPPUNIT_ASSERT( properties1.hasProperty( "D" ) == true );
CPPUNIT_ASSERT( properties1.size() == 2 );
}
////////////////////////////////////////////////////////////////////////////////
void PropertiesTest::testClear() {
Properties properties1;
properties1.setProperty( "A", "A" );
properties1.setProperty( "B", "B" );
properties1.setProperty( "C", "C" );
properties1.setProperty( "D", "D" );
CPPUNIT_ASSERT( properties1.size() == 4 );
CPPUNIT_ASSERT( properties1.isEmpty() == false );
properties1.clear();
CPPUNIT_ASSERT( properties1.size() == 0 );
CPPUNIT_ASSERT( properties1.isEmpty() == true );
}
////////////////////////////////////////////////////////////////////////////////
void PropertiesTest::testEquals() {
Properties properties1;
Properties properties2;
properties1.setProperty( "A", "A" );
properties1.setProperty( "B", "B" );
properties1.setProperty( "C", "C" );
properties1.setProperty( "D", "D" );
CPPUNIT_ASSERT( properties2.hasProperty( "A" ) == false );
CPPUNIT_ASSERT( properties2.hasProperty( "B" ) == false );
CPPUNIT_ASSERT( properties2.hasProperty( "C" ) == false );
CPPUNIT_ASSERT( properties2.hasProperty( "D" ) == false );
CPPUNIT_ASSERT( !properties2.equals( properties1 ) );
properties2.copy( properties1 );
CPPUNIT_ASSERT( properties2.hasProperty( "A" ) == true );
CPPUNIT_ASSERT( properties2.hasProperty( "B" ) == true );
CPPUNIT_ASSERT( properties2.hasProperty( "C" ) == true );
CPPUNIT_ASSERT( properties2.hasProperty( "D" ) == true );
CPPUNIT_ASSERT( properties2.equals( properties1 ) );
}
////////////////////////////////////////////////////////////////////////////////
void PropertiesTest::testLoadNPE() {
Properties properties;
decaf::io::InputStream* nullStream = NULL;
decaf::io::Reader* nullReader = NULL;
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should have thrown a NullPointerException",
properties.load( nullStream ),
decaf::lang::exceptions::NullPointerException );
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should have thrown a NullPointerException",
properties.load( nullReader ),
decaf::lang::exceptions::NullPointerException );
}
////////////////////////////////////////////////////////////////////////////////
void PropertiesTest::testLoadInputStream() {
{
Properties properties;
string value(" a= b");
ByteArrayInputStream stream( (const unsigned char*)value.c_str(), (int)value.size() );
properties.load( &stream );
CPPUNIT_ASSERT( string( "b" ) == properties.getProperty( "a" ) );
}
{
Properties properties;
string value(" a b");
ByteArrayInputStream stream( (const unsigned char*)value.c_str(), (int)value.size() );
properties.load( &stream );
CPPUNIT_ASSERT( string( "b" ) == properties.getProperty( "a" ) );
}
{
Properties properties;
string value("#comment\na=value");
ByteArrayInputStream stream( (const unsigned char*)value.c_str(), (int)value.size() );
properties.load( &stream );
CPPUNIT_ASSERT( string( "value" ) == properties.getProperty( "a" ) );
}
{
Properties properties;
string value("#properties file\r\nfred=1\r\n#last comment");
ByteArrayInputStream stream( (const unsigned char*)value.c_str(), (int)value.size() );
properties.load( &stream );
CPPUNIT_ASSERT( string( "1" ) == properties.getProperty( "fred" ) );
}
}
////////////////////////////////////////////////////////////////////////////////
void PropertiesTest::testPropertyNames() {
Properties myProps( this->testProperties );
std::vector<std::string> names = myProps.propertyNames();
std::vector<std::string>::const_iterator name = names.begin();
int i = 0;
CPPUNIT_ASSERT( names.size() == 2 );
for( ; name != names.end(); ++name, ++i ) {
CPPUNIT_ASSERT_MESSAGE( "Incorrect names returned",
*name == "test.prop" || *name == "bogus.prop" );
}
}
////////////////////////////////////////////////////////////////////////////////
void PropertiesTest::testPropertyNamesOverride() {
Properties props( this->testProperties );
props.setProperty( "test.prop", "anotherValue" );
props.setProperty( "3rdKey", "3rdValue" );
std::vector<string> set = props.propertyNames();
CPPUNIT_ASSERT( 3 == set.size() );
CPPUNIT_ASSERT( std::find( set.begin(), set.end(), "test.prop" ) != set.end() );
CPPUNIT_ASSERT( std::find( set.begin(), set.end(), "bogus.prop") != set.end() );
CPPUNIT_ASSERT( std::find( set.begin(), set.end(), "3rdKey" ) != set.end() );
}
////////////////////////////////////////////////////////////////////////////////
void PropertiesTest::testPropertyNamesScenario1() {
string keys[] = { "key1", "key2", "key3" };
string values[] = { "value1", "value2", "value3" };
std::set<string> keyList;
Properties properties;
for( int index = 0; index < 3; index++ ) {
properties.setProperty( keys[index], values[index] );
keyList.insert( keyList.begin(), keys[index] );
}
Properties properties2( properties );
std::vector<string> nameSet = properties.propertyNames();
CPPUNIT_ASSERT_EQUAL( 3, (int)nameSet.size() );
std::vector<string>::const_iterator iterator = nameSet.begin();
for( ; iterator != nameSet.end(); ++iterator ) {
CPPUNIT_ASSERT( keyList.find( *iterator ) != keyList.end() );
}
Properties properties3( properties2 );
nameSet = properties2.propertyNames();
CPPUNIT_ASSERT_EQUAL( 3, (int)nameSet.size() );
iterator = nameSet.begin();
for( ; iterator != nameSet.end(); ++iterator ) {
CPPUNIT_ASSERT( keyList.find( *iterator ) != keyList.end() );
}
}
////////////////////////////////////////////////////////////////////////////////
void PropertiesTest::testStoreOutputStream() {
Properties myProps;
Properties myProps2;
myProps.setProperty( "Property A", " aye\\\f\t\n\r" );
myProps.setProperty( "Property B", "b ee#!=:" );
myProps.setProperty( "Property C", "see" );
try {
ByteArrayOutputStream out;
myProps.store( &out, "A Header" );
out.close();
std::pair<const unsigned char*, int> array = out.toByteArray();
ByteArrayInputStream in( array.first, array.second, true );
myProps2.load( &in );
in.close();
} catch( IOException& ioe ) {
CPPUNIT_FAIL( string("IOException occurred reading/writing file : ") + ioe.getMessage() );
}
CPPUNIT_ASSERT( myProps.size() == myProps2.size() );
std::vector<string> nameSet = myProps.propertyNames();
std::vector<string>::const_iterator iterator = nameSet.begin();
for( ; iterator != nameSet.end(); ++iterator ) {
CPPUNIT_ASSERT( string( myProps2.getProperty( *iterator ) ) == string( myProps.getProperty( *iterator ) ) );
}
}