1/* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18package org.apache.harmony.logging.tests.java.util.logging; 19 20import java.io.BufferedReader; 21import java.io.File; 22import java.io.FileReader; 23import java.io.IOException; 24import java.io.PrintStream; 25import java.io.UnsupportedEncodingException; 26import java.util.ResourceBundle; 27import java.util.logging.FileHandler; 28import java.util.logging.Handler; 29import java.util.logging.Level; 30import java.util.logging.LogRecord; 31import java.util.logging.Logger; 32import java.util.logging.XMLFormatter; 33 34import junit.framework.TestCase; 35 36public class XMLFormatterTest extends TestCase { 37 38 XMLFormatter formatter = null; 39 40 MockHandler handler = null; 41 42 LogRecord lr = null; 43 44 protected void setUp() throws Exception { 45 super.setUp(); 46 formatter = new XMLFormatter(); 47 handler = new MockHandler(); 48 lr = new LogRecord(Level.SEVERE, "pattern"); 49 } 50 51 public void testLocalFormat() { 52 // if set resource bundle, output will use localized message, 53 // but put the original message into the key element 54 // further more, if message pattern has no effect 55 ResourceBundle rb = ResourceBundle 56 .getBundle("bundles/java/util/logging/res"); 57 lr.setResourceBundle(rb); 58 lr.setMessage("pattern"); 59 String result = formatter.format(lr); 60 assertTrue(result.indexOf("<message>" + rb.getString("pattern") 61 + "</message>") > 0); 62 assertTrue(result.indexOf("<key>pattern</key>") > 0); 63 64 lr.setMessage("msg"); 65 result = formatter.format(lr); 66 assertTrue(result.indexOf("<message>" + rb.getString("msg") 67 + "</message>") > 0); 68 assertTrue(result.indexOf("<key>msg</key>") > 0); 69 70 lr.setMessage("pattern {0, number}"); 71 result = formatter.format(lr); 72 assertTrue(result.indexOf("<message>pattern {0, number}</message>") > 0); 73 assertTrue(result.indexOf("<key>") < 0); 74 75 // if message has no relevant localized message, use the original 76 lr.setMessage("bad key"); 77 result = formatter.format(lr); 78 assertTrue(result.indexOf("<message>bad key</message>") > 0); 79 assertTrue(result.indexOf("<key>") < 0); 80 } 81 82 public void testFullFormat() { 83 lr.setSourceClassName("source class"); 84 lr.setSourceMethodName("source method"); 85 lr.setLoggerName("logger name"); 86 lr.setMillis(0); 87 lr.setThrown(new Throwable("message")); 88 lr.setParameters(new Object[] { "100", "200" }); 89 lr.setSequenceNumber(1); 90 ResourceBundle rb = ResourceBundle 91 .getBundle("bundles/java/util/logging/res"); 92 lr.setResourceBundle(rb); 93 lr.setResourceBundleName("rbname"); 94 String output = formatter.format(lr); 95 // System.out.println(output); 96 assertTrue(output.indexOf("<record>") >= 0); 97 assertTrue(output.indexOf("<date>") >= 0); 98 assertTrue(output.indexOf("<millis>0</millis>") >= 0); 99 assertTrue(output.indexOf("<sequence>") >= 0); 100 assertTrue(output.indexOf("<level>SEVERE</level>") >= 0); 101 assertTrue(output.indexOf("<thread>") >= 0); 102 assertTrue(output.indexOf("<message>" + rb.getString("pattern") 103 + "</message>") >= 0); 104 assertTrue(output.indexOf("<logger>logger name</logger>") > 0); 105 assertTrue(output.indexOf("<class>source class</class>") > 0); 106 assertTrue(output.indexOf("<method>source method</method>") > 0); 107 assertTrue(output.indexOf("<catalog>rbname</catalog>") > 0); 108 assertTrue(output.indexOf("<param>100</param>") > 0); 109 assertTrue(output.indexOf("<param>200</param>") > 0); 110 assertTrue(output.indexOf("<exception>") > 0); 111 assertTrue(output.indexOf("<key>pattern</key>") > 0); 112 } 113 114 public void testFormat() { 115 String output = formatter.format(lr); 116 // System.out.println(output); 117 assertTrue(output.indexOf("<record>") >= 0); 118 assertTrue(output.indexOf("<date>") >= 0); 119 assertTrue(output.indexOf("<millis>") >= 0); 120 assertTrue(output.indexOf("<sequence>") >= 0); 121 assertTrue(output.indexOf("<level>SEVERE</level>") >= 0); 122 assertTrue(output.indexOf("<thread>") >= 0); 123 assertTrue(output.indexOf("<message>pattern</message>") >= 0); 124 assertTrue(output.indexOf("<logger>") < 0); 125 assertTrue(output.indexOf("<class>") < 0); 126 assertTrue(output.indexOf("<method>") < 0); 127 assertTrue(output.indexOf("<catalog>") < 0); 128 assertTrue(output.indexOf("<param>") < 0); 129 assertTrue(output.indexOf("<exception>") < 0); 130 assertTrue(output.indexOf("<key>") < 0); 131 } 132 133 public void testGetHead() throws SecurityException, 134 UnsupportedEncodingException { 135 String result = formatter.getHead(handler); 136 assertNull(handler.getEncoding()); 137 // TODO: where do we get the default encoding from? 138 // assertTrue(result.indexOf(defaultEncoding)>0); 139 140 handler.setEncoding("ISO-8859-1"); 141 String head = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" standalone=\"no\"?>"; 142 String dtd = "<!DOCTYPE log SYSTEM \"logger.dtd\">"; 143 String rootELement = "<log>"; 144 result = formatter.getHead(handler); 145 int headPos = result.indexOf(head); 146 int dtdPos = result.indexOf(dtd); 147 int rootPos = result.indexOf(rootELement); 148 assertTrue(headPos >= 0); 149 assertTrue(dtdPos > headPos); 150 assertTrue(rootPos > dtdPos); 151 152 handler.setEncoding(null); 153 result = formatter.getHead(handler); 154 assertNull(handler.getEncoding()); 155 // assertTrue(result.indexOf(defaultEncoding)>0); 156 157 // regression test for Harmony-1280 158 // make sure no NPE is thrown 159 formatter.getHead(null); 160 161 } 162 163 public void testGetTail() { 164 assertTrue(formatter.getTail(handler).indexOf("/log>") > 0); 165 } 166 167 public void testInvalidParameter() { 168 formatter.getTail(null); 169 try { 170 formatter.format(null); 171 fail(); 172 } catch (NullPointerException e) { 173 } 174 175 formatter = new XMLFormatter(); 176 lr = new LogRecord(Level.SEVERE, null); 177 String output = formatter.format(lr); 178 // System.out.println(formatter.getHead(handler)+output+formatter.getTail(handler)); 179 assertTrue(output.indexOf("<message") > 0); 180 } 181 182 public class TestFileHandlerClass { 183 Logger logger = Logger.getLogger(TestFileHandlerClass.class.getName()); 184 185 public TestFileHandlerClass(String logFile) throws SecurityException, 186 IOException { 187 logger.addHandler(new FileHandler(logFile)); 188 LogRecord logRecord = new LogRecord(Level.INFO, "message:<init>&"); 189 logRecord.setLoggerName("<init>&"); 190 logRecord.setThrown(new Exception("<init>&")); 191 logRecord.setParameters(new String[] { "<init>&" }); 192 logger.log(logRecord); 193 } 194 } 195 196 public void test_TestFileHandlerClass_constructor() throws Exception { 197 File logFile = new File(System.getProperty("user.home"), 198 "TestFileHandlerClass.log"); 199 logFile.deleteOnExit(); 200 201 PrintStream out = System.out; 202 PrintStream err = System.err; 203 try { 204 System.setOut(null); 205 System.setErr(null); 206 new TestFileHandlerClass(logFile.getCanonicalPath()); 207 BufferedReader br = new BufferedReader(new FileReader(logFile)); 208 String line = null; 209 210 while ((line = br.readLine()) != null) { 211 if (line.contains("<init>&")) { 212 fail("should convert <init> to <init>"); 213 break; 214 } 215 } 216 } finally { 217 System.setOut(out); 218 System.setErr(err); 219 } 220 } 221 222 public static class MockHandler extends Handler { 223 public void close() { 224 } 225 226 public void flush() { 227 } 228 229 public void publish(LogRecord record) { 230 } 231 232 } 233} 234