blob: 1fee1babbf1019d0bbed04cd60424a5a867a28a2 [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.harmony.logging.tests.java.util.logging;
import dalvik.annotation.TestTargetClass;
import dalvik.annotation.TestTargets;
import dalvik.annotation.TestTargetNew;
import dalvik.annotation.TestLevel;
import java.io.Serializable;
import java.util.ResourceBundle;
import java.util.logging.Handler;
import java.util.logging.Level;
import junit.framework.TestCase;
import org.apache.harmony.testframework.serialization.SerializationTest;
import org.apache.harmony.testframework.serialization.SerializationTest.SerializableAssert;
/*
* This class implements Serializable, so that the non-static inner class
* MockLevel can be Serializable.
*/
@TestTargetClass(Level.class)
public class LevelTest extends TestCase implements Serializable {
private static final long serialVersionUID = 1L;
/**
* Test the constructor without resource bundle parameter using normal
* values. As byproducts, getName & intValue are also tested.
*/
@TestTargets({
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Checks the constructor without resource bundle parameter using normal values.",
method = "Level",
args = {java.lang.String.class, int.class}
),
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Checks the constructor without resource bundle parameter using normal values.",
method = "getName",
args = {}
)
})
public void testConstructorNoResBundle_Normal() {
MockLevel l = new MockLevel("level1", 1);
assertEquals("level1", l.getName());
assertEquals(1, l.intValue());
assertNull(l.getResourceBundleName());
}
/**
* Test the constructor without resource bundle parameter using null name.
* As byproducts, getName & intValue are also tested.
*/
@TestTargets({
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Checks the constructor without resource bundle parameter using null name.",
method = "Level",
args = {java.lang.String.class, int.class}
),
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Checks the constructor without resource bundle parameter using null name.",
method = "getName",
args = {}
)
})
public void testConstructorNoResBundle_NullName() {
try {
new MockLevel(null, -2);
fail("No expected NullPointerException");
} catch (NullPointerException ignore) {
// expected
}
}
/*
* Test the constructor without resource bundle parameter using empty name.
* As byproducts, getName & intValue are also tested.
*/
@TestTargets({
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Checks the constructor without resource bundle parameter using empty name.",
method = "Level",
args = {java.lang.String.class, int.class}
),
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Checks the constructor without resource bundle parameter using empty name.",
method = "getName",
args = {}
)
})
public void testConstructorNoResBundle_EmptyName() {
MockLevel l = new MockLevel("", -3);
assertEquals("", l.getName());
assertEquals(-3, l.intValue());
assertNull(l.getResourceBundleName());
}
/*
* Test the constructor having resource bundle parameter using normal
* values. As byproducts, getName & intValue are also tested.
*/
@TestTargets({
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "Level",
args = {java.lang.String.class, int.class, java.lang.String.class}
),
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "getName",
args = {}
)
})
public void testConstructorHavingResBundle_Normal() {
MockLevel l = new MockLevel("level1", 1, "resourceBundle");
assertEquals("level1", l.getName());
assertEquals(1, l.intValue());
assertEquals("resourceBundle", l.getResourceBundleName());
}
/*
* Test the constructor having resource bundle parameter using null names.
* As byproducts, getName & intValue are also tested.
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Checks NullPointerException.",
method = "Level",
args = {java.lang.String.class, int.class, java.lang.String.class}
)
public void testConstructorHavingResBundle_NullName() {
try {
new MockLevel(null, -123, "qwe");
fail("No expected NullPointerException");
} catch (NullPointerException ignore) {
// expected
}
}
/*
* Test the constructor having resource bundle parameter using empty
names.
* As byproducts, getName & intValue are also tested.
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Verifies the constructor having resource bundle parameter using empty names.",
method = "Level",
args = {java.lang.String.class, int.class, java.lang.String.class}
)
public void testConstructorHavingResBundle_EmptyName() {
MockLevel l = new MockLevel("", -1000, "");
assertEquals("", l.getName());
assertEquals(-1000, l.intValue());
assertEquals("", l.getResourceBundleName());
}
/*
* Test method parse, with the pre-defined string consts.
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Verifies parse, with the pre-defined string consts.",
method = "parse",
args = {java.lang.String.class}
)
public void testParse_PredefinedConstStrings() {
assertSame(Level.SEVERE, Level.parse("SEVERE"));
assertSame(Level.WARNING, Level.parse("WARNING"));
assertSame(Level.INFO, Level.parse("INFO"));
assertSame(Level.CONFIG, Level.parse("CONFIG"));
assertSame(Level.FINE, Level.parse("FINE"));
assertSame(Level.FINER, Level.parse("FINER"));
assertSame(Level.FINEST, Level.parse("FINEST"));
assertSame(Level.OFF, Level.parse("OFF"));
assertSame(Level.ALL, Level.parse("ALL"));
}
/*
* Test method parse, with an undefined string.
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "IllegalArgumentException is verified.",
method = "parse",
args = {java.lang.String.class}
)
public void testParse_IllegalConstString() {
try {
Level.parse("SEVERe");
fail("Should throw IllegalArgumentException if undefined string.");
} catch (IllegalArgumentException e) {
// expected
}
}
/*
* Test method parse, with a null string.
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Verifies null as a parameter.",
method = "parse",
args = {java.lang.String.class}
)
public void testParse_NullString() {
try {
Level.parse(null);
fail("Should throw NullPointerException.");
} catch (NullPointerException e) {
// expected
}
}
/*
* Test method parse, with pre-defined valid number strings.
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Verifies parse, with pre-defined valid number strings.",
method = "parse",
args = {java.lang.String.class}
)
public void testParse_PredefinedNumber() {
assertSame(Level.SEVERE, Level.parse("SEVERE"));
assertSame(Level.WARNING, Level.parse("WARNING"));
assertSame(Level.INFO, Level.parse("INFO"));
assertSame(Level.CONFIG, Level.parse("CONFIG"));
assertSame(Level.FINE, Level.parse("FINE"));
assertSame(Level.FINER, Level.parse("FINER"));
assertSame(Level.FINEST, Level.parse("FINEST"));
assertSame(Level.OFF, Level.parse("OFF"));
assertSame(Level.ALL, Level.parse("ALL"));
assertSame(Level.SEVERE, Level.parse("1000"));
assertSame(Level.WARNING, Level.parse("900"));
assertSame(Level.INFO, Level.parse("800"));
assertSame(Level.CONFIG, Level.parse("700"));
assertSame(Level.FINE, Level.parse("500"));
assertSame(Level.FINER, Level.parse("400"));
assertSame(Level.FINEST, Level.parse("300"));
assertSame(Level.OFF, Level.parse(String.valueOf(Integer.MAX_VALUE)));
assertSame(Level.ALL, Level.parse(String.valueOf(Integer.MIN_VALUE)));
}
/*
* Test method parse, with an undefined valid number strings.
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Verifies parse, with an undefined valid number strings.",
method = "parse",
args = {java.lang.String.class}
)
public void testParse_UndefinedNumber() {
Level l = Level.parse("0");
assertEquals(0, l.intValue());
assertEquals("0", l.getName());
assertNull(l.getResourceBundleName());
}
/*
* Test method parse, with an undefined valid number strings with spaces.
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Verifies parse, with an undefined valid number strings with spaces.",
method = "parse",
args = {java.lang.String.class}
)
public void testParse_UndefinedNumberWithSpaces() {
try {
Level.parse(" 0");
} catch (IllegalArgumentException e) {
// expected
}
}
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Verifies negative number.",
method = "parse",
args = {java.lang.String.class}
)
public void testParse_NegativeNumber() {
Level l = Level.parse("-4");
assertEquals(-4, l.intValue());
assertEquals("-4", l.getName());
assertNull(l.getResourceBundleName());
}
/*
* Test method parse, expecting the same objects will be returned given the
* same name, even for non-predefined levels.
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Verifies parse, expecting the same objects will be returned given the same name, even for non-predefined levels.",
method = "parse",
args = {java.lang.String.class}
)
public void testParse_SameObject() {
Level l = Level.parse("-100");
assertSame(l, Level.parse("-100"));
}
/*
* Test method hashCode, with normal fields.
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "hashCode",
args = {}
)
public void testHashCode_Normal() {
assertEquals(100, Level.parse("100").hashCode());
assertEquals(-1, Level.parse("-1").hashCode());
assertEquals(0, Level.parse("0").hashCode());
assertEquals(Integer.MIN_VALUE, Level.parse("ALL").hashCode());
}
/*
* Test equals when two objects are equal.
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Doesn't check negative case.",
method = "equals",
args = {java.lang.Object.class}
)
public void testEquals_Equal() {
MockLevel l1 = new MockLevel("level1", 1);
MockLevel l2 = new MockLevel("level2", 1);
assertEquals(l1, l2);
assertEquals(l2, l1);
}
/*
* Test equals when two objects are not equal.
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Checks negative case.",
method = "equals",
args = {java.lang.Object.class}
)
public void testEquals_NotEqual() {
MockLevel l1 = new MockLevel("level1", 1);
MockLevel l2 = new MockLevel("level1", 2);
assertFalse(l1.equals(l2));
assertFalse(l2.equals(l1));
}
/*
* Test equals when the other object is null.
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Checks null as a parameter.",
method = "equals",
args = {java.lang.Object.class}
)
public void testEquals_Null() {
assertFalse(Level.ALL.equals(null));
}
/*
* Test equals when the other object is not an instance of Level.
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Checks negative case.",
method = "equals",
args = {java.lang.Object.class}
)
public void testEquals_NotLevel() {
assertFalse(Level.ALL.equals(new Object()));
}
/*
* Test equals when the other object is itself.
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Checks equals when the other object is itself.",
method = "equals",
args = {java.lang.Object.class}
)
public void testEquals_Itself() {
assertTrue(Level.ALL.equals(Level.ALL));
}
/*
* Test toString of a normal Level.
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "toString",
args = {}
)
public void testToString_Normal() {
assertEquals("ALL", Level.ALL.toString());
MockLevel l = new MockLevel("name", 2);
assertEquals("name", l.toString());
MockLevel emptyLevel = new MockLevel("", 3);
assertEquals("", emptyLevel.toString());
}
// comparator for Level objects:
// is used because Level.equals() method only takes into account
// 'level' value but ignores 'name' and 'resourceBundleName' values
private static final SerializableAssert LEVEL_COMPARATOR = new SerializableAssert() {
public void assertDeserialized(Serializable initial,
Serializable deserialized) {
Level init = (Level) initial;
Level dser = (Level) deserialized;
assertEquals("Class", init.getClass(), dser.getClass());
assertEquals("Name", init.getName(), dser.getName());
assertEquals("Value", init.intValue(), dser.intValue());
assertEquals("ResourceBundleName", init.getResourceBundleName(),
dser.getResourceBundleName());
}
};
/**
* @tests serialization/deserialization compatibility.
*
* Test serialization of pre-defined const levels. It is expected that the
* deserialized cost level should be the same instance as the existing one.
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Serialization of pre-defined const levels. ",
method = "!SerializationSelf",
args = {}
)
public void testSerialization_ConstLevel() throws Exception {
SerializationTest.verifySelf(Level.ALL,
SerializationTest.SAME_COMPARATOR);
}
/**
* @tests serialization/deserialization compatibility.
*
* Test serialization of normal instance of Level. It is expected that the
* deserialized level object should be equal to the original one.
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test serialization of normal instance of Level.",
method = "!SerializationSelf",
args = {}
)
public void testSerialization_InstanceLevel() throws Exception {
// tests that objects are the same
Level[] objectsToTest = new Level[] { Level.parse("550")};
SerializationTest.verifySelf(objectsToTest,
SerializationTest.SAME_COMPARATOR);
// tests that objects are the equals
objectsToTest = new Level[] {
new MockLevel("123", 123, "bundle"),
new MockLevel("123", 123, null) };
SerializationTest.verifySelf(objectsToTest, LEVEL_COMPARATOR);
}
/**
* @tests serialization/deserialization compatibility with RI.
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Serialization/deserialization compatibility",
method = "!SerializationGolden",
args = {}
)
public void testSerializationCompatibility() throws Exception {
SerializationTest.verifyGolden(this,
new MockLevel("123", 123, "bundle"), LEVEL_COMPARATOR);
}
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getLocalizedName",
args = {}
)
public void testGetLocalName() {
ResourceBundle rb = ResourceBundle.getBundle("bundles/java/util/logging/res");
Level l = new MockLevel("level1", 120,
"bundles/java/util/logging/res");
assertEquals(rb.getString("level1"), l.getLocalizedName());
// regression test for HARMONY-2415
rb = ResourceBundle.getBundle(
"org.apache.harmony.logging.tests.java.util.logging.LevelTestResource");
l = new MockLevel("Level_error", 120,
"org.apache.harmony.logging.tests.java.util.logging.LevelTestResource");
assertEquals(rb.getString("Level_error"), l.getLocalizedName());
l = new MockLevel("bad name", 120, "res");
assertEquals("bad name", l.getLocalizedName());
l = new MockLevel("level1", 11120, "bad name");
assertEquals("level1", l.getLocalizedName());
l = new MockLevel("level1", 1120);
assertEquals("level1", l.getLocalizedName());
}
/*
* test for method public String getResourceBundleName()
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getResourceBundleName",
args = {}
)
public void testGetResourceBundleName() {
String bundleName = "bundles/java/util/logging/res";
Level l = new MockLevel("level1", 120);
assertNull("level's localization resource bundle name is not null", l
.getResourceBundleName());
l = new MockLevel("level1", 120, bundleName);
assertEquals("bundleName is non equal to actual value", bundleName, l
.getResourceBundleName());
l = new MockLevel("level1", 120, bundleName + "+abcdef");
assertEquals("bundleName is non equal to actual value", bundleName
+ "+abcdef", l.getResourceBundleName());
}
/*
* test for method public final int intValue()
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "intValue",
args = {}
)
public void testIntValue() {
int value1 = 120;
Level l = new MockLevel("level1", value1);
assertEquals(
"integer value for this level is non equal to actual value",
value1, l.intValue());
}
/*
* Test defining new levels in subclasses of Level
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test defining new levels in subclasses of Level",
method = "parse",
args = {java.lang.String.class}
)
public void testSubclassNewLevel() {
MyLevel.DUPLICATENAME.getName();// just to load MyLevel class
// test duplicated name and num
assertEquals("INFO", MyLevel.parse("800").getName());
assertEquals(800, MyLevel.parse("INFO").intValue());
// test duplicated name
assertEquals("FINE", MyLevel.parse("499").getName());
assertEquals("FINE", MyLevel.parse("500").getName());
assertEquals(500, MyLevel.parse("FINE").intValue());
// test duplicated number
assertEquals("FINEST", MyLevel.parse("300").getName());
assertEquals(300, MyLevel.parse("FINEST").intValue());
assertEquals(300, MyLevel.parse("MYLEVEL1").intValue());
// test a normal new level, without duplicated elements
assertEquals("MYLEVEL2", MyLevel.parse("299").getName());
assertEquals(299, MyLevel.parse("MYLEVEL2").intValue());
}
/*
* This subclass is to test whether subclasses of Level can add new defined
* levels.
*/
static class MyLevel extends Level implements Serializable {
private static final long serialVersionUID = 1L;
public MyLevel(String name, int value) {
super(name, value);
}
public static final Level DUPLICATENAMENUM = new MyLevel("INFO", 800);
public static final Level DUPLICATENAME = new MyLevel("FINE", 499);
public static final Level DUPLICATENUM = new MyLevel("MYLEVEL1", 300);
public static final Level NORMAL = new MyLevel("MYLEVEL2", 299);
}
/*
* This Mock is used to expose the protected constructors.
*/
public class MockLevel extends Level implements Serializable {
private static final long serialVersionUID = 1L;
public MockLevel(String name, int value) {
super(name, value);
}
public MockLevel(String name, int value, String resourceBundleName) {
super(name, value, resourceBundleName);
}
}
}