blob: cf608bca3b13b8bf08dff746bb9a071a6e6a1194 [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 java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.security.Permission;
import java.util.Enumeration;
import java.util.Properties;
import java.util.logging.ConsoleHandler;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import java.util.logging.LoggingPermission;
import junit.framework.TestCase;
import org.apache.harmony.logging.tests.java.util.logging.HandlerTest.NullOutputStream;
import org.apache.harmony.logging.tests.java.util.logging.util.EnvironmentHelper;
import dalvik.annotation.SideEffect;
import dalvik.annotation.TestLevel;
import dalvik.annotation.TestTargetClass;
import dalvik.annotation.TestTargetNew;
import dalvik.annotation.TestTargets;
/**
*
* add/get logger(dot)
*
*/
@TestTargetClass(LogManager.class)
public class LogManagerTest extends TestCase {
private static final String FOO = "LogManagerTestFoo";
LogManager mockManager;
LogManager manager = LogManager.getLogManager();
MockPropertyChangeListener listener;
Properties props;
private static String className = LogManagerTest.class.getName();
static Handler handler = null;
static final String CONFIG_CLASS = "java.util.logging.config.class";
static final String CONFIG_FILE = "java.util.logging.config.file";
static final String MANAGER_CLASS = "java.util.logging.config.manager";
static final SecurityManager securityManager = System.getSecurityManager();
static final String clearPath = System.getProperty("clearpath");
/*
* @see TestCase#setUp()
*/
@Override
protected void setUp() throws Exception {
super.setUp();
mockManager = new MockLogManager();
// listener = new MockPropertyChangeListener();
handler = new MockHandler();
props = new Properties();
props.put("handlers", className + "$MockHandler " + className + "$MockHandler");
props.put("java.util.logging.FileHandler.pattern", "%h/java%u.log");
props.put("java.util.logging.FileHandler.limit", "50000");
props.put("java.util.logging.FileHandler.count", "5");
props.put("java.util.logging.FileHandler.formatter", "java.util.logging.XMLFormatter");
props.put(".level", "FINE");
props.put("java.util.logging.ConsoleHandler.level", "OFF");
props.put("java.util.logging.ConsoleHandler.formatter","java.util.logging.SimpleFormatter");
props.put("LogManagerTestFoo.handlers", "java.util.logging.ConsoleHandler");
props.put("LogManagerTestFoo.level", "WARNING");
}
/*
* @see TestCase#tearDown()
*/
@Override
protected void tearDown() throws Exception {
super.tearDown();
handler = null;
}
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "LogManager",
args = {}
)
public void testLogManager() {
class TestLogManager extends LogManager {
public TestLogManager() {
super();
}
}
TestLogManager tlm = new TestLogManager();
assertNotNull(tlm.toString());
}
@TestTargets({
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Verifies NullPointerException.",
method = "addLogger",
args = {java.util.logging.Logger.class}
),
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Verifies NullPointerException.",
method = "getLogger",
args = {java.lang.String.class}
)
})
public void testAddGetLogger() {
Logger log = new MockLogger(FOO, null);
Logger foo = mockManager.getLogger(FOO);
assertNull(foo);
assertTrue(mockManager.addLogger(log));
foo = mockManager.getLogger(FOO);
assertSame(foo, log);
assertNull(foo.getParent());
try {
mockManager.addLogger(null);
fail("add null should throw NullPointerException");
} catch (NullPointerException e) {
}
try {
mockManager.getLogger(null);
fail("get null should throw NullPointerException");
} catch (NullPointerException e) {
}
assertNull(mockManager.getLogger("bad name"));
Enumeration<String> enumar = mockManager.getLoggerNames();
int i = 0;
while (enumar.hasMoreElements()) {
String name = enumar.nextElement();
i++;
assertEquals(FOO, name);
}
assertEquals(i, 1);
}
@TestTargets({
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "addLogger",
args = {java.util.logging.Logger.class}
),
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "getLogger",
args = {java.lang.String.class}
)
})
public void testAddGetLogger_duplicateName() {
// add logger with duplicate name has no effect
Logger foo = new MockLogger(FOO, null);
Logger foo2 = new MockLogger(FOO, null);
assertTrue(mockManager.addLogger(foo));
assertSame(foo, mockManager.getLogger(FOO));
assertFalse(mockManager.addLogger(foo2));
assertSame(foo, mockManager.getLogger(FOO));
Enumeration<String> enumar = mockManager.getLoggerNames();
int i = 0;
while (enumar.hasMoreElements()) {
enumar.nextElement();
i++;
}
assertEquals(1, i);
}
@TestTargets({
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "addLogger",
args = {java.util.logging.Logger.class}
),
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "getLogger",
args = {java.lang.String.class}
)
})
public void testAddGetLogger_Hierachy() {
Logger foo = new MockLogger("testAddGetLogger_Hierachy.foo", null);
Logger child = new MockLogger("testAddGetLogger_Hierachy.foo.child", null);
Logger fakeChild = new MockLogger("testAddGetLogger_Hierachy.foo2.child", null);
Logger grandson = new MockLogger("testAddGetLogger_Hierachy.foo.child.grandson", null);
Logger otherChild = new MockLogger("testAddGetLogger_Hierachy.foo.child", null);
assertNull(foo.getParent());
assertNull(child.getParent());
assertNull(grandson.getParent());
assertNull(otherChild.getParent());
// whenever a logger is added to a LogManager, hierarchy will be updated
// accordingly
assertTrue(mockManager.addLogger(child));
assertNull(child.getParent());
assertTrue(mockManager.addLogger(fakeChild));
assertNull(fakeChild.getParent());
assertTrue(mockManager.addLogger(grandson));
assertSame(child, grandson.getParent());
assertTrue(mockManager.addLogger(foo));
assertSame(foo, child.getParent());
assertNull(foo.getParent());
assertNull(fakeChild.getParent());
// but for non-mock LogManager, foo's parent should be root
assertTrue(manager.addLogger(foo));
assertSame(manager.getLogger(""), manager.getLogger("testAddGetLogger_Hierachy.foo")
.getParent());
// if we add one logger to two LogManager, parent will changed
assertTrue(manager.addLogger(otherChild));
assertTrue(manager.addLogger(grandson));
assertSame(foo, otherChild.getParent());
assertSame(otherChild, grandson.getParent());
}
@TestTargets({
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "addLogger",
args = {java.util.logging.Logger.class}
),
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "getLogger",
args = {java.lang.String.class}
)
})
public void testAddLoggerReverseOrder() {
Logger root = new MockLogger("testAddLoggerReverseOrder", null);
Logger foo = new MockLogger("testAddLoggerReverseOrder.foo", null);
Logger fooChild = new MockLogger("testAddLoggerReverseOrder.foo.child", null);
Logger fooGrandChild = new MockLogger("testAddLoggerReverseOrder.foo.child.grand", null);
Logger fooGrandChild2 = new MockLogger("testAddLoggerReverseOrder.foo.child.grand2", null);
Logger realRoot = manager.getLogger("");
manager.addLogger(fooGrandChild);
assertEquals(realRoot, fooGrandChild.getParent());
manager.addLogger(root);
assertSame(root, fooGrandChild.getParent());
assertSame(realRoot, root.getParent());
manager.addLogger(foo);
assertSame(root, foo.getParent());
assertSame(foo, fooGrandChild.getParent());
manager.addLogger(fooGrandChild2);
assertSame(foo, fooGrandChild2.getParent());
assertSame(foo, fooGrandChild.getParent());
manager.addLogger(fooChild);
assertSame(fooChild, fooGrandChild2.getParent());
assertSame(fooChild, fooGrandChild.getParent());
assertSame(foo, fooChild.getParent());
assertSame(root, foo.getParent());
assertSame(realRoot, root.getParent());
}
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "addLogger",
args = {java.util.logging.Logger.class}
)
public void testAddSimiliarLogger() {
Logger root = new MockLogger("testAddSimiliarLogger", null);
Logger foo = new MockLogger("testAddSimiliarLogger.foo", null);
Logger similiarFoo = new MockLogger("testAddSimiliarLogger.fop", null);
Logger fooo = new MockLogger("testAddSimiliarLogger.fooo", null);
Logger fooChild = new MockLogger("testAddSimiliarLogger.foo.child", null);
Logger similiarFooChild = new MockLogger("testAddSimiliarLogger.fop.child", null);
Logger foooChild = new MockLogger("testAddSimiliarLogger.fooo.child", null);
manager.addLogger(root);
manager.addLogger(fooChild);
manager.addLogger(similiarFooChild);
manager.addLogger(foooChild);
assertSame(root, fooChild.getParent());
assertSame(root, similiarFooChild.getParent());
assertSame(root, foooChild.getParent());
manager.addLogger(foo);
assertSame(foo, fooChild.getParent());
assertSame(root, similiarFooChild.getParent());
assertSame(root, foooChild.getParent());
manager.addLogger(similiarFoo);
assertSame(foo, fooChild.getParent());
assertSame(similiarFoo, similiarFooChild.getParent());
assertSame(root, foooChild.getParent());
manager.addLogger(fooo);
assertSame(fooo, foooChild.getParent());
}
@TestTargets({
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "addLogger",
args = {java.util.logging.Logger.class}
),
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "getLogger",
args = {java.lang.String.class}
)
})
public void testAddGetLogger_nameWithSpace() {
Logger foo = new MockLogger(FOO, null);
Logger fooBeforeSpace = new MockLogger(FOO + " ", null);
Logger fooAfterSpace = new MockLogger(" " + FOO, null);
Logger fooWithBothSpace = new MockLogger(" " + FOO + " ", null);
assertTrue(mockManager.addLogger(foo));
assertTrue(mockManager.addLogger(fooBeforeSpace));
assertTrue(mockManager.addLogger(fooAfterSpace));
assertTrue(mockManager.addLogger(fooWithBothSpace));
assertSame(foo, mockManager.getLogger(FOO));
assertSame(fooBeforeSpace, mockManager.getLogger(FOO + " "));
assertSame(fooAfterSpace, mockManager.getLogger(" " + FOO));
assertSame(fooWithBothSpace, mockManager.getLogger(" " + FOO + " "));
}
@TestTargets({
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Doesn't verify NullPointerException",
method = "addLogger",
args = {java.util.logging.Logger.class}
),
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "getLogger",
args = {java.lang.String.class}
)
})
public void testAddGetLogger_addRoot() {
Logger foo = new MockLogger(FOO, null);
Logger fooChild = new MockLogger(FOO + ".child", null);
Logger other = new MockLogger("other", null);
Logger root = new MockLogger("", null);
assertNull(foo.getParent());
assertNull(root.getParent());
assertNull(other.getParent());
// add root to mock logmanager and it works as "root" logger
assertTrue(mockManager.addLogger(foo));
assertTrue(mockManager.addLogger(other));
assertTrue(mockManager.addLogger(fooChild));
assertNull(foo.getParent());
assertNull(other.getParent());
assertSame(foo, fooChild.getParent());
assertTrue(mockManager.addLogger(root));
assertSame(root, foo.getParent());
assertSame(root, other.getParent());
assertNull(root.getParent());
// try to add root logger to non-mock LogManager, no effect
assertFalse(manager.addLogger(root));
assertNotSame(root, manager.getLogger(""));
}
/**
* @tests java.util.logging.LogManager#addLogger(Logger)
*/
@TestTargets({
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "addLogger",
args = {java.util.logging.Logger.class}
),
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "getLogManager",
args = {}
)
})
public void test_addLoggerLLogger_Security() throws Exception {
// regression test for Harmony-1286
SecurityManager originalSecurityManager = System.getSecurityManager();
System.setSecurityManager(new SecurityManager() {
@Override
public void checkPermission(Permission perm) {
}
});
try {
LogManager manager = LogManager.getLogManager();
manager.addLogger(new MockLogger("mock", null));
manager.addLogger(new MockLogger("mock.child", null));
} finally {
System.setSecurityManager(originalSecurityManager);
}
}
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "readConfiguration",
args = {java.io.InputStream.class}
)
public void testDefaultLoggerProperties() throws Exception {
// mock LogManager has no default logger
assertNull(mockManager.getLogger(""));
assertNull(mockManager.getLogger("global"));
// non-mock LogManager has two default logger
Logger global = manager.getLogger("global");
Logger root = manager.getLogger("");
assertSame(global, Logger.global);
assertSame(root, global.getParent());
Logger oldGlobal = global;
Logger oldRoot = root;
// root properties
manager.readConfiguration(EnvironmentHelper.PropertiesToInputStream(props));
global = manager.getLogger("global");
root = manager.getLogger("");
assertSame(oldGlobal, global);
assertSame(oldRoot, root);
assertNull(root.getFilter());
assertEquals(2, root.getHandlers().length);
assertEquals(Level.FINE, root.getLevel());
assertEquals("", root.getName());
assertSame(root.getParent(), null);
assertTrue(root.getUseParentHandlers());
// The following two fail if other tests are run before this one.
assertNull(root.getResourceBundle());
assertNull(root.getResourceBundleName());
}
/*
* test for method public Logger getLogger(String name)
* test covers following usecases:
* case 1: test default and valid value
* case 2: test throw NullPointerException
* case 3: test bad name
* case 4: check correct tested value
*/
@TestTargets({
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "getLogger",
args = {java.lang.String.class}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getLoggerNames",
args = {}
)
})
public void testGetLogger() throws Exception {
// case 1: test default and valid value
Logger log = new MockLogger(FOO, null);
Logger foo = mockManager.getLogger(FOO);
assertNull("Logger should be null", foo);
assertTrue("logger was't registered successfully", mockManager.addLogger(log));
foo = mockManager.getLogger(FOO);
assertSame("two loggers not refer to the same object", foo, log);
assertNull("logger foo should not haven parent", foo.getParent());
// case 2: test throw NullPointerException
try {
mockManager.getLogger(null);
fail("get null should throw NullPointerException");
} catch (NullPointerException e) {
}
// case 3: test bad name
assertNull("LogManager should not have logger with unforeseen name", mockManager
.getLogger("bad name"));
// case 4: check correct tested value
Enumeration<String> enumar = mockManager.getLoggerNames();
int i = 0;
while (enumar.hasMoreElements()) {
String name = enumar.nextElement();
i++;
assertEquals("name logger should be equal to foreseen name", FOO, name);
}
assertEquals("LogManager should contain one element", 1, i);
}
/*
* test for method public Logger getLogger(String name)
*/
@TestTargets({
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "getLogger",
args = {java.lang.String.class}
),
@TestTargetNew(
level = TestLevel.PARTIAL,
notes = "",
method = "getLoggerNames",
args = {}
)
})
public void testGetLogger_duplicateName() throws Exception {
// test duplicate name
// add logger with duplicate name has no effect
mockManager.reset();
Logger foo2 = new MockLogger(FOO, null);
Logger foo3 = new MockLogger(FOO, null);
mockManager.addLogger(foo2);
assertSame(foo2, mockManager.getLogger(FOO));
mockManager.addLogger(foo3);
assertSame(foo2, mockManager.getLogger(FOO));
Enumeration<String> enumar2 = mockManager.getLoggerNames();
int i = 0;
while (enumar2.hasMoreElements()) {
enumar2.nextElement();
i++;
}
assertEquals(1, i);
}
/*
* test for method public Logger getLogger(String name)
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "getLogger",
args = {java.lang.String.class}
)
public void testGetLogger_hierachy() throws Exception {
// test hierachy
Logger foo = new MockLogger("testGetLogger_hierachy.foo", null);
// but for non-mock LogManager, foo's parent should be root
assertTrue(manager.addLogger(foo));
assertSame(manager.getLogger(""), manager.getLogger("testGetLogger_hierachy.foo")
.getParent());
}
/*
* test for method public Logger getLogger(String name)
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "getLogger",
args = {java.lang.String.class}
)
public void testGetLogger_nameSpace() throws Exception {
// test name with space
Logger foo = new MockLogger(FOO, null);
Logger fooBeforeSpace = new MockLogger(FOO + " ", null);
Logger fooAfterSpace = new MockLogger(" " + FOO, null);
Logger fooWithBothSpace = new MockLogger(" " + FOO + " ", null);
assertTrue(mockManager.addLogger(foo));
assertTrue(mockManager.addLogger(fooBeforeSpace));
assertTrue(mockManager.addLogger(fooAfterSpace));
assertTrue(mockManager.addLogger(fooWithBothSpace));
assertSame(foo, mockManager.getLogger(FOO));
assertSame(fooBeforeSpace, mockManager.getLogger(FOO + " "));
assertSame(fooAfterSpace, mockManager.getLogger(" " + FOO));
assertSame(fooWithBothSpace, mockManager.getLogger(" " + FOO + " "));
}
/*
* test for method public void checkAccess() throws SecurityException
*/
@TestTargets({
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "checkAccess",
args = {}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getLogManager",
args = {}
)
})
public void testCheckAccess() {
try {
manager.checkAccess();
} catch (SecurityException e) {
fail("securityException should not be thrown");
}
System.setSecurityManager(new MockSecurityManagerLogPermission());
mockManager.addLogger(new MockLogger("abc", null));
mockManager.getLogger("");
mockManager.getLoggerNames();
mockManager.getProperty(".level");
LogManager.getLogManager();
try {
manager.checkAccess();
fail("should throw securityException");
} catch (SecurityException e) {
}
System.setSecurityManager(securityManager);
}
@TestTargets({
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Verifies SecurityException.",
method = "readConfiguration",
args = {java.io.InputStream.class}
),
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Verifies SecurityException.",
method = "readConfiguration",
args = {}
),
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Verifies SecurityException.",
method = "checkAccess",
args = {}
),
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Verifies SecurityException.",
method = "reset",
args = {}
),
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Verifies SecurityException.",
method = "getLogManager",
args = {}
),
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Verifies SecurityException.",
method = "addPropertyChangeListener",
args = {java.beans.PropertyChangeListener.class}
)
})
public void testLoggingPermission() throws IOException {
System.setSecurityManager(new MockSecurityManagerLogPermission());
mockManager.addLogger(new MockLogger("abc", null));
mockManager.getLogger("");
mockManager.getLoggerNames();
mockManager.getProperty(".level");
LogManager.getLogManager();
try {
manager.checkAccess();
fail("should throw securityException");
} catch (SecurityException e) {
}
try {
mockManager.readConfiguration();
fail("should throw SecurityException");
} catch (SecurityException e) {
}
try {
mockManager.readConfiguration(EnvironmentHelper.PropertiesToInputStream(props));
fail("should throw SecurityException");
} catch (SecurityException e) {
}
try {
mockManager.readConfiguration(null);
fail("should throw SecurityException");
} catch (SecurityException e) {
}
try {
mockManager
.addPropertyChangeListener(new MockPropertyChangeListener());
fail("should throw SecurityException");
} catch (SecurityException e) {
}
try {
mockManager.addPropertyChangeListener(null);
fail("should throw NPE");
} catch (NullPointerException e) {
}
try {
mockManager.removePropertyChangeListener(null);
fail("should throw SecurityException");
} catch (SecurityException e) {
}
try {
mockManager.reset();
fail("should throw SecurityException");
} catch (SecurityException e) {
}
System.setSecurityManager(securityManager);
}
@TestTargets({
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "readConfiguration",
args = {java.io.InputStream.class}
),
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "getProperty",
args = {java.lang.String.class}
)
})
public void testMockGetProperty() throws Exception {
// mock manager doesn't read configuration until you call
// readConfiguration()
Logger root = new MockLogger("", null);
assertTrue(mockManager.addLogger(root));
root = mockManager.getLogger("");
checkPropertyNull(mockManager);
assertEquals(0, root.getHandlers().length);
assertNull(root.getLevel());
mockManager.readConfiguration(EnvironmentHelper.PropertiesToInputStream(props));
assertEquals(Level.FINE, root.getLevel());
checkProperty(mockManager);
mockManager.reset();
checkPropertyNull(mockManager);
assertEquals(Level.INFO, root.getLevel());
assertEquals(0, mockManager.getLogger("").getHandlers().length);
}
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getProperty",
args = {java.lang.String.class}
)
public void testGetProperty() throws SecurityException, IOException {
Logger root = manager.getLogger("");
manager.readConfiguration(EnvironmentHelper.PropertiesToInputStream(props));
checkProperty(manager);
assertEquals(2, root.getHandlers().length);
assertEquals(Level.FINE, root.getLevel());
manager.reset();
checkPropertyNull(manager);
assertEquals(0, root.getHandlers().length);
assertEquals(Level.INFO, root.getLevel());
manager.readConfiguration(EnvironmentHelper.PropertiesToInputStream(props));
manager.reset();
}
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Verifies NullPointerException.",
method = "readConfiguration",
args = {java.io.InputStream.class}
)
public void testReadConfiguration_null() throws SecurityException, IOException {
try {
manager.readConfiguration(null);
fail("should throw null pointer exception");
} catch (NullPointerException e) {
}
}
private static void checkPropertyNull(LogManager m) {
// assertNull(m.getProperty(".level"));
assertNull(m.getProperty("java.util.logging.FileHandler.limit"));
assertNull(m.getProperty("java.util.logging.ConsoleHandler.formatter"));
// assertNull(m.getProperty("handlers"));
assertNull(m.getProperty("java.util.logging.FileHandler.count"));
assertNull(m.getProperty("com.xyz.foo.level"));
assertNull(m.getProperty("java.util.logging.FileHandler.formatter"));
assertNull(m.getProperty("java.util.logging.ConsoleHandler.level"));
assertNull(m.getProperty("java.util.logging.FileHandler.pattern"));
}
private static void checkProperty(LogManager m) {
// assertEquals(m.getProperty(".level"), "INFO");
assertEquals(m.getProperty("java.util.logging.FileHandler.limit"), "50000");
assertEquals(m.getProperty("java.util.logging.ConsoleHandler.formatter"),
"java.util.logging.SimpleFormatter");
// assertEquals(m.getProperty("handlers"),
// "java.util.logging.ConsoleHandler");
assertEquals(m.getProperty("java.util.logging.FileHandler.count"), "5");
assertEquals(m.getProperty("LogManagerTestFoo.level"), "WARNING");
assertEquals(m.getProperty("java.util.logging.FileHandler.formatter"),
"java.util.logging.XMLFormatter");
assertEquals(m.getProperty("java.util.logging.ConsoleHandler.level"), "OFF");
assertEquals(m.getProperty("java.util.logging.FileHandler.pattern"), "%h/java%u.log");
}
// public void testReadConfiguration() throws SecurityException, IOException {
// FIXME: move the support_exec
// Logger foo = new MockLogger("foo", null);
// assertNull(foo.getLevel());
// assertTrue(mockManager.addLogger(foo));
//
// Logger fo = new MockLogger("foo2", null);
// fo.setLevel(Level.ALL);
// assertTrue(mockManager.addLogger(fo));
//
// Handler h = new ConsoleHandler();
// Level l = h.getLevel();
// assertNotSame(Level.OFF, h.getLevel());
//
// // read configuration
// mockManager.readConfiguration();
// // level DO has effect
// assertEquals(Level.WARNING, foo.getLevel());
// // for non specified logger, level is reset to null
// assertNull(fo.getLevel());
//
// // read properties don't affect handler
// assertNotSame(Level.OFF, h.getLevel());
// assertSame(l, h.getLevel());
//
// }
/*
* Class under test for void readConfiguration(InputStream)
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "readConfiguration",
args = {java.io.InputStream.class}
)
public void testReadConfigurationInputStream() throws IOException {
Logger foo = new MockLogger(FOO, null);
assertNull(foo.getLevel());
assertTrue(mockManager.addLogger(foo));
Logger fo = new MockLogger(FOO + "2", null);
fo.setLevel(Level.ALL);
assertTrue(mockManager.addLogger(fo));
Handler h = new ConsoleHandler();
Level l = h.getLevel();
assertSame(Level.INFO, h.getLevel());
// read configuration from stream
InputStream stream = EnvironmentHelper.PropertiesToInputStream(props);
mockManager.readConfiguration(stream);
stream.close();
// level DOES have an effect on LogManagerTestFoo
assertEquals(Level.WARNING, foo.getLevel());
// for non specified logger, level is reset to null
assertNull(fo.getLevel());
// read properties don't affect handler
assertSame(Level.INFO, h.getLevel());
assertSame(l, h.getLevel());
}
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Verifies NullPointerException.",
method = "readConfiguration",
args = {java.io.InputStream.class}
)
public void testReadConfigurationInputStream_null() throws SecurityException, IOException {
try {
mockManager.readConfiguration(null);
fail("should throw null pointer exception");
} catch (NullPointerException e) {
}
}
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Verifies IOException.",
method = "readConfiguration",
args = {java.io.InputStream.class}
)
public void testReadConfigurationInputStream_IOException_1parm() throws SecurityException {
try {
mockManager.readConfiguration(new MockInputStream());
fail("should throw IOException");
} catch (IOException e) {
//ignore
}
}
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "readConfiguration",
args = {java.io.InputStream.class}
)
public void testReadConfigurationInputStream_root() throws IOException {
manager.readConfiguration(EnvironmentHelper.PropertiesToInputStream(props));
Logger logger = new MockLogger("testReadConfigurationInputStream_root.foo", null);
Logger root = manager.getLogger("");
Logger logger2 = Logger.getLogger("testReadConfigurationInputStream_root.foo2");
manager.addLogger(logger);
assertNull(logger.getLevel());
assertEquals(0, logger.getHandlers().length);
assertSame(root, logger.getParent());
assertNull(logger2.getLevel());
assertEquals(0, logger2.getHandlers().length);
assertSame(root, logger2.getParent());
// if (!hasConfigClass) {
assertEquals(Level.FINE, root.getLevel());
assertEquals(2, root.getHandlers().length);
// }
// after read stream
InputStream stream = EnvironmentHelper.PropertiesToInputStream(props);
manager.readConfiguration(stream);
stream.close();
assertEquals(Level.FINE, root.getLevel());
assertEquals(2, root.getHandlers().length);
assertNull(logger.getLevel());
assertEquals(0, logger.getHandlers().length);
manager.reset();
}
@TestTargets({
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "addPropertyChangeListener",
args = {java.beans.PropertyChangeListener.class}
),
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "removePropertyChangeListener",
args = {java.beans.PropertyChangeListener.class}
)
})
public void testAddRemovePropertyChangeListener() throws Exception {
MockPropertyChangeListener listener1 = new MockPropertyChangeListener();
MockPropertyChangeListener listener2 = new MockPropertyChangeListener();
// add same listener1 two times
mockManager.addPropertyChangeListener(listener1);
mockManager.addPropertyChangeListener(listener1);
mockManager.addPropertyChangeListener(listener2);
assertNull(listener1.getEvent());
assertNull(listener2.getEvent());
mockManager.readConfiguration(EnvironmentHelper.PropertiesToInputStream(props));
// if (!hasConfigClass) {
assertNotNull(listener1.getEvent());
assertNotNull(listener2.getEvent());
// }
listener1.reset();
listener2.reset();
// remove listener1, no effect
mockManager.removePropertyChangeListener(listener1);
mockManager.readConfiguration(EnvironmentHelper
.PropertiesToInputStream(props));
assertNotNull(listener1.getEvent());
assertNotNull(listener2.getEvent());
listener1.reset();
listener2.reset();
// remove listener1 again and it works
mockManager.removePropertyChangeListener(listener1);
mockManager.readConfiguration(EnvironmentHelper
.PropertiesToInputStream(props));
assertNull(listener1.getEvent());
assertNotNull(listener2.getEvent());
listener2.reset();
// reset don't produce event
mockManager.reset();
assertNull(listener2.getEvent());
mockManager.removePropertyChangeListener(listener2);
mockManager.readConfiguration(EnvironmentHelper.PropertiesToInputStream(props));
assertNull(listener1.getEvent());
assertNull(listener2.getEvent());
}
@TestTargets({
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "addPropertyChangeListener",
args = {java.beans.PropertyChangeListener.class}
),
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "removePropertyChangeListener",
args = {java.beans.PropertyChangeListener.class}
)
})
public void testAddRemovePropertyChangeListener_null() {
// seems nothing happened
try{
mockManager.addPropertyChangeListener(null);
fail("Should throw NPE");
}catch(NullPointerException e){
}
mockManager.removePropertyChangeListener(null);
}
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Doesn't verify SecurityException.",
method = "reset",
args = {}
)
public void testReset() throws SecurityException, IOException {
// mock LogManager
mockManager.readConfiguration(EnvironmentHelper.PropertiesToInputStream(props));
assertNotNull(mockManager.getProperty("handlers"));
Logger foo = new MockLogger(FOO, null);
assertNull(foo.getLevel());
assertEquals(0, foo.getHandlers().length);
foo.setLevel(Level.ALL);
foo.addHandler(new ConsoleHandler());
assertTrue(mockManager.addLogger(foo));
assertEquals(Level.WARNING, foo.getLevel());
assertEquals(2, foo.getHandlers().length);
// reset
mockManager.reset();
// properties is cleared
assertNull(mockManager.getProperty("handlers"));
// level is null
assertNull(foo.getLevel());
// handlers are all closed
assertEquals(0, foo.getHandlers().length);
// for root logger
manager.reset();
assertNull(manager.getProperty("handlers"));
Logger root = manager.getLogger("");
// level reset to info
assertEquals(Level.INFO, root.getLevel());
// also close root's handler
assertEquals(0, root.getHandlers().length);
}
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Doesn't verify SecurityException.",
method = "readConfiguration",
args = {java.io.InputStream.class}
)
public void testGlobalPropertyConfig() throws Exception {
PrintStream err = System.err;
try {
System.setErr(new PrintStream(new NullOutputStream()));
// before add config property, root has two handler
manager.readConfiguration(EnvironmentHelper.PropertiesToInputStream(props));
assertEquals(2, manager.getLogger("").getHandlers().length);
// one valid config class
props.setProperty("config", className + "$MockValidConfig");
manager.readConfiguration(EnvironmentHelper.PropertiesToInputStream(props));
assertEquals(3, manager.getLogger("").getHandlers().length);
// two config class take effect orderly
props.setProperty("config", className + "$MockValidConfig " + className
+ "$MockValidConfig2");
manager.readConfiguration(EnvironmentHelper.PropertiesToInputStream(props));
assertEquals(2, manager.getLogger("").getHandlers().length);
props.setProperty("config", className + "$MockValidConfig2 " + className
+ "$MockValidConfig");
manager.readConfiguration(EnvironmentHelper.PropertiesToInputStream(props));
assertEquals(3, manager.getLogger("").getHandlers().length);
// invalid config class which throw exception, just print exception
// and
// message
props.setProperty("config", className + "$MockInvalidConfigException");
manager.readConfiguration(EnvironmentHelper.PropertiesToInputStream(props));
// invalid config class without default constructor, just print
// exception and message
props.setProperty("config", className + "$MockInvalidConfigNoDefaultConstructor");
manager.readConfiguration(EnvironmentHelper.PropertiesToInputStream(props));
// bad config class name, just print exception and message
props.setProperty("config", "badname");
manager.readConfiguration(EnvironmentHelper.PropertiesToInputStream(props));
// invalid separator, nothing happened
props.setProperty("config", className + "$MockValidConfig2;" + className
+ "$MockValidConfig");
manager.readConfiguration(EnvironmentHelper.PropertiesToInputStream(props));
assertEquals(2, manager.getLogger("").getHandlers().length);
props.setProperty("config", className + "$MockValidConfig2;" + className
+ "$MockValidConfig " + className + "$MockValidConfig");
manager.readConfiguration(EnvironmentHelper.PropertiesToInputStream(props));
assertEquals(3, manager.getLogger("").getHandlers().length);
// duplicate config class, take effect twice
props.setProperty("config", className + "$MockValidConfig " + className
+ "$MockValidConfig");
manager.readConfiguration(EnvironmentHelper.PropertiesToInputStream(props));
assertEquals(4, manager.getLogger("").getHandlers().length);
// invalid config classes mixed with valid config classes, valid
// config
// classes take effect
props.setProperty("config", "badname " + className + "$MockValidConfig " + className
+ "$MockInvalidConfigNoDefaultConstructor " + className + "$MockValidConfig");
manager.readConfiguration(EnvironmentHelper.PropertiesToInputStream(props));
assertEquals(4, manager.getLogger("").getHandlers().length);
// global property take effect before logger specified property
props.setProperty("config", className + "$MockValidConfig");
manager.readConfiguration(EnvironmentHelper.PropertiesToInputStream(props));
assertEquals(Level.FINE, manager.getLogger("").getLevel());
} finally {
System.setErr(err);
manager.reset();
}
}
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "readConfiguration",
args = {}
)
public void testValidConfigClass() throws Exception {
String oldProperty = System.getProperty("java.util.logging.config.class");
try {
// System.setProperty("java.util.logging.config.class", "org.apache.harmony.logging.tests.java.util.logging.LogManagerTest$ConfigClass");
System.setProperty("java.util.logging.config.class", this.getClass().getName()
+ "$ConfigClass");
assertNull(manager.getLogger("testConfigClass.foo"));
manager.readConfiguration();
assertNull(manager.getLogger("testConfigClass.foo"));
Logger l = Logger.getLogger("testConfigClass.foo.child");
assertSame(Level.FINEST, manager.getLogger("").getLevel());
assertEquals(0, manager.getLogger("").getHandlers().length);
assertEquals("testConfigClass.foo", l.getParent().getName());
} finally {
if (oldProperty != null) {
System.setProperty("java.util.logging.config.class", oldProperty);
}
}
}
/*
* ----------------------------------------------------
* mock classes
* ----------------------------------------------------
*/
public static class ConfigClass {
public ConfigClass() throws Exception {
LogManager man = LogManager.getLogManager();
Properties props = new Properties();
props.put("handlers", className + "$MockHandler " + className + "$MockHandler");
props.put("java.util.logging.FileHandler.pattern", "%h/java%u.log");
props.put("java.util.logging.FileHandler.limit", "50000");
props.put("java.util.logging.FileHandler.count", "5");
props.put("java.util.logging.FileHandler.formatter", "java.util.logging.XMLFormatter");
props.put(".level", "FINE");
props.put("java.util.logging.ConsoleHandler.level", "OFF");
props.put("java.util.logging.ConsoleHandler.formatter","java.util.logging.SimpleFormatter");
props.put("LogManagerTestFoo.handlers", "java.util.logging.ConsoleHandler");
props.put("LogManagerTestFoo.level", "WARNING");
props.put("testConfigClass.foo.level", "OFF");
props.put("testConfigClass.foo.handlers", "java.util.logging.ConsoleHandler");
props.put(".level", "FINEST");
props.remove("handlers");
InputStream in = EnvironmentHelper.PropertiesToInputStream(props);
man.readConfiguration(in);
}
}
public static class MockInvalidInitClass {
public MockInvalidInitClass() {
throw new RuntimeException();
}
}
public static class TestInvalidConfigFile {
public static void main(String[] args) {
LogManager manager = LogManager.getLogManager();
Logger root = manager.getLogger("");
checkPropertyNull(manager);
assertEquals(0, root.getHandlers().length);
assertEquals(Level.INFO, root.getLevel());
try {
manager.readConfiguration();
} catch (Exception e) {
e.printStackTrace();
}
checkProperty(manager);
assertNull(root.getHandlers()[0].getLevel());
assertEquals(1, root.getHandlers().length);
assertEquals(Level.INFO, root.getLevel());
manager.reset();
checkProperty(manager);
assertEquals(0, root.getHandlers().length);
assertEquals(Level.INFO, root.getLevel());
try {
manager.readConfiguration();
} catch (Exception e) {
e.printStackTrace();
}
manager.reset();
}
}
public static class TestValidConfigFile {
public static void main(String[] args) {
LogManager manager = LogManager.getLogManager();
Logger root = manager.getLogger("");
checkPropertyNull(manager);
assertEquals(2, root.getHandlers().length);
assertEquals(root.getHandlers()[0].getLevel(), Level.OFF);
assertEquals(Level.ALL, root.getLevel());
try {
manager.readConfiguration();
} catch (Exception e) {
e.printStackTrace();
}
checkPropertyNull(manager);
assertEquals(root.getHandlers()[0].getLevel(), Level.OFF);
assertEquals(2, root.getHandlers().length);
assertEquals(Level.ALL, root.getLevel());
manager.reset();
checkPropertyNull(manager);
assertEquals(0, root.getHandlers().length);
assertEquals(Level.INFO, root.getLevel());
try {
manager.readConfiguration();
} catch (Exception e) {
e.printStackTrace();
}
manager.reset();
}
}
public static class TestMockLogManager {
public static void main(String[] args) {
LogManager manager = LogManager.getLogManager();
assertTrue(manager instanceof MockLogManager);
}
}
public static class TestValidConfigClass {
public static void main(String[] args) {
LogManager manager = LogManager.getLogManager();
Logger root = manager.getLogger("");
checkPropertyNull(manager);
assertEquals(1, root.getHandlers().length);
assertEquals(Level.OFF, root.getLevel());
try {
manager.readConfiguration();
} catch (Exception e) {
e.printStackTrace();
}
checkPropertyNull(manager);
assertEquals(1, root.getHandlers().length);
assertEquals(Level.OFF, root.getLevel());
try {
manager.readConfiguration();
} catch (Exception e) {
e.printStackTrace();
}
checkPropertyNull(manager);
assertEquals(1, root.getHandlers().length);
assertEquals(Level.OFF, root.getLevel());
manager.reset();
checkPropertyNull(manager);
assertEquals(0, root.getHandlers().length);
assertEquals(Level.INFO, root.getLevel());
try {
manager.readConfiguration();
} catch (Exception e) {
e.printStackTrace();
}
manager.reset();
}
}
public static class MockLogger extends Logger {
public MockLogger(String name, String rbName) {
super(name, rbName);
}
}
public static class MockLogManager extends LogManager {
}
public static class MockHandler extends Handler {
static int number = 0;
public MockHandler() {
addNumber();
// System.out.println(this + ":start:" + number);
}
private synchronized void addNumber() {
number++;
}
public void close() {
minusNumber();
// System.out.println(this + ":close:" + number);
}
private synchronized void minusNumber() {
number--;
}
public void flush() {
// System.out.println(this + ":flush");
}
public void publish(LogRecord record) {
}
}
public static class MockValidInitClass {
public MockValidInitClass() {
Properties p = new Properties();
p.put("handlers", className + "$MockHandler");
p.put(".level", "OFF");
InputStream in = null;
try {
in = EnvironmentHelper.PropertiesToInputStream(p);
LogManager manager = LogManager.getLogManager();
manager.readConfiguration(in);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (Exception e) {
}
}
}
}
public static class MockValidConfig {
public MockValidConfig() {
handler = new MockHandler();
LogManager manager = LogManager.getLogManager();
Logger root = null;
if (null != manager) {
root = manager.getLogger("");
} else {
System.out.println("null manager");
}
if (null != root) {
root.addHandler(handler);
root.setLevel(Level.OFF);
}
}
}
public static class MockValidConfig2 {
static Logger root = null;
public MockValidConfig2() {
root = LogManager.getLogManager().getLogger("");
root.removeHandler(handler);
}
}
public static class MockInvalidConfigException {
public MockInvalidConfigException() {
throw new RuntimeException("invalid config class - throw exception");
}
}
public static class MockInvalidConfigNoDefaultConstructor {
public MockInvalidConfigNoDefaultConstructor(int i) {
throw new RuntimeException("invalid config class - no default constructor");
}
}
public static class MockPropertyChangeListener implements
PropertyChangeListener {
PropertyChangeEvent event = null;
public void propertyChange(PropertyChangeEvent event) {
this.event = event;
}
public PropertyChangeEvent getEvent() {
return event;
}
public void reset() {
event = null;
}
}
public static class MockSecurityManagerLogPermission extends SecurityManager {
public void checkPermission(Permission permission, Object context) {
if (permission instanceof LoggingPermission) {
throw new SecurityException();
}
}
public void checkPermission(Permission permission) {
if (permission instanceof LoggingPermission) {
StackTraceElement[] stack = (new Throwable()).getStackTrace();
for (int i = 0; i < stack.length; i++) {
if (stack[i].getClassName().equals("java.util.logging.Logger")) {
return;
}
}
throw new SecurityException("Found LogManager checkAccess()");
}
}
}
public static class MockSecurityManagerOtherPermission extends SecurityManager {
public void checkPermission(Permission permission, Object context) {
if (permission instanceof LoggingPermission) {
return;
}
if (permission.getName().equals("setSecurityManager")) {
return;
}
// throw new SecurityException();
super.checkPermission(permission, context);
}
public void checkPermission(Permission permission) {
if (permission instanceof LoggingPermission) {
return;
}
if (permission.getName().equals("setSecurityManager")) {
return;
}
super.checkPermission(permission);
}
}
/*
* Test config class loading
* java -Djava.util.logging.config.class=badConfigClassName ClassLoadingTest
*/
public static class ClassLoadingTest {
public static void main(String[] args) {
Thread.currentThread().setContextClassLoader(new MockErrorClassLoader());
try {
LogManager.getLogManager();
fail("Should throw mock error");
} catch (MockError e) {
}
}
static class MockErrorClassLoader extends ClassLoader {
public Class<?> loadClass(String name) {
throw new MockError();
}
}
static class MockError extends Error {
}
}
public static class MockInputStream extends InputStream {
@Override
public int read() throws IOException {
throw new IOException();
}
}
}