blob: 140e1267a6c5c1989e1e873fcd78aebf6850d108 [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.
*/
package org.apache.felix.cm.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Vector;
import junit.framework.TestCase;
public class CaseInsensitiveDictionaryTest extends TestCase
{
public void testLocaleIndependence() {
Locale defaultLocal = Locale.getDefault();
CaseInsensitiveDictionary dict = new CaseInsensitiveDictionary();
dict.put("illegal", "value1");
dict.put("ILLEGAL", "value2");
assertEquals(dict.get("illegal"), "value2");
assertEquals(dict.get("ILLEGAL"), "value2");
// validate "i" conversion with Turkish default locale
Locale.setDefault(new Locale("tr", "" ,""));
try {
dict = new CaseInsensitiveDictionary();
dict.put("illegal", "value1");
dict.put("ILLEGAL", "value2");
assertEquals(dict.get("illegal"), "value2");
assertEquals(dict.get("ILLEGAL"), "value2");
} finally {
Locale.setDefault(defaultLocal);
}
}
public void testCheckValueNull()
{
// null which must throw IllegalArgumentException
try
{
CaseInsensitiveDictionary.checkValue( null );
fail( "Expected IllegalArgumentException for null value" );
}
catch ( IllegalArgumentException iae )
{
}
}
public void testCheckValueSimple()
{
internalTestCheckValue( "String" );
internalTestCheckValue( new Integer( 1 ) );
internalTestCheckValue( new Long( 1 ) );
internalTestCheckValue( new Float( 1 ) );
internalTestCheckValue( new Double( 1 ) );
internalTestCheckValue( new Byte( ( byte ) 1 ) );
internalTestCheckValue( new Short( ( short ) 1 ) );
internalTestCheckValue( new Character( 'a' ) );
internalTestCheckValue( Boolean.TRUE );
}
public void testCheckValueSimpleArray()
{
internalTestCheckValue( new String[]
{ "String" } );
internalTestCheckValue( new Integer[]
{ new Integer( 1 ) } );
internalTestCheckValue( new Long[]
{ new Long( 1 ) } );
internalTestCheckValue( new Float[]
{ new Float( 1 ) } );
internalTestCheckValue( new Double[]
{ new Double( 1 ) } );
internalTestCheckValue( new Byte[]
{ new Byte( ( byte ) 1 ) } );
internalTestCheckValue( new Short[]
{ new Short( ( short ) 1 ) } );
internalTestCheckValue( new Character[]
{ new Character( 'a' ) } );
internalTestCheckValue( new Boolean[]
{ Boolean.TRUE } );
}
public void testCheckValuePrimitiveArray()
{
internalTestCheckValue( new long[]
{ 1 } );
internalTestCheckValue( new int[]
{ 1 } );
internalTestCheckValue( new short[]
{ 1 } );
internalTestCheckValue( new char[]
{ 1 } );
internalTestCheckValue( new byte[]
{ 1 } );
internalTestCheckValue( new double[]
{ 1 } );
internalTestCheckValue( new float[]
{ 1 } );
internalTestCheckValue( new boolean[]
{ true } );
}
public void testCheckValueSimpleVector()
{
internalTestCheckValue( "String", Vector.class );
internalTestCheckValue( new Integer( 1 ), Vector.class );
internalTestCheckValue( new Long( 1 ), Vector.class );
internalTestCheckValue( new Float( 1 ), Vector.class );
internalTestCheckValue( new Double( 1 ), Vector.class );
internalTestCheckValue( new Byte( ( byte ) 1 ), Vector.class );
internalTestCheckValue( new Short( ( short ) 1 ), Vector.class );
internalTestCheckValue( new Character( 'a' ), Vector.class );
internalTestCheckValue( Boolean.TRUE, Vector.class );
}
public void testCheckValueSimpleSet()
{
internalTestCheckValue( "String", HashSet.class );
internalTestCheckValue( new Integer( 1 ), HashSet.class );
internalTestCheckValue( new Long( 1 ), HashSet.class );
internalTestCheckValue( new Float( 1 ), HashSet.class );
internalTestCheckValue( new Double( 1 ), HashSet.class );
internalTestCheckValue( new Byte( ( byte ) 1 ), HashSet.class );
internalTestCheckValue( new Short( ( short ) 1 ), HashSet.class );
internalTestCheckValue( new Character( 'a' ), HashSet.class );
internalTestCheckValue( Boolean.TRUE, HashSet.class );
}
public void testCheckValueSimpleArrayList()
{
internalTestCheckValue( "String", ArrayList.class );
internalTestCheckValue( new Integer( 1 ), ArrayList.class );
internalTestCheckValue( new Long( 1 ), ArrayList.class );
internalTestCheckValue( new Float( 1 ), ArrayList.class );
internalTestCheckValue( new Double( 1 ), ArrayList.class );
internalTestCheckValue( new Byte( ( byte ) 1 ), ArrayList.class );
internalTestCheckValue( new Short( ( short ) 1 ), ArrayList.class );
internalTestCheckValue( new Character( 'a' ), ArrayList.class );
internalTestCheckValue( Boolean.TRUE, ArrayList.class );
}
private void internalTestCheckValue( Object value, Class collectionType )
{
Collection coll;
try
{
coll = ( Collection ) collectionType.newInstance();
}
catch ( Throwable t )
{
throw new IllegalArgumentException( collectionType + " cannot be instantiated as a Collection" );
}
coll.add( value );
internalTestCheckValue( coll );
}
private void internalTestCheckValue( Object value )
{
assertEqualValue( value, CaseInsensitiveDictionary.checkValue( value ) );
}
private void assertEqualValue( Object expected, Object actual )
{
if ( ( expected instanceof Collection ) && ( actual instanceof Collection ) )
{
Collection eColl = ( Collection ) expected;
Collection aColl = ( Collection ) actual;
if ( eColl.size() != aColl.size() )
{
fail( "Unexpected size. expected:" + eColl.size() + ", actual: " + aColl.size() );
}
// create a list from the expected collection and remove
// all values from the actual collection, this should get
// an empty collection
List eList = new ArrayList( eColl );
eList.removeAll( aColl );
assertTrue( "Collections do not match. expected:" + eColl + ", actual: " + aColl, eList.isEmpty() );
}
else
{
assertEquals( expected, actual );
}
}
public void testValidKeys()
{
CaseInsensitiveDictionary.checkKey( "a" );
CaseInsensitiveDictionary.checkKey( "1" );
CaseInsensitiveDictionary.checkKey( "-" );
CaseInsensitiveDictionary.checkKey( "_" );
CaseInsensitiveDictionary.checkKey( "A" );
CaseInsensitiveDictionary.checkKey( "a.b.c" );
CaseInsensitiveDictionary.checkKey( "a.1.c" );
CaseInsensitiveDictionary.checkKey( "a-sample.dotted_key.end" );
}
public void testKeyDots()
{
// FELIX-2184 these keys are all valid (but not recommended)
CaseInsensitiveDictionary.checkKey( "." );
CaseInsensitiveDictionary.checkKey( "a.b.c." );
CaseInsensitiveDictionary.checkKey( ".a.b.c." );
CaseInsensitiveDictionary.checkKey( "a..b" );
// valid key as of OSGi Compendium R4.2 (CM 1.3)
CaseInsensitiveDictionary.checkKey( ".a.b.c" );
}
public void testKeyIllegalCharacters()
{
testFailingKey( null );
testFailingKey( "" );
// FELIX-2184 these keys are all valid (but not recommended)
CaseInsensitiveDictionary.checkKey( " " );
CaseInsensitiveDictionary.checkKey( "ยง" );
CaseInsensitiveDictionary.checkKey( "${yikes}" );
CaseInsensitiveDictionary.checkKey( "a key with spaces" );
CaseInsensitiveDictionary.checkKey( "fail:key" );
}
private void testFailingKey( String key )
{
try
{
CaseInsensitiveDictionary.checkKey( key );
fail( "Expected IllegalArgumentException for key [" + key + "]" );
}
catch ( IllegalArgumentException iae )
{
// expected
}
}
}