/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 2013-2014 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013-2014 Jason Mehrens. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License"). You
* may not use this file except in compliance with the License. You can
* obtain a copy of the License at
* https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
* or packager/legal/LICENSE.txt. See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at packager/legal/LICENSE.txt.
*
* GPL Classpath Exception:
* Oracle designates this particular file as subject to the "Classpath"
* exception as provided by Oracle in the GPL Version 2 section of the License
* file that accompanied this code.
*
* Modifications:
* If applicable, add the following below the License Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyright [year] [name of copyright owner]"
*
* Contributor(s):
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your decision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license." If you don't indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above. However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/
package com.sun.mail.util.logging;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.*;
import java.util.logging.*;
import java.util.logging.Formatter;
import org.junit.AfterClass;
import static org.junit.Assert.*;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* The collector formatter tests.
*
* @author Jason Mehrens
* @since JavaMail 1.5.2
*/
public class CollectorFormatterTest {
/**
* See LogManager.
*/
private static final String LOG_CFG_KEY = "java.util.logging.config.file";
/**
* The line separator.
*/
private static final String LINE_SEP = System.getProperty("line.separator");
private static void checkJVMOptions() throws Exception {
assertTrue(CollectorFormatterTest.class.desiredAssertionStatus());
assertNull(System.getProperty("java.util.logging.manager"));
assertNull(System.getProperty("java.util.logging.config.class"));
assertNull(System.getProperty(LOG_CFG_KEY));
assertEquals(LogManager.class, LogManager.getLogManager().getClass());
}
@BeforeClass
public static void setUpClass() throws Exception {
checkJVMOptions();
}
@AfterClass
public static void tearDownClass() throws Exception {
checkJVMOptions();
}
@Test
public void testFormatHead() {
String msg = "message";
XMLFormatter xml = new XMLFormatter();
CollectorFormatter f = new CollectorFormatter("{0}", xml,
(Comparator<LogRecord>) null);
assertEquals("", f.getHead((Handler) null));
f.format(new LogRecord(Level.SEVERE, msg));
String result = f.getTail((Handler) null);
String expect = f.finish(xml.getHead((Handler) null));
assertEquals(result, expect);
assertEquals("", f.getHead((Handler) null));
}
@Test(expected = NullPointerException.class)
public void testFormatNull() {
CollectorFormatter f = new CollectorFormatter("{1}", (Formatter) null,
(Comparator<LogRecord>) null);
f.format((LogRecord) null);
}
@Test
public void testFormatFormat() {
String msg = "message";
XMLFormatter xml = new XMLFormatter();
CollectorFormatter f = new CollectorFormatter("{1}", xml,
(Comparator<LogRecord>) null);
assertEquals("", f.getTail((Handler) null));
LogRecord r;
r = new LogRecord(Level.SEVERE, msg);
f.format(r);
String result = f.getTail((Handler) null);
String expect = f.finish(xml.format(r));
assertEquals(result, expect);
assertEquals("", f.getTail((Handler) null));
}
@Test
public void testFormatFormatLocale() throws Exception {
String msg = "message";
XMLFormatter xml = new XMLFormatter();
CollectorFormatter f = new CollectorFormatter("{1}", xml,
(Comparator<LogRecord>) null);
assertEquals("", f.getTail((Handler) null));
LogRecord r;
r = new LogRecord(Level.SEVERE, LOG_CFG_KEY);
Properties props = new Properties();
props.put(LOG_CFG_KEY, msg);
r.setResourceBundle(new LocaleResource(props, Locale.US));
assertNotNull(r.getResourceBundle().getLocale());
f.format(r);
String result = f.getTail((Handler) null);
String expect = f.finish(xml.format(r));
assertEquals(result, expect);
assertEquals(msg, f.formatMessage(r));
assertEquals(msg, xml.formatMessage(r));
assertEquals("", f.getTail((Handler) null));
}
@Test
public void testFormatNoRecords() {
XMLFormatter xml = new XMLFormatter();
CollectorFormatter f = new CollectorFormatter((String) null, xml,
(Comparator<LogRecord>) null);
String result = f.getTail((Handler) null);
String expect = f.finish(xml.getHead((Handler) null))
+ f.finish(xml.getTail((Handler) null)) + '\n';
assertEquals(result, expect);
}
@Test
public void testFormatOneRecord() {
XMLFormatter xml = new XMLFormatter();
CollectorFormatter f = new CollectorFormatter((String) null, xml,
(Comparator<LogRecord>) null);
LogRecord record = new LogRecord(Level.SEVERE, "message");
assertEquals("", f.format(record));
String result = f.getTail((Handler) null);
String expect = f.finish(xml.getHead((Handler) null))
+ f.finish(xml.format(record))
+ f.finish(xml.getTail((Handler) null)) + '\n';
assertEquals(result, expect);
}
@Test
public void testFormatTwoRecords() {
XMLFormatter xml = new XMLFormatter();
CollectorFormatter f = new CollectorFormatter((String) null, xml,
(Comparator<LogRecord>) null);
LogRecord record = new LogRecord(Level.SEVERE, "first");
assertEquals("", f.format(record));
record = new LogRecord(Level.SEVERE, "second");
assertEquals("", f.format(record));
String result = f.getTail((Handler) null);
String expect = f.finish(xml.getHead((Handler) null))
+ f.finish(xml.format(record))
+ f.finish(xml.getTail((Handler) null)) + "... 1 more\n";
assertEquals(result, expect);
}
@Test(expected = NullPointerException.class)
public void testFinishNull() {
CollectorFormatter f = new CollectorFormatter();
String result = f.finish((String) null);
fail(result);
}
@Test
public void testFinish() {
CollectorFormatter f = new CollectorFormatter();
String format = LINE_SEP + f.getClass().getName() + LINE_SEP;
assertFalse(f.getClass().getName().equals(format));
assertEquals(f.getClass().getName(), f.finish(format));
}
@Test
public void testFormatTail() {
String msg = "message";
XMLFormatter xml = new XMLFormatter();
CollectorFormatter f = new CollectorFormatter("{2}", xml,
(Comparator<LogRecord>) null);
f.format(new LogRecord(Level.SEVERE, msg));
String result = f.getTail((Handler) null);
String expect = f.finish(xml.getTail((Handler) null));
assertEquals(result, expect);
assertEquals(expect, f.getTail((Handler) null));
}
@Test
public void testFormatCount() {
String msg = "message";
CollectorFormatter f = new CollectorFormatter("{3}", (Formatter) null,
(Comparator<LogRecord>) null);
assertEquals("0", f.getTail((Handler) null));
f.format(new LogRecord(Level.SEVERE, msg));
f.format(new LogRecord(Level.SEVERE, msg));
f.format(new LogRecord(Level.SEVERE, msg));
f.format(new LogRecord(Level.SEVERE, msg));
String result = f.getTail((Handler) null);
assertEquals(result, "4");
assertEquals("0", f.getTail((Handler) null));
}
@Test
public void testFormatRemaing() {
String msg = "message";
CollectorFormatter f = new CollectorFormatter("{4}", (Formatter) null,
(Comparator<LogRecord>) null);
assertEquals("-1", f.getTail((Handler) null));
f.format(new LogRecord(Level.SEVERE, msg));
f.format(new LogRecord(Level.SEVERE, msg));
f.format(new LogRecord(Level.SEVERE, msg));
f.format(new LogRecord(Level.SEVERE, msg));
String result = f.getTail((Handler) null);
assertEquals(result, "3");
assertEquals("-1", f.getTail((Handler) null));
}
@Test
public void testFormatThrown() {
String msg = "message";
CollectorFormatter f = new CollectorFormatter("{5}", (Formatter) null,
(Comparator<LogRecord>) null);
assertEquals("0", f.getTail((Handler) null));
f.format(new LogRecord(Level.SEVERE, msg));
f.format(new LogRecord(Level.SEVERE, msg));
LogRecord r = new LogRecord(Level.SEVERE, msg);
r.setThrown(new Exception());
f.format(r);
r = new LogRecord(Level.SEVERE, msg);
r.setThrown(new Exception());
f.format(r);
r = new LogRecord(Level.SEVERE, msg);
r.setThrown(new Exception());
f.format(r);
String result = f.getTail((Handler) null);
assertEquals(result, "3");
assertEquals("0", f.getTail((Handler) null));
}
@Test
public void testFormatNormal() {
String msg = "message";
CollectorFormatter f = new CollectorFormatter("{6}", (Formatter) null,
(Comparator<LogRecord>) null);
assertEquals("0", f.getTail((Handler) null));
f.format(new LogRecord(Level.SEVERE, msg));
f.format(new LogRecord(Level.SEVERE, msg));
LogRecord r = new LogRecord(Level.SEVERE, msg);
r.setThrown(new Exception());
f.format(r);
r = new LogRecord(Level.SEVERE, msg);
r.setThrown(new Exception());
f.format(r);
r = new LogRecord(Level.SEVERE, msg);
r.setThrown(new Exception());
f.format(r);
String result = f.getTail((Handler) null);
assertEquals(result, "2");
assertEquals("0", f.getTail((Handler) null));
}
@Test
public void testFormatMinMillis() {
String msg = "message";
CollectorFormatter f = new CollectorFormatter("{7,date,short} {7,time}",
(Formatter) null,
(Comparator<LogRecord>) null);
long min = 100L;
LogRecord r = new LogRecord(Level.SEVERE, msg);
r.setMillis(min + 1000L);
f.format(r);
r = new LogRecord(Level.SEVERE, msg);
r.setMillis(min + 2000L);
f.format(r);
r = new LogRecord(Level.SEVERE, msg);
r.setMillis(min);
f.format(r);
r = new LogRecord(Level.SEVERE, msg);
r.setMillis(min + 3000L);
f.format(r);
r = new LogRecord(Level.SEVERE, msg);
r.setMillis(min + 4000L);
f.format(r);
String result = f.getTail((Handler) null);
assertEquals(result, MessageFormat.format("{0,date,short} {0,time}", min));
}
@Test
public void testFormatMaxMillis() {
String msg = "message";
CollectorFormatter f = new CollectorFormatter("{8,date,short} {8,time}",
(Formatter) null,
(Comparator<LogRecord>) null);
long min = 100L;
long high = 4000L;
LogRecord r = new LogRecord(Level.SEVERE, msg);
r.setMillis(min + 1000L);
f.format(r);
r = new LogRecord(Level.SEVERE, msg);
r.setMillis(min + high);
f.format(r);
r = new LogRecord(Level.SEVERE, msg);
r.setMillis(min + 2000L);
f.format(r);
r = new LogRecord(Level.SEVERE, msg);
r.setMillis(min);
f.format(r);
r = new LogRecord(Level.SEVERE, msg);
r.setMillis(min + 3000L);
f.format(r);
String result = f.getTail((Handler) null);
assertEquals(result, MessageFormat.format("{0,date,short} {0,time}", min + high));
}
@Test
public void testGetTail() {
CollectorFormatter f = new CollectorFormatter(
"{0}{1}{2}{3}{4}{5}{6}{7}{8}",
(Formatter) null,
(Comparator<LogRecord>) null);
assertTrue(f.getTail((Handler) null).length() != 0);
assertTrue(f.getTail((Handler) null).length() != 0);
}
@Test
public void testNewDefaultFormatter() {
String msg = "";
CollectorFormatter f = new CollectorFormatter();
f.format(new LogRecord(Level.SEVERE, msg));
f.format(new LogRecord(Level.SEVERE, msg));
String result = f.getTail((Handler) null);
assertTrue(result, result.length() != 0);
assertTrue(result, result.contains("..."));
assertTrue(result, result.contains("1"));
assertTrue(result, result.contains("more"));
}
@Test
public void testNewFormatterWithString() {
CollectorFormatter f = new CollectorFormatter("{3}");
f.format(new LogRecord(Level.SEVERE, ""));
String result = f.getTail((Handler) null);
assertEquals(result, "1");
}
@Test
public void testNewFormatterNullString() {
CollectorFormatter f = new CollectorFormatter((String) null);
assertEquals(CollectorFormatter.class, f.getClass());
}
@Test
public void testNewFormatterNullNonNullNonNull() {
CollectorFormatter f = new CollectorFormatter((String) null,
new XMLFormatter(), SeverityComparator.getInstance());
assertEquals(CollectorFormatter.class, f.getClass());
}
@Test
public void testNewFormatterNullNullNull() {
CollectorFormatter f = new CollectorFormatter((String) null,
(Formatter) null, (Comparator<LogRecord>) null);
assertEquals(CollectorFormatter.class, f.getClass());
}
@Test
public void testNewFormatterNonNullNullNull() {
CollectorFormatter f = new CollectorFormatter("Test {0}",
(Formatter) null, (Comparator<LogRecord>) null);
assertEquals(CollectorFormatter.class, f.getClass());
}
@Test
public void testToString() {
String msg = "message";
CollectorFormatter f = new CollectorFormatter("{3}", (Formatter) null,
(Comparator<LogRecord>) null);
f.format(new LogRecord(Level.SEVERE, msg));
f.format(new LogRecord(Level.SEVERE, msg));
f.format(new LogRecord(Level.SEVERE, msg));
f.format(new LogRecord(Level.SEVERE, msg));
String result = f.toString();
assertEquals(result, f.toString());
assertEquals(result, f.getTail((Handler) null));
assertFalse(result.equals(f.toString()));
}
@Test(expected = NullPointerException.class)
public void testApplyNullAndNull() {
CollectorFormatter f = new CollectorFormatter("{3}", (Formatter) null,
(Comparator<LogRecord>) null);
f.apply((LogRecord) null, (LogRecord) null);
}
@Test(expected = NullPointerException.class)
public void testApplyNullAndLogRecord() {
CollectorFormatter f = new CollectorFormatter("{3}", (Formatter) null,
(Comparator<LogRecord>) null);
f.apply((LogRecord) null, new LogRecord(Level.SEVERE, ""));
}
@Test(expected = NullPointerException.class)
public void testApplyLogRecordAndNull() {
CollectorFormatter f = new CollectorFormatter("{3}", (Formatter) null,
(Comparator<LogRecord>) null);
f.apply(new LogRecord(Level.SEVERE, ""), (LogRecord) null);
}
@Test
public void testApplyWithoutComparator() {
CollectorFormatter f = new CollectorFormatter("{3}", (Formatter) null,
(Comparator<LogRecord>) null);
LogRecord first = new LogRecord(Level.SEVERE, "");
LogRecord second = new LogRecord(Level.WARNING, "");
assertSame(second, f.apply(first, second));
}
@Test
public void testApplyWithComparator() {
CollectorFormatter f = new CollectorFormatter("{3}", (Formatter) null,
SeverityComparator.getInstance());
LogRecord first = new LogRecord(Level.SEVERE, "");
LogRecord second = new LogRecord(Level.WARNING, "");
assertSame(first, f.apply(first, second));
}
@Test
public void testComparator() throws Exception {
final String p = CollectorFormatter.class.getName();
Properties props = new Properties();
props.put(p.concat(".comparator"), SeverityComparator.class.getName());
props.put(p.concat(".comparator.reverse"), "false");
LogManager manager = LogManager.getLogManager();
try {
read(manager, props);
CollectorFormatter cf = new CollectorFormatter();
LogRecord first = new LogRecord(Level.SEVERE, Level.SEVERE.getName());
LogRecord second = new LogRecord(Level.WARNING, Level.WARNING.getName());
cf.format(second);
cf.format(first);
String result = cf.getTail((Handler) null);
assertTrue(result, result.startsWith(Level.SEVERE.getName()));
} finally {
manager.reset();
}
}
@Test
public void testComparatorReverse() throws Exception {
final String p = CollectorFormatter.class.getName();
Properties props = new Properties();
props.put(p.concat(".comparator"), SeverityComparator.class.getName());
props.put(p.concat(".comparator.reverse"), "true");
LogManager manager = LogManager.getLogManager();
try {
read(manager, props);
CollectorFormatter cf = new CollectorFormatter();
LogRecord first = new LogRecord(Level.SEVERE, Level.SEVERE.getName());
LogRecord second = new LogRecord(Level.WARNING, Level.WARNING.getName());
cf.format(second);
cf.format(first);
String result = cf.getTail((Handler) null);
assertTrue(result, result.startsWith(Level.WARNING.getName()));
} finally {
manager.reset();
}
}
@Test
public void testFormatter() throws Exception {
final String p = CollectorFormatter.class.getName();
Properties props = new Properties();
props.put(p.concat(".formatter"), XMLFormatter.class.getName());
LogManager manager = LogManager.getLogManager();
try {
read(manager, props);
XMLFormatter xml = new XMLFormatter();
CollectorFormatter cf = new CollectorFormatter();
LogRecord first = new LogRecord(Level.SEVERE, Level.SEVERE.getName());
assertEquals("", cf.format(first));
String result = cf.getTail((Handler) null);
assertEquals(result, cf.finish(xml.getHead((Handler) null))
+ cf.finish(xml.format(first))
+ cf.finish(xml.getTail((Handler) null)) + '\n');
} finally {
manager.reset();
}
}
private void read(LogManager manager, Properties props) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream(512);
props.store(out, CollectorFormatterTest.class.getName());
manager.readConfiguration(new ByteArrayInputStream(out.toByteArray()));
}
/**
* A properties resource bundle with locale.
*/
private static class LocaleResource extends PropertyResourceBundle {
/**
* The locale
*/
private final Locale locale;
/**
* Creates the locale resource.
*
* @param p the properties.
* @param l the locale.
* @throws IOException if there is a problem.
*/
LocaleResource(Properties p, Locale l) throws IOException {
super(toStream(p));
locale = l;
}
private static InputStream toStream(Properties p) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
p.store(out, LocaleResource.class.getName());
return new ByteArrayInputStream(out.toByteArray());
}
@Override
public Locale getLocale() {
return locale;
}
}
}