/* * 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.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.PrintStream; import java.io.UnsupportedEncodingException; import java.util.ResourceBundle; //import java.util.logging.FileHandler; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.Logger; import java.util.logging.XMLFormatter; import junit.framework.TestCase; public class XMLFormatterTest extends TestCase { XMLFormatter formatter = null; MockHandler handler = null; LogRecord lr = null; protected void setUp() throws Exception { super.setUp(); formatter = new XMLFormatter(); handler = new MockHandler(); lr = new LogRecord(Level.SEVERE, "pattern"); } public void testLocalFormat() { // if set resource bundle, output will use localized message, // but put the original message into the key element // further more, if message pattern has no effect ResourceBundle rb = ResourceBundle .getBundle("bundles/java/util/logging/res"); lr.setResourceBundle(rb); lr.setMessage("pattern"); String result = formatter.format(lr); assertTrue(result.indexOf("<message>" + rb.getString("pattern") + "</message>") > 0); assertTrue(result.indexOf("<key>pattern</key>") > 0); lr.setMessage("msg"); result = formatter.format(lr); assertTrue(result.indexOf("<message>" + rb.getString("msg") + "</message>") > 0); assertTrue(result.indexOf("<key>msg</key>") > 0); lr.setMessage("pattern {0, number}"); result = formatter.format(lr); assertTrue(result.indexOf("<message>pattern {0, number}</message>") > 0); assertTrue(result.indexOf("<key>") < 0); // if message has no relevant localized message, use the original lr.setMessage("bad key"); result = formatter.format(lr); assertTrue(result.indexOf("<message>bad key</message>") > 0); assertTrue(result.indexOf("<key>") < 0); } public void testFullFormat() { lr.setSourceClassName("source class"); lr.setSourceMethodName("source method"); lr.setLoggerName("logger name"); lr.setMillis(0); lr.setThrown(new Throwable("message")); lr.setParameters(new Object[] { "100", "200" }); lr.setSequenceNumber(1); ResourceBundle rb = ResourceBundle .getBundle("bundles/java/util/logging/res"); lr.setResourceBundle(rb); lr.setResourceBundleName("rbname"); String output = formatter.format(lr); // System.out.println(output); assertTrue(output.indexOf("<record>") >= 0); assertTrue(output.indexOf("<date>") >= 0); assertTrue(output.indexOf("<millis>0</millis>") >= 0); assertTrue(output.indexOf("<sequence>") >= 0); assertTrue(output.indexOf("<level>SEVERE</level>") >= 0); assertTrue(output.indexOf("<thread>") >= 0); assertTrue(output.indexOf("<message>" + rb.getString("pattern") + "</message>") >= 0); assertTrue(output.indexOf("<logger>logger name</logger>") > 0); assertTrue(output.indexOf("<class>source class</class>") > 0); assertTrue(output.indexOf("<method>source method</method>") > 0); assertTrue(output.indexOf("<catalog>rbname</catalog>") > 0); assertTrue(output.indexOf("<param>100</param>") > 0); assertTrue(output.indexOf("<param>200</param>") > 0); assertTrue(output.indexOf("<exception>") > 0); assertTrue(output.indexOf("<key>pattern</key>") > 0); } public void testFormat() { String output = formatter.format(lr); // System.out.println(output); assertTrue(output.indexOf("<record>") >= 0); assertTrue(output.indexOf("<date>") >= 0); assertTrue(output.indexOf("<millis>") >= 0); assertTrue(output.indexOf("<sequence>") >= 0); assertTrue(output.indexOf("<level>SEVERE</level>") >= 0); assertTrue(output.indexOf("<thread>") >= 0); assertTrue(output.indexOf("<message>pattern</message>") >= 0); assertTrue(output.indexOf("<logger>") < 0); assertTrue(output.indexOf("<class>") < 0); assertTrue(output.indexOf("<method>") < 0); assertTrue(output.indexOf("<catalog>") < 0); assertTrue(output.indexOf("<param>") < 0); assertTrue(output.indexOf("<exception>") < 0); assertTrue(output.indexOf("<key>") < 0); } public void testGetHead() throws SecurityException, UnsupportedEncodingException { String result = formatter.getHead(handler); assertNull(handler.getEncoding()); // TODO: where do we get the default encoding from? // assertTrue(result.indexOf(defaultEncoding)>0); handler.setEncoding("ISO-8859-1"); String head = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" standalone=\"no\"?>"; String dtd = "<!DOCTYPE log SYSTEM \"logger.dtd\">"; String rootELement = "<log>"; result = formatter.getHead(handler); int headPos = result.indexOf(head); int dtdPos = result.indexOf(dtd); int rootPos = result.indexOf(rootELement); assertTrue(headPos >= 0); assertTrue(dtdPos > headPos); assertTrue(rootPos > dtdPos); handler.setEncoding(null); result = formatter.getHead(handler); assertNull(handler.getEncoding()); // assertTrue(result.indexOf(defaultEncoding)>0); // regression test for Harmony-1280 // make sure no NPE is thrown formatter.getHead(null); } public void testGetTail() { assertTrue(formatter.getTail(handler).indexOf("/log>") > 0); } public void testInvalidParameter() { formatter.getTail(null); try { formatter.format(null); fail(); } catch (NullPointerException e) { } formatter = new XMLFormatter(); lr = new LogRecord(Level.SEVERE, null); String output = formatter.format(lr); // System.out.println(formatter.getHead(handler)+output+formatter.getTail(handler)); assertTrue(output.indexOf("<message") > 0); } /* public class TestFileHandlerClass { Logger logger = Logger.getLogger(TestFileHandlerClass.class.getName()); public TestFileHandlerClass(String logFile) throws SecurityException, IOException { logger.addHandler(new FileHandler(logFile)); LogRecord logRecord = new LogRecord(Level.INFO, "message:<init>&"); logRecord.setLoggerName("<init>&"); logRecord.setThrown(new Exception("<init>&")); logRecord.setParameters(new String[] { "<init>&" }); logger.log(logRecord); } } public void test_TestFileHandlerClass_constructor() throws Exception { File logFile = new File(System.getProperty("user.home"), "TestFileHandlerClass.log"); logFile.deleteOnExit(); PrintStream out = System.out; PrintStream err = System.err; try { System.setOut(null); System.setErr(null); new TestFileHandlerClass(logFile.getCanonicalPath()); BufferedReader br = new BufferedReader(new FileReader(logFile)); String line = null; while ((line = br.readLine()) != null) { if (line.contains("<init>&")) { fail("should convert <init> to <init>"); break; } } } finally { System.setOut(out); System.setErr(err); } } */ public static class MockHandler extends Handler { public void close() { } public void flush() { } public void publish(LogRecord record) { } } }