blob: e5cdaa82d23d2e8315f5157714ef270f00ea2605 [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.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.StringWriter;
import java.security.Permission;
import java.util.Properties;
import java.util.logging.Filter;
import java.util.logging.Formatter;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.LogRecord;
import java.util.logging.LoggingPermission;
import java.util.logging.MemoryHandler;
import java.util.logging.SimpleFormatter;
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;
/**
*
*/
public class MemoryHandlerTest extends TestCase {
final static LogManager manager = LogManager.getLogManager();
final static Properties props = new Properties();
final static String baseClassName = MemoryHandlerTest.class.getName();
final static StringWriter writer = new StringWriter();
private final PrintStream err = System.err;
private OutputStream errSubstituteStream = null;
MemoryHandler handler;
Handler target = new MockHandler();
/*
* @see TestCase#setUp()
*/
protected void setUp() throws Exception {
super.setUp();
manager.reset();
initProps();
manager.readConfiguration(EnvironmentHelper
.PropertiesToInputStream(props));
handler = new MemoryHandler();
errSubstituteStream = new NullOutputStream();
System.setErr(new PrintStream(errSubstituteStream));
}
/**
*
*/
private void initProps() {
props.put("java.util.logging.MemoryHandler.level", "FINE");
props.put("java.util.logging.MemoryHandler.filter", baseClassName
+ "$MockFilter");
props.put("java.util.logging.MemoryHandler.size", "2");
props.put("java.util.logging.MemoryHandler.push", "WARNING");
props.put("java.util.logging.MemoryHandler.target", baseClassName
+ "$MockHandler");
props.put("java.util.logging.MemoryHandler.formatter", baseClassName
+ "$MockFormatter");
}
/*
* @see TestCase#tearDown()
*/
protected void tearDown() throws Exception {
super.tearDown();
manager.readConfiguration();
props.clear();
System.setErr(err);
}
public void testClose() {
Filter filter = handler.getFilter();
Formatter formatter = handler.getFormatter();
writer.getBuffer().setLength(0);
handler.close();
assertEquals(writer.toString(), "close");
assertEquals(handler.getFilter(), filter);
assertEquals(handler.getFormatter(), formatter);
assertNull(handler.getEncoding());
assertNotNull(handler.getErrorManager());
assertEquals(handler.getLevel(), Level.OFF);
assertEquals(handler.getPushLevel(), Level.WARNING);
assertFalse(handler.isLoggable(new LogRecord(Level.SEVERE, "test")));
}
public void testFlush() {
Filter filter = handler.getFilter();
Formatter formatter = handler.getFormatter();
writer.getBuffer().setLength(0);
handler.flush();
assertEquals(writer.toString(), "flush");
assertEquals(handler.getFilter(), filter);
assertEquals(handler.getFormatter(), formatter);
assertNull(handler.getEncoding());
assertNotNull(handler.getErrorManager());
assertEquals(handler.getLevel(), Level.FINE);
assertEquals(handler.getPushLevel(), Level.WARNING);
assertTrue(handler.isLoggable(new LogRecord(Level.SEVERE, "test")));
}
public void testIsLoggable() {
try {
handler.isLoggable(null);
fail("should throw NullPointerException");
} catch (NullPointerException e) {
// expected
}
LogRecord record = new LogRecord(Level.FINER, "MSG1");
assertFalse(handler.isLoggable(record));
record = new LogRecord(Level.FINE, "MSG2");
assertTrue(handler.isLoggable(record));
record = new LogRecord(Level.CONFIG, "MSG3");
assertTrue(handler.isLoggable(record));
record = new LogRecord(Level.CONFIG, "false");
assertFalse(handler.isLoggable(record));
handler.setFilter(null);
record = new LogRecord(Level.CONFIG, "false");
assertTrue(handler.isLoggable(record));
}
/*
* Class under test for void MemoryHandler()
*/
public void testMemoryHandler() {
assertTrue(handler.getFilter() instanceof MockFilter);
assertTrue(handler.getFormatter() instanceof MockFormatter);
assertNull(handler.getEncoding());
assertNotNull(handler.getErrorManager());
assertEquals(handler.getLevel(), Level.FINE);
assertEquals(handler.getPushLevel(), Level.WARNING);
}
public void testMemoryHandlerInvalidProps() throws IOException {
// null target
try {
props.remove("java.util.logging.MemoryHandler.target");
manager.readConfiguration(EnvironmentHelper
.PropertiesToInputStream(props));
handler = new MemoryHandler();
fail("should throw RuntimeException: target must be set");
} catch (RuntimeException e) {
}
// invalid target
try {
props.put("java.util.logging.MemoryHandler.target", "badname");
manager.readConfiguration(EnvironmentHelper
.PropertiesToInputStream(props));
handler = new MemoryHandler();
fail("should throw RuntimeException: target must be valid");
} catch (RuntimeException e) {
}
// invalid formatter
initProps();
props.put("java.util.logging.MemoryHandler.formatter", "badname");
manager.readConfiguration(EnvironmentHelper
.PropertiesToInputStream(props));
handler = new MemoryHandler();
assertTrue(handler.getFormatter() instanceof SimpleFormatter);
// invalid level
initProps();
props.put("java.util.logging.MemoryHandler.level", "badname");
manager.readConfiguration(EnvironmentHelper
.PropertiesToInputStream(props));
handler = new MemoryHandler();
assertEquals(handler.getLevel(), Level.ALL);
// invalid pushlevel
initProps();
props.put("java.util.logging.MemoryHandler.push", "badname");
manager.readConfiguration(EnvironmentHelper
.PropertiesToInputStream(props));
handler = new MemoryHandler();
assertEquals(handler.getPushLevel(), Level.SEVERE);
// invalid filter
initProps();
props.put("java.util.logging.MemoryHandler.filter", "badname");
manager.readConfiguration(EnvironmentHelper
.PropertiesToInputStream(props));
handler = new MemoryHandler();
assertNull(handler.getFilter());
// invalid size
initProps();
props.put("java.util.logging.MemoryHandler.size", "-1");
manager.readConfiguration(EnvironmentHelper
.PropertiesToInputStream(props));
handler = new MemoryHandler();
initProps();
props.put("java.util.logging.MemoryHandler.size", "badsize");
manager.readConfiguration(EnvironmentHelper
.PropertiesToInputStream(props));
handler = new MemoryHandler();
}
public void testMemoryHandlerDefaultValue() throws SecurityException,
IOException {
props.clear();
props.put("java.util.logging.MemoryHandler.target", baseClassName
+ "$MockHandler");
manager.readConfiguration(EnvironmentHelper
.PropertiesToInputStream(props));
handler = new MemoryHandler();
assertNull(handler.getFilter());
assertTrue(handler.getFormatter() instanceof SimpleFormatter);
assertNull(handler.getEncoding());
assertNotNull(handler.getErrorManager());
assertEquals(handler.getLevel(), Level.ALL);
assertEquals(handler.getPushLevel(), Level.SEVERE);
}
/*
* Class under test for void MemoryHandler(Handler, int, Level)
*/
public void testMemoryHandlerHandlerintLevel() {
handler = new MemoryHandler(target, 2, Level.FINEST);
assertTrue(handler.getFilter() instanceof MockFilter);
assertTrue(handler.getFormatter() instanceof MockFormatter);
assertNull(handler.getEncoding());
assertNotNull(handler.getErrorManager());
assertEquals(handler.getLevel(), Level.FINE);
assertEquals(handler.getPushLevel(), Level.FINEST);
assertNull(target.getFormatter());
try {
handler = new MemoryHandler(null, 2, Level.FINEST);
fail("should throw NullPointerException");
} catch (NullPointerException e) {
}
try {
handler = new MemoryHandler(target, 2, null);
fail("should throw NullPointerException");
} catch (NullPointerException e) {
}
try {
handler = new MemoryHandler(target, 0, Level.FINEST);
fail("should throw IllegalArgumentException");
} catch (IllegalArgumentException e) {
}
try {
handler = new MemoryHandler(target, -1, Level.FINEST);
fail("should throw IllegalArgumentException");
} catch (IllegalArgumentException e) {
}
}
public void testGetPushLevel() {
try {
handler.setPushLevel(null);
fail("should throw NullPointerException");
} catch (NullPointerException e) {
}
handler.setPushLevel(Level.parse("123"));
assertEquals(handler.getPushLevel(), Level.parse("123"));
}
public void testSetPushLevel() {
// change push level don't trigger push action
writer.getBuffer().setLength(0);
LogRecord lr = new LogRecord(Level.CONFIG, "lr");
assertTrue(handler.isLoggable(lr));
handler.publish(lr);
assertEquals(writer.toString(), "");
// assertEquals(writer.toString(), "flush");
writer.getBuffer().setLength(0);
handler.setPushLevel(Level.FINE);
assertEquals(writer.toString(), "");
handler.publish(lr);
assertEquals(writer.toString(), lr.getMessage() + lr.getMessage());
}
public void testPushPublic() {
writer.getBuffer().setLength(0);
// loggable but don't trig push
handler.publish(new LogRecord(Level.CONFIG, "MSG1"));
assertEquals("", writer.toString());
// trig push
handler.publish(new LogRecord(Level.SEVERE, "MSG2"));
assertEquals(writer.toString(), "MSG1MSG2");
writer.getBuffer().setLength(0);
// regression test for Harmony-1292
handler.publish(new LogRecord(Level.WARNING, "MSG"));
assertEquals("MSG", writer.toString());
writer.getBuffer().setLength(0);
// push nothing
handler.push();
assertEquals("", writer.toString());
// loggable but not push
handler.publish(new LogRecord(Level.CONFIG, "MSG3"));
assertEquals("", writer.toString());
// not loggable
handler.publish(new LogRecord(Level.FINEST, "MSG4"));
assertEquals("", writer.toString());
// loggable but not push
handler.publish(new LogRecord(Level.CONFIG, "MSG5"));
assertEquals("", writer.toString());
// not loggable
handler.publish(new LogRecord(Level.FINER, "MSG6"));
assertEquals("", writer.toString());
// not loggable
handler.publish(new LogRecord(Level.FINER, "false"));
assertEquals("", writer.toString());
// loggable but not push
handler.publish(new LogRecord(Level.CONFIG, "MSG8"));
assertEquals("", writer.toString());
// push all
handler.push();
assertEquals(writer.toString(), "MSG5MSG8");
writer.getBuffer().setLength(0);
handler.push();
assertEquals("", writer.toString());
}
/*
* mock classes
*/
public static class MockFilter implements Filter {
public boolean isLoggable(LogRecord record) {
return !record.getMessage().equals("false");
}
}
public static class MockHandler extends Handler {
public void close() {
writer.write("close");
}
public void flush() {
writer.write("flush");
}
public void publish(LogRecord record) {
writer.write(record.getMessage());
}
}
public static class MockFormatter extends Formatter {
public String format(LogRecord r) {
return r.getMessage();
}
}
}