| /* |
| * 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.AndroidOnly; |
| import dalvik.annotation.TestTargetClass; |
| import dalvik.annotation.TestTargets; |
| import dalvik.annotation.TestTargetNew; |
| import dalvik.annotation.TestLevel; |
| |
| import java.io.File; |
| import java.text.MessageFormat; |
| import java.util.Locale; |
| import java.util.Properties; |
| import java.util.ResourceBundle; |
| import java.util.logging.FileHandler; |
| import java.util.logging.Formatter; |
| import java.util.logging.Handler; |
| import java.util.logging.Level; |
| import java.util.logging.Logger; |
| import java.util.logging.LogManager; |
| import java.util.logging.LogRecord; |
| |
| import junit.framework.TestCase; |
| |
| import org.apache.harmony.logging.tests.java.util.logging.util.EnvironmentHelper; |
| |
| @TestTargetClass(Formatter.class) |
| public class FormatterTest extends TestCase { |
| Formatter f; |
| |
| LogRecord r; |
| |
| FileHandler h; |
| |
| static String MSG = "msg, pls. ignore it"; |
| |
| static LogManager manager = LogManager.getLogManager(); |
| |
| final static Properties props = new Properties(); |
| |
| final static String className = FormatterTest.class.getName(); |
| |
| final static String TEMPPATH = System.getProperty("java.io.tmpdir"); |
| |
| final static String SEP = File.separator; |
| |
| /* |
| * @see TestCase#setUp() |
| */ |
| protected void setUp() throws Exception { |
| super.setUp(); |
| manager.reset(); |
| |
| //initProp |
| props.clear(); |
| props.put("java.util.logging.FileHandler.level", "FINE"); |
| props.put("java.util.logging.FileHandler.filter", className |
| + "$MockFilter"); |
| props.put("java.util.logging.FileHandler.formatter", className |
| + "$MockFormatter"); |
| props.put("java.util.logging.FileHandler.encoding", "iso-8859-1"); |
| // limit to only two message |
| props.put("java.util.logging.FileHandler.limit", "1000"); |
| // rotation count is 2 |
| props.put("java.util.logging.FileHandler.count", "2"); |
| // using append mode |
| props.put("java.util.logging.FileHandler.append", "true"); |
| props.put("java.util.logging.FileHandler.pattern", |
| "%t/log/java%u.test"); |
| |
| File file = new File(TEMPPATH + SEP + "log"); |
| file.mkdir(); |
| manager.readConfiguration(EnvironmentHelper |
| .PropertiesToInputStream(props)); |
| |
| f = new MockFormatter(); |
| r = new LogRecord(Level.FINE, MSG); |
| h = new FileHandler(); |
| } |
| |
| /* |
| * test for constructor protected Formatter() |
| */ |
| @TestTargets({ |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "", |
| method = "Formatter", |
| args = {} |
| ), |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| notes = "", |
| method = "getHead", |
| args = {java.util.logging.Handler.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| notes = "", |
| method = "getTail", |
| args = {java.util.logging.Handler.class} |
| ) |
| }) |
| public void testFormatter() { |
| assertEquals("head string is not empty", "", f.getHead(null)); |
| assertEquals("tail string is not empty", "", f.getTail(null)); |
| |
| } |
| |
| /* |
| * test for method public String getHead(Handler h) |
| */ |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| notes = "", |
| method = "getHead", |
| args = {Handler.class} |
| ) |
| public void testGetHead() { |
| assertEquals("head string is not empty", "", f.getHead(null)); |
| assertEquals("head string is not empty", "", f.getHead(h)); |
| h.publish(r); |
| assertEquals("head string is not empty", "", f.getHead(h)); |
| } |
| |
| /* |
| * test for method public String getTail(Handler h) |
| */ |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| notes = "", |
| method = "getTail", |
| args = {Handler.class} |
| ) |
| public void testGetTail() { |
| assertEquals("tail string is not empty", "", f.getTail(null)); |
| assertEquals("tail string is not empty", "", f.getTail(h)); |
| h.publish(r); |
| assertEquals("tail string is not empty", "", f.getTail(h)); |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| notes = "", |
| method = "formatMessage", |
| args = {LogRecord.class} |
| ) |
| @AndroidOnly("The RI fails in this test because it uses a MessageFormat " + |
| "to format the message even though it doesn't contain \"{0\". " + |
| "The spec says that this would indicate that a MessageFormat " + |
| "should be used and else no formatting should be done.") |
| public void testFormatMessage() { |
| assertEquals(MSG, f.formatMessage(r)); |
| |
| String pattern = "test formatter {0, number}"; |
| r.setMessage(pattern); |
| assertEquals(pattern, f.formatMessage(r)); |
| |
| Object[] oa = new Object[0]; |
| r.setParameters(oa); |
| assertEquals(pattern, f.formatMessage(r)); |
| |
| oa = new Object[] { new Integer(100), new Float(1.2), new Float(2.2) }; |
| r.setParameters(oa); |
| assertEquals(MessageFormat.format(pattern, oa), f.formatMessage(r)); |
| |
| r.setMessage(MSG); |
| assertEquals(MSG, f.formatMessage(r)); |
| |
| pattern = "wrong pattern {0, asdfasfd}"; |
| r.setMessage(pattern); |
| assertEquals(pattern, f.formatMessage(r)); |
| |
| pattern = null; |
| r.setMessage(pattern); |
| assertNull(f.formatMessage(r)); |
| |
| // The RI fails in this test because it uses a MessageFormat to format |
| // the message even though it doesn't contain "{0". The spec says that |
| // this would indicate that a MessageFormat should be used and else no |
| // formatting should be done. |
| pattern = "pattern without 0 {1, number}"; |
| r.setMessage(pattern); |
| assertEquals(pattern, f.formatMessage(r)); |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| notes = "", |
| method = "formatMessage", |
| args = {LogRecord.class} |
| ) |
| public void testLocalizedFormatMessage() { |
| // normal case |
| r.setMessage("msg"); |
| ResourceBundle rb = ResourceBundle |
| .getBundle("bundles/java/util/logging/res"); |
| r.setResourceBundle(rb); |
| assertEquals(rb.getString("msg"), f.formatMessage(r)); |
| |
| // local message is a pattern |
| r.setMessage("pattern"); |
| Object[] oa = new Object[] { new Integer(3) }; |
| r.setParameters(oa); |
| assertEquals(MessageFormat.format(rb.getString("pattern"), oa), f |
| .formatMessage(r)); |
| |
| // key is a pattern, but local message is not |
| r.setMessage("pattern{0,number}"); |
| oa = new Object[] { new Integer(3) }; |
| r.setParameters(oa); |
| assertEquals(rb.getString("pattern{0,number}"), f.formatMessage(r)); |
| |
| // another bundle |
| rb = ResourceBundle.getBundle("bundles/java/util/logging/res", |
| Locale.US); |
| r.setMessage("msg"); |
| r.setResourceBundle(rb); |
| assertEquals(rb.getString("msg"), f.formatMessage(r)); |
| |
| // cannot find local message in bundle |
| r.setMessage("msg without locale"); |
| assertEquals("msg without locale", f.formatMessage(r)); |
| |
| // set bundle name but not bundle |
| r.setResourceBundle(null); |
| r.setResourceBundleName("bundles/java/util/logging/res"); |
| r.setMessage("msg"); |
| assertEquals("msg", f.formatMessage(r)); |
| } |
| |
| public static class MockFormatter extends Formatter { |
| |
| public String format(LogRecord arg0) { |
| return "format"; |
| } |
| } |
| } |