1fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes/*
2561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Licensed to the Apache Software Foundation (ASF) under one or more
3561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * contributor license agreements.  See the NOTICE file distributed with
4561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * this work for additional information regarding copyright ownership.
5561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * The ASF licenses this file to You under the Apache License, Version 2.0
6561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * (the "License"); you may not use this file except in compliance with
7561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * the License.  You may obtain a copy of the License at
8fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes *
9561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
10fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes *
11561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Unless required by applicable law or agreed to in writing, software
12561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
13561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * See the License for the specific language governing permissions and
15561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * limitations under the License.
16561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
17561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
18561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage org.apache.harmony.logging.tests.java.util.logging;
19561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
20561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.BufferedInputStream;
21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.ByteArrayOutputStream;
22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.File;
23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.FileInputStream;
24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.FileNotFoundException;
25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.FileOutputStream;
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.IOException;
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.InputStream;
28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.OutputStream;
29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.PrintStream;
30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Properties;
31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.logging.FileHandler;
32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.logging.Filter;
33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.logging.Formatter;
34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.logging.Handler;
35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.logging.Level;
36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.logging.LogManager;
37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.logging.LogRecord;
38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.logging.XMLFormatter;
39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestCase;
41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.logging.tests.java.util.logging.HandlerTest.NullOutputStream;
43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.logging.tests.java.util.logging.util.EnvironmentHelper;
44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class FileHandlerTest extends TestCase {
46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
4784bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller    final static LogManager manager = LogManager.getLogManager();
48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    final static Properties props = new Properties();
49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    final static String className = FileHandlerTest.class.getName();
50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    final static String USR_HOME_KEY = "user.home";
51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    final static String TMP_DIR_KEY = "java.io.tmpdir";
52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    final static String SEP = File.separator;
53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private final PrintStream err = System.err;
55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private OutputStream errSubstituteStream = null;
56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
5784bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller    String homePath;
5884bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller    String tempPath;
59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    FileHandler handler;
60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    LogRecord r;
61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected void setUp() throws Exception {
63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        super.setUp();
64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        manager.reset();
65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        initProps();
6684bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        homePath = System.getProperty(USR_HOME_KEY);
6784bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        tempPath = System.getProperty(TMP_DIR_KEY);
6884bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller
6984bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        File file = new File(tempPath + SEP + "log");
70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        file.mkdir();
71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        manager.readConfiguration(EnvironmentHelper
72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .PropertiesToInputStream(props));
73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler = new FileHandler();
74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        r = new LogRecord(Level.CONFIG, "msg");
75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        errSubstituteStream = new NullOutputStream();
76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        System.setErr(new PrintStream(errSubstituteStream));
77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private void initProps() {
80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        props.clear();
81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        props.put("java.util.logging.FileHandler.level", "FINE");
82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        props.put("java.util.logging.FileHandler.filter", className
83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                + "$MockFilter");
84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        props.put("java.util.logging.FileHandler.formatter", className
85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                + "$MockFormatter");
86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        props.put("java.util.logging.FileHandler.encoding", "iso-8859-1");
87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // limit to only two message
88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        props.put("java.util.logging.FileHandler.limit", "1000");
89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // rotation count is 2
90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        props.put("java.util.logging.FileHandler.count", "2");
91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // using append mode
92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        props.put("java.util.logging.FileHandler.append", "true");
9384bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        props.put("java.util.logging.FileHandler.pattern", "%t/log/java%u.test");
94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected void tearDown() throws Exception {
97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (null != handler) {
98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            handler.close();
99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
10084bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        reset(tempPath + SEP + "log", "");
101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        System.setErr(err);
102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        super.tearDown();
103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testConstructor_NoUsrHome() throws IOException {
106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        System.clearProperty(USR_HOME_KEY);
107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new FileHandler("%h/log_NoUsrHome.log");
110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw NullPointerException");
111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
11484bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller            if (homePath != null) {
11584bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller                System.setProperty(USR_HOME_KEY, homePath);
116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testConstructor_NoTmpDir() throws IOException {
121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        System.clearProperty(TMP_DIR_KEY);
122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new FileHandler("%t/log_NoTmpDir.log");
125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
12684bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller            if (tempPath != null) {
12784bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller                System.setProperty(TMP_DIR_KEY, tempPath);
128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
13084bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        assertFalse(new File(tempPath, "log_NoTmpDir.log").exists());
13184bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        assertTrue(new File(homePath, "log_NoTmpDir.log").exists());
13284bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        new File(homePath, "log_NoTmpDir.log").delete();
133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testConstructor_NoTmpDir_NoUsrHome() throws IOException {
136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        System.clearProperty(TMP_DIR_KEY);
137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        System.clearProperty(USR_HOME_KEY);
138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new FileHandler("%t/log_NoTmpDir_NoUsrHome.log");
141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw NullPointerException");
142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
14584bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller            if (tempPath != null) {
14684bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller                System.setProperty(TMP_DIR_KEY, tempPath);
147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
14884bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller            if (homePath != null) {
14984bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller                System.setProperty(USR_HOME_KEY, homePath);
150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
153561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testLock() throws Exception {
15584bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        FileOutputStream output = new FileOutputStream(tempPath + SEP + "log"
156561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                + SEP + "java1.test.0");
157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        FileHandler h = new FileHandler();
158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        h.publish(r);
159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        h.close();
16084bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        assertFileContent(tempPath + SEP + "log", "java1.test.0", h
161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getFormatter(), "UTF-8");
162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        output.close();
163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /*
166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Class under test for void FileHandler()
167561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testFileHandler() throws Exception {
169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(handler.getEncoding(), "iso-8859-1");
170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(handler.getFilter() instanceof MockFilter);
171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(handler.getFormatter() instanceof MockFormatter);
172561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(handler.getLevel(), Level.FINE);
173561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(handler.getErrorManager());
174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler.publish(r);
175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler.close();
176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // output 3 times, and all records left
177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // append mode is true
178561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i = 0; i < 3; i++) {
179561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            handler = new FileHandler();
180561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            handler.publish(r);
181561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            handler.close();
182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
18384bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        assertFileContent(tempPath + SEP + "log", "java0.test.0",
184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                new LogRecord[] { r, null, r, null, r, null, r },
185561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                new MockFormatter(), "UTF-8");
186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testDefaultValue() throws Exception {
189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler.publish(r);
190561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler.close();
191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        props.clear();
192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        manager.readConfiguration(EnvironmentHelper
193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .PropertiesToInputStream(props));
194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler = new FileHandler();
195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNull(handler.getEncoding());
196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNull(handler.getFilter());
197561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(handler.getFormatter() instanceof XMLFormatter);
198561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(handler.getLevel(), Level.ALL);
199561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(handler.getErrorManager());
200561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler.publish(r);
201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler.close();
202561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // output 3 times, and only one record left
203561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // default append mode is false
204561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i = 0; i < 3; i++) {
205561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            handler = new FileHandler();
206561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            handler.publish(r);
207561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            handler.close();
208561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
20984bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        assertFileContent(homePath, "java0.log", new XMLFormatter(), null);
210561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
211561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
212561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private void assertFileContent(String homepath, String filename,
213561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Formatter formatter, String encoding) throws Exception {
214561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFileContent(homepath, filename, new LogRecord[] { r }, formatter, encoding);
215561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
216561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
217561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private void assertFileContent(String homepath, String filename,
218561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            LogRecord[] lr, Formatter formatter, String encoding) throws Exception {
219561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler.close();
220561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String msg = "";
221561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // if formatter is null, the file content should be empty
222561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // else the message should be formatted given records
223561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (null != formatter) {
224561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            StringBuffer sb = new StringBuffer();
225561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            sb.append(formatter.getHead(handler));
226561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            for (int i = 0; i < lr.length; i++) {
227561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (null == lr[i] && i < lr.length - 1) {
228561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    // if one record is null and is not the last record, means
229561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    // here is
230561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    // output completion point, should output tail, then output
231561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    // head
232561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    // (ready for next output)
233561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    sb.append(formatter.getTail(handler));
234561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    sb.append(formatter.getHead(handler));
235561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                } else {
236561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    sb.append(formatter.format(lr[i]));
237561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
238561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
239561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            sb.append(formatter.getTail(handler));
240561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            msg = sb.toString();
241561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
242561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] bytes = new byte[msg.length()];
243561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        InputStream inputStream = null;
244561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
245561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            inputStream = new BufferedInputStream(new FileInputStream(homepath
246561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + SEP + filename));
247561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            inputStream.read(bytes);
248561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (encoding == null) {
249561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                assertEquals(msg, new String(bytes));
250561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } else {
251561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                assertEquals(msg, new String(bytes, encoding));
252561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
253561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // assert has reached the end of the file
254561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertEquals(-1, inputStream.read());
255561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
256561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
257561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (inputStream != null) {
258561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    inputStream.close();
259561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
260561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } catch (Exception e) {
261561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // ignored
262561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
263561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            reset(homepath, filename);
264561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
265561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
266561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
267561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
268561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Does a cleanup of given file
269fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes     *
270561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @param homepath
271561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @param filename
272561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
273561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private void reset(String homepath, String filename) {
274561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        File file = null;
275561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
276561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            file = new File(homepath + SEP + filename);
277561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (file.isFile()) {
278561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                file.delete();
279561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } else if (file.isDirectory()) {
280561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                File[] files = file.listFiles();
281561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                for (int i = 0; i < files.length; i++) {
282561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    files[i].delete();
283561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
284561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                file.delete();
285561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
286561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (Exception e) {
287561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            e.printStackTrace();
288561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
289561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
290561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            file = new File(homepath + SEP + filename + ".lck");
291561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            file.delete();
292561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (Exception e) {
293561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            e.printStackTrace();
294561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
295561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
296561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
297561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testLimitAndCount() throws Exception {
298561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler.close();
299561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // very small limit value, count=2
300561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // output, rename current output file to the second generation file
301561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // close it and open a new file as rotation output
302561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler = new FileHandler("%t/testLimitCount%g", 1, 2, false);
303561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler.publish(r);
304561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler.close();
30584bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        assertFileContent(tempPath, "testLimitCount1", handler.getFormatter(), "UTF-8");
306561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
307561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // very small limit value, count=1
308561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // output once, rotate(equals to nothing output)
309561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler = new FileHandler("%t/testLimitCount%g", 1, 1, false);
310561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler.publish(r);
311561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler.close();
31284bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        assertFileContent(tempPath, "testLimitCount0", new LogRecord[0],
313561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                handler.getFormatter(), "UTF-8");
314561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
315561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // normal case, limit is 60(>2*msg length <3*msg length), append is
316561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // false
317561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler = new FileHandler("%t/testLimitCount%u", 60, 3, false);
318561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        LogRecord[] rs = new LogRecord[10];
319561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // batch output twice to test the append mode
320561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i = 0; i < 5; i++) {
321561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            rs[i] = new LogRecord(Level.SEVERE, "msg" + i);
322561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            handler.publish(rs[i]);
323561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
324561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler.close();
325561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler = new FileHandler("%t/testLimitCount%u", 60, 3, false);
326561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i = 5; i < 10; i++) {
327561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            rs[i] = new LogRecord(Level.SEVERE, "msg" + i);
328561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            handler.publish(rs[i]);
329561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
330561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
33184bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        assertFileContent(tempPath, "testLimitCount0.1", new LogRecord[] {
332561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                rs[5], rs[6], rs[7] }, handler.getFormatter(), "UTF-8");
33384bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        assertFileContent(tempPath, "testLimitCount0.0", new LogRecord[] {
334561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                rs[8], rs[9] }, handler.getFormatter(), "UTF-8");
335561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
336561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // normal case, limit is 60(>2*msg length <3*msg length), append is true
337561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler = new FileHandler("%t/testLimitCount%u", 60, 3, false);
338561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // batch output twice to test the append mode
339561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i = 0; i < 5; i++) {
340561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            rs[i] = new LogRecord(Level.SEVERE, "msg" + i);
341561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            handler.publish(rs[i]);
342561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
343561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler.close();
344561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler = new FileHandler("%t/testLimitCount%u", 60, 3, true);
345561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i = 5; i < 10; i++) {
346561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            rs[i] = new LogRecord(Level.SEVERE, "msg" + i);
347561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            handler.publish(rs[i]);
348561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
349561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler.close();
35084bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        assertFileContent(tempPath, "testLimitCount0.2", new LogRecord[] {
351561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                rs[3], rs[4], null, rs[5] }, handler.getFormatter(), "UTF-8");
35284bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        assertFileContent(tempPath, "testLimitCount0.1", new LogRecord[] {
353561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                rs[6], rs[7], rs[8] }, handler.getFormatter(), "UTF-8");
35484bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        assertFileContent(tempPath, "testLimitCount0.0",
355561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                new LogRecord[] { rs[9] }, handler.getFormatter(), "UTF-8");
356561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
357561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        FileHandler h1 = null;
358561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        FileHandler h2 = null;
359561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
36084bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller            File logDir = new File(tempPath, "log");
36184bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller            reset(tempPath, "log");
362561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            logDir.mkdir();
36384bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller            h1 = new FileHandler("%t/log/a", 0, 1);
364561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertNotNull(h1);
36584bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller            h2 = new FileHandler("%t/log/a", 0, 1, false);
366561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertNotNull(h2);
367561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
368561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
369561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                h1.close();
370561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } catch (Exception e) {
371561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
372561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
373561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                h2.close();
374561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } catch (Exception e) {
375561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
37684bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller            reset(tempPath, "log");
377561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
378561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
379561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
380561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testInvalidProperty() throws Exception {
381561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        props.put("java.util.logging.FileHandler.level", "null");
382561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        props.put("java.util.logging.FileHandler.filter", className
383561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                + "$MockFilte");
384561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        props.put("java.util.logging.FileHandler.formatter", className
385561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                + "$MockFormatte");
386561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        props.put("java.util.logging.FileHandler.encoding", "ut");
387561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // limit to only two message
388561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        props.put("java.util.logging.FileHandler.limit", "-1");
389561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // rotation count is 2
390561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        props.put("java.util.logging.FileHandler.count", "-1");
391561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // using append mode
392561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        props.put("java.util.logging.FileHandler.append", "bad");
393561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
394561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler.close();
395561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
396561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        manager.readConfiguration(EnvironmentHelper
397561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .PropertiesToInputStream(props));
398561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler = new FileHandler();
399561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(Level.ALL, handler.getLevel());
400561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNull(handler.getFilter());
401561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(handler.getFormatter() instanceof XMLFormatter);
402561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNull(handler.getEncoding());
403561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler.close();
404561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
405561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        props.put("java.util.logging.FileHandler.pattern", "");
406561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        manager.readConfiguration(EnvironmentHelper
407561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .PropertiesToInputStream(props));
408561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
409561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            handler = new FileHandler();
410561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("shouldn't open file with empty name");
411561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
412561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
413561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
414561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
415561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testInvalidParams() throws IOException {
416561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
417561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // %t and %p parsing can add file separator automatically
418561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        FileHandler h1 = new FileHandler("%taaa");
419561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        h1.close();
42084bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        File file = new File(tempPath + SEP + "aaa");
421561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(file.exists());
42284bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        reset(tempPath, "aaa");
423561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
42484bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        // On platforms besides Android this test was probably checking a non-existent directory:
42584bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        // i.e. when expanded %t/%h would have been a nonexistent path but would have contained
42684bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        // multiple names separated by path separators. On Android %h is "/" so this test breaks.
42784bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        // Removed for Android.
428561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // always parse special pattern
42984bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        // try {
43084bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        //    h1 = new FileHandler("%t/%h");
43184bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        //    fail("should throw null exception");
43284bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        //} catch (FileNotFoundException e) {
43384bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        //}
43484bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller
435561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        h1 = new FileHandler("%t%g");
436561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        h1.close();
43784bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        file = new File(tempPath + SEP + "0");
438561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(file.exists());
43984bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        reset(tempPath, "0");
440561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        h1 = new FileHandler("%t%u%g");
441561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        h1.close();
44284bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        file = new File(tempPath + SEP + "00");
443561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(file.exists());
44484bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        reset(tempPath, "00");
445561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
446561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // this is normal case
447561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        h1 = new FileHandler("%t/%u%g%%g");
448561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        h1.close();
44984bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        file = new File(tempPath + SEP + "00%g");
450561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(file.exists());
45184bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        reset(tempPath, "00%g");
452561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
453561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // multi separator has no effect
454561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        h1 = new FileHandler("//%t//multi%g");
455561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        h1.close();
45684bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        file = new File(tempPath + SEP + "multi0");
457561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(file.exists());
45884bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        reset(tempPath, "multi0");
459561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
460561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // bad directory, IOException
461561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
462561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            h1 = new FileHandler("%t/baddir/multi%g");
463561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw IO exception");
464561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IOException e) {
465561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
46684bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        file = new File(tempPath + SEP + "baddir" + SEP + "multi0");
467561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(file.exists());
468561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
469561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
470561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new FileHandler(null);
471561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw null exception");
472561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
473561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
474561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
475561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            handler.publish(null);
476561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
477561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should not throw NPE");
478561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
479561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
480561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new FileHandler(null, false);
481561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw null exception");
482561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
483561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
484561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
485561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // regression test for Harmony-1299
486561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new FileHandler("");
487561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw IllegalArgumentException");
488561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
489561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
490561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
491561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
492561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new FileHandler("%t/java%u", 0, 0);
493561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw IllegalArgumentException");
494561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
495561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
496561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
497561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new FileHandler("%t/java%u", -1, 1);
498561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw IllegalArgumentException");
499561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
500561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
501561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
502561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
503561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // set output stream still works, just like super StreamHandler
504561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testSetOutputStream() throws Exception {
50584bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        MockFileHandler handler = new MockFileHandler("%t/setoutput.log");
506561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler.setFormatter(new MockFormatter());
507561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler.publish(r);
508561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
509561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteArrayOutputStream out = new ByteArrayOutputStream();
510561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler.publicSetOutputStream(out);
511561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler.publish(r);
512561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        handler.close();
513561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String msg = new String(out.toByteArray());
514561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Formatter f = handler.getFormatter();
515561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(msg, f.getHead(handler) + f.format(r) + f.getTail(handler));
51684bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        assertFileContent(tempPath, "setoutput.log", handler.getFormatter(), null);
517561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
518561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
519561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /*
520561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Class under test for void FileHandler(String)
521561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
522561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testFileHandlerString() throws Exception {
523561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // test if unique ids not specified, it will append at the end
524561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // no generation number is used
525561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        FileHandler h = new FileHandler("%t/log/string");
526561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        FileHandler h2 = new FileHandler("%t/log/string");
527561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        FileHandler h3 = new FileHandler("%t/log/string");
528561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        FileHandler h4 = new FileHandler("%t/log/string");
529561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        h.publish(r);
530561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        h2.publish(r);
531561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        h3.publish(r);
532561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        h4.publish(r);
533561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        h.close();
534561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        h2.close();
535561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        h3.close();
536561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        h4.close();
53784bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        assertFileContent(tempPath + SEP + "log", "string", h.getFormatter(), "UTF-8");
53884bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        assertFileContent(tempPath + SEP + "log", "string.1", h.getFormatter(), "UTF-8");
53984bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        assertFileContent(tempPath + SEP + "log", "string.2", h.getFormatter(), "UTF-8");
54084bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        assertFileContent(tempPath + SEP + "log", "string.3", h.getFormatter(), "UTF-8");
541561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
542561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // default is append mode
543561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        FileHandler h6 = new FileHandler("%t/log/string%u.log");
544561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        h6.publish(r);
545561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        h6.close();
546561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        FileHandler h7 = new FileHandler("%t/log/string%u.log");
547561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        h7.publish(r);
548561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        h7.close();
549561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
55084bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller            assertFileContent(tempPath + SEP + "log", "string0.log", h
551561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    .getFormatter(), "UTF-8");
552561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should assertion failed");
553561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (Error e) {
554561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
55584bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        File file = new File(tempPath + SEP + "log");
556561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(file.list().length <= 2);
557561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
558561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // test unique ids
559561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        FileHandler h8 = new FileHandler("%t/log/%ustring%u.log");
560561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        h8.publish(r);
561561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        FileHandler h9 = new FileHandler("%t/log/%ustring%u.log");
562561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        h9.publish(r);
563561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        h9.close();
564561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        h8.close();
56584bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        assertFileContent(tempPath + SEP + "log", "0string0.log", h
566561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getFormatter(), "UTF-8");
56784bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        assertFileContent(tempPath + SEP + "log", "1string1.log", h
568561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getFormatter(), "UTF-8");
56984bf48564a8560403bd77eee23f7fad63e50340eNeil Fuller        file = new File(tempPath + SEP + "log");
570561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(file.list().length <= 2);
571561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
572561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
573561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testEmptyPattern_3params() throws SecurityException,
574561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            IOException {
575561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // regression HARMONY-2421
576561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
577561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new FileHandler(new String(), 1, 1);
578561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Expected an IllegalArgumentException");
579561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
580561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
581561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
582561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
583561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
584561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testEmptyPattern_2params() throws SecurityException,
585561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            IOException {
586561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // regression HARMONY-2421
587561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
588561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new FileHandler(new String(), true);
589561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Expected an IllegalArgumentException");
590561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
591561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
592561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
593561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
594561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
595561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testEmptyPattern_4params() throws SecurityException,
596561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            IOException {
597561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // regression HARMONY-2421
598561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
599561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new FileHandler(new String(), 1, 1, true);
600561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Expected an IllegalArgumentException");
601561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
602561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
603561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
604561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
605561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
606561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /*
607561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * mock classes
608561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
609561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class MockFilter implements Filter {
610561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public boolean isLoggable(LogRecord record) {
611561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return !record.getMessage().equals("false");
612561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
613561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
614561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
615561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class MockFormatter extends Formatter {
616561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public String format(LogRecord r) {
617561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (null == r) {
618561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                return "";
619561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
620561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return r.getMessage() + " by MockFormatter\n";
621561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
622561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
623561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public String getTail(Handler h) {
624561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return "tail\n";
625561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
626561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
627561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public String getHead(Handler h) {
628561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return "head\n";
629561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
630561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
631561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
632561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class MockFileHandler extends FileHandler {
633561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public MockFileHandler() throws IOException {
634561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super();
635561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
636561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
637561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public MockFileHandler(String pattern) throws IOException {
638561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super(pattern);
639561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
640561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
641561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void publicSetOutputStream(OutputStream stream) {
642561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super.setOutputStream(stream);
643561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
644561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
645561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
646