blob: 76b9c740697e45dc76c753ec5b6ad89bed151998 [file] [log] [blame]
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed 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 com.android.tradefed.config;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
/** Unit tests for {@link OptionCopier}. */
@RunWith(JUnit4.class)
public class OptionCopierTest {
private static enum DefaultEnumClass {
VAL1, VAL3, VAL2;
}
private static class OptionSource {
@Option(name = "string", shortName = 's')
private String mMyOption = "value";
@Option(name = "int")
private int mMyIntOption = 42;
@SuppressWarnings("unused")
@Option(name = "notInDest")
private String mMyNotInDestOption = "foo";
@Option(name = "string_collection")
private Collection<String> mStringCollection = new ArrayList<String>();
@SuppressWarnings("unused")
@Option(name = "enum")
private DefaultEnumClass mEnum = DefaultEnumClass.VAL1;
@Option(name = "enum_map")
private Map<DefaultEnumClass, DefaultEnumClass> mEnumMap =
new HashMap<DefaultEnumClass, DefaultEnumClass>();
@Option(name = "enum_collection")
private Collection<DefaultEnumClass> mEnumCollection =
new ArrayList<DefaultEnumClass>();
}
/**
* Option source with an option with same name as OptionSource, but a different type.
*/
private static class OptionWrongTypeDest {
@Option(name = "string", shortName = 's')
private int mMyOption;
}
/**
* Option source with an option with same name as OptionSource, but only the primitive type of
* the collection.
*/
private static class OptionCollectionWrongTypeDest {
@Option(name = "string_collection", shortName = 's')
private String mString = null;
}
/**
* Option source with an option with same name as OptionSource, and with a different primitive
* type of the collection.
*/
private static class OptionCollectionWrongPrimitiveTypeDest {
@Option(name = "string_collection", shortName = 's')
private int mmyOption;
}
/** Option source with a non-initialized collection. */
private static class OptionCollectionNull {
@Option(name = "string_collection", shortName = 's')
private Collection<String> mStringCollection = null;
}
/**
* Option source with an option with same name as OptionSource, but a different type.
*/
@SuppressWarnings("unused")
private static class OptionWrongGenericTypeDest {
@Option(name = "string_collection")
private Collection<Integer> mIntCollection = new ArrayList<Integer>();
}
private static class OptionDest {
@Option(name = "string", shortName = 's')
private String mDestOption;
@Option(name = "int")
private int mDestIntOption;
@Option(name = "string_collection")
private Collection<String> mStringDestCollection = new ArrayList<String>();
@Option(name = "enum")
private DefaultEnumClass mEnum = null;
@Option(name = "enum_map")
private Map<DefaultEnumClass, DefaultEnumClass> mEnumMap =
new HashMap<DefaultEnumClass, DefaultEnumClass>();
@Option(name = "enum_collection")
private Collection<DefaultEnumClass> mEnumCollection =
new ArrayList<DefaultEnumClass>();
}
/** Test success case for {@link OptionCopier} using String fields */
@Test
public void testCopyOptions_string() throws ConfigurationException {
OptionSource source = new OptionSource();
OptionDest dest = new OptionDest();
OptionCopier.copyOptions(source, dest);
assertEquals(source.mMyOption, dest.mDestOption);
}
/** Test success case for {@link OptionCopier} for an int field */
@Test
public void testCopyOptions_int() throws ConfigurationException {
OptionSource source = new OptionSource();
OptionDest dest = new OptionDest();
OptionCopier.copyOptions(source, dest);
assertEquals(source.mMyIntOption, dest.mDestIntOption);
}
/** Test success case for {@link OptionCopier} for a {@link Collection}. */
@Test
public void testCopyOptions_collection() throws ConfigurationException {
OptionSource source = new OptionSource();
source.mStringCollection.add("foo");
OptionDest dest = new OptionDest();
dest.mStringDestCollection.add("bar");
OptionCopier.copyOptions(source, dest);
assertEquals(2, dest.mStringDestCollection.size());
assertTrue(dest.mStringDestCollection.contains("foo"));
assertTrue(dest.mStringDestCollection.contains("bar"));
}
/** Test success case for {@link OptionCopier} for an enum field */
@Test
public void testCopyOptions_enum() throws ConfigurationException {
OptionSource source = new OptionSource();
OptionDest dest = new OptionDest();
OptionCopier.copyOptions(source, dest);
assertEquals(DefaultEnumClass.VAL1, dest.mEnum);
}
/** Test success case for {@link OptionCopier} for an enum {@link Collection}. */
@Test
public void testCopyOptions_enumCollection() throws ConfigurationException {
OptionSource source = new OptionSource();
source.mEnumCollection.add(DefaultEnumClass.VAL2);
OptionDest dest = new OptionDest();
source.mEnumCollection.add(DefaultEnumClass.VAL3);
OptionCopier.copyOptions(source, dest);
assertEquals(2, dest.mEnumCollection.size());
assertTrue(dest.mEnumCollection.contains(DefaultEnumClass.VAL2));
assertTrue(dest.mEnumCollection.contains(DefaultEnumClass.VAL3));
}
/** Test success case for {@link OptionCopier} for an enum {@link Map}. */
@Test
public void testCopyOptions_enumMap() throws ConfigurationException {
OptionSource source = new OptionSource();
source.mEnumMap.put(DefaultEnumClass.VAL1, DefaultEnumClass.VAL2);
OptionDest dest = new OptionDest();
dest.mEnumMap.put(DefaultEnumClass.VAL2, DefaultEnumClass.VAL3);
OptionCopier.copyOptions(source, dest);
assertEquals(2, dest.mEnumMap.size());
assertEquals(DefaultEnumClass.VAL2, dest.mEnumMap.get(DefaultEnumClass.VAL1));
}
/** Test {@link OptionCopier} when field's to be copied have different types */
@Test
public void testCopyOptions_wrongType() {
OptionSource source = new OptionSource();
OptionWrongTypeDest dest = new OptionWrongTypeDest();
try {
OptionCopier.copyOptions(source, dest);
fail("ConfigurationException not thrown");
} catch (ConfigurationException e) {
// expected
}
}
/** Copying a collection to primitive type will fail. */
@Test
public void testCopyOptions_collectionToPrimitive() {
OptionSource source = new OptionSource();
OptionCollectionWrongTypeDest dest = new OptionCollectionWrongTypeDest();
try {
OptionCopier.copyOptions(source, dest);
fail("ConfigurationException not thrown");
} catch (ConfigurationException e) {
// expected
assertEquals("internal error when setting option 'string_collection'", e.getMessage());
}
}
/** Copying a null initialized primitive value to collection will fail. */
@Test
public void testCopyOptions_primitiveToCollection_null() {
OptionCollectionWrongTypeDest source = new OptionCollectionWrongTypeDest();
OptionSource dest = new OptionSource();
try {
OptionCopier.copyOptions(source, dest);
fail("ConfigurationException not thrown");
} catch (ConfigurationException e) {
// expected
assertEquals(
"Value 'null' is not of type 'class java.lang.String' like the Collection.",
e.getMessage());
}
}
/**
* Copying an initialized primitive value to collection will succeed since the type is
* compatible.
*/
@Test
public void testCopyOptions_primitiveToCollection() throws Exception {
OptionCollectionWrongTypeDest source = new OptionCollectionWrongTypeDest();
OptionSetter setter = new OptionSetter(source);
setter.setOptionValue("string_collection", "not_null");
OptionSource dest = new OptionSource();
OptionCopier.copyOptions(source, dest);
assertEquals(1, dest.mStringCollection.size());
assertEquals("not_null", dest.mStringCollection.iterator().next());
}
/**
* Copying a primitive value different from the collection type will fail since we do not want
* to mix types in a collection.
*/
@Test
public void testCopyOptions_primitiveToCollection_differentPrimitive() throws Exception {
OptionCollectionWrongPrimitiveTypeDest source =
new OptionCollectionWrongPrimitiveTypeDest();
OptionSetter setter = new OptionSetter(source);
setter.setOptionValue("string_collection", "5");
OptionSource dest = new OptionSource();
try {
OptionCopier.copyOptions(source, dest);
fail("ConfigurationException not thrown");
} catch (ConfigurationException e) {
// expected
assertEquals(
"Value '5' is not of type 'class java.lang.String' like the Collection.",
e.getMessage());
}
}
/** Copying a non-initialized collection (null) to a collection results in an exception. */
@Test
public void testCopyOptions_nullCollection() throws Exception {
OptionCollectionNull source = new OptionCollectionNull();
OptionSource dest = new OptionSource();
try {
OptionCopier.copyOptions(source, dest);
fail("ConfigurationException not thrown");
} catch (ConfigurationException e) {
// expected
assertEquals(
"Value 'null' is not of type 'class java.lang.String' like the Collection.",
e.getMessage());
}
}
}