19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.internal.os;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
192ad24f944ee68c6e14f3a214f0eef60f8cdb9eb8Brett Chabotimport android.test.suitebuilder.annotation.Suppress;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilsonimport java.io.PrintWriter;
22f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilsonimport java.io.StringWriter;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
24f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilsonimport java.util.Arrays;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Collections;
26f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilsonimport java.util.List;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
282ad24f944ee68c6e14f3a214f0eef60f8cdb9eb8Brett Chabotimport junit.framework.TestCase;
292ad24f944ee68c6e14f3a214f0eef60f8cdb9eb8Brett Chabot
302ad24f944ee68c6e14f3a214f0eef60f8cdb9eb8Brett Chabot// this test causes a IllegalAccessError: superclass not accessible
312ad24f944ee68c6e14f3a214f0eef60f8cdb9eb8Brett Chabot@Suppress
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class LoggingPrintStreamTest extends TestCase {
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    TestPrintStream out = new TestPrintStream();
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testPrintException() {
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @SuppressWarnings("ThrowableInstanceNeverThrown")
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Throwable t = new Throwable("Ignore me.");
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringWriter sout = new StringWriter();
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        t.printStackTrace(new PrintWriter(sout));
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        t.printStackTrace(out);
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // t.printStackTrace();
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String[] lines = sout.toString().split("\\n");
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(Arrays.asList(lines), out.lines);
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testPrintObject() {
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Object o = new Object();
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.print(4);
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.print(o);
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.print(2);
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.flush();
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(Arrays.asList("4" + o + "2"), out.lines);
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testPrintlnObject() {
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Object o = new Object();
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.print(4);
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.println(o);
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.print(2);
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.flush();
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(Arrays.asList("4" + o, "2"), out.lines);
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testPrintf() {
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.printf("Name: %s\nEmployer: %s", "Bob", "Google");
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(Arrays.asList("Name: Bob"), out.lines);
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.flush();
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(Arrays.asList("Name: Bob", "Employer: Google"), out.lines);
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testPrintInt() {
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.print(4);
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.print(2);
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue(out.lines.isEmpty());
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.flush();
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(Collections.singletonList("42"), out.lines);
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testPrintlnInt() {
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.println(4);
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.println(2);
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(Arrays.asList("4", "2"), out.lines);
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testPrintCharArray() {
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.print("Foo\nBar\nTee".toCharArray());
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(Arrays.asList("Foo", "Bar"), out.lines);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.flush();
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(Arrays.asList("Foo", "Bar", "Tee"), out.lines);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testPrintString() {
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.print("Foo\nBar\nTee");
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(Arrays.asList("Foo", "Bar"), out.lines);
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.flush();
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(Arrays.asList("Foo", "Bar", "Tee"), out.lines);
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testPrintlnCharArray() {
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.println("Foo\nBar\nTee".toCharArray());
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(Arrays.asList("Foo", "Bar", "Tee"), out.lines);
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testPrintlnString() {
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.println("Foo\nBar\nTee");
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(Arrays.asList("Foo", "Bar", "Tee"), out.lines);
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testPrintlnStringWithBufferedData() {
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.print(5);
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.println("Foo\nBar\nTee");
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(Arrays.asList("5Foo", "Bar", "Tee"), out.lines);
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testAppend() {
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.append("Foo\n")
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            .append('4')
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            .append('\n')
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            .append("Bar", 1, 2)
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            .append('\n');
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(Arrays.asList("Foo", "4", "a"), out.lines);
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
128f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson    public void testMultiByteCharactersSpanningBuffers() throws Exception {
129f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        // assume 3*1000 bytes won't fit in LoggingPrintStream's internal buffer
130f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        StringBuilder builder = new StringBuilder();
131f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        for (int i = 0; i < 1000; i++) {
132f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson            builder.append("\u20AC"); // a Euro character; 3 bytes in UTF-8
133f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        }
134f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        String expected = builder.toString();
135f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson
136f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        out.write(expected.getBytes("UTF-8"));
137f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        out.flush();
138f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        assertEquals(Arrays.asList(expected), out.lines);
139f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson    }
140f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson
141f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson    public void testWriteOneByteAtATimeMultibyteCharacters() throws Exception {
142f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        String expected = " \u20AC  \u20AC   \u20AC    \u20AC     ";
143f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        for (byte b : expected.getBytes()) {
144f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson            out.write(b);
145f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        }
146f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        out.flush();
147f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        assertEquals(Arrays.asList(expected), out.lines);
148f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson    }
149f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson
150f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson    public void testWriteByteArrayAtATimeMultibyteCharacters() throws Exception {
151f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        String expected = " \u20AC  \u20AC   \u20AC    \u20AC     ";
152f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        out.write(expected.getBytes());
153f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        out.flush();
154f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        assertEquals(Arrays.asList(expected), out.lines);
155f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson    }
156f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson
157f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson    public void testWriteWithOffsetsMultibyteCharacters() throws Exception {
158f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        String expected = " \u20AC  \u20AC   \u20AC    \u20AC     ";
159f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        byte[] bytes = expected.getBytes();
160f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        int i = 0;
161f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        while (i < bytes.length - 5) {
162f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson            out.write(bytes, i, 5);
163f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson            i += 5;
164f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        }
165f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        out.write(bytes, i, bytes.length - i);
166f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        out.flush();
167f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        assertEquals(Arrays.asList(expected), out.lines);
168f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson    }
169f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson
170f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson    public void testWriteFlushesOnNewlines() throws Exception {
171f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        String a = " \u20AC  \u20AC ";
172f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        String b = "  \u20AC    \u20AC  ";
173f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        String c = "   ";
174f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        String toWrite = a + "\n" + b + "\n" + c;
175f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        out.write(toWrite.getBytes());
176f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        out.flush();
177f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson        assertEquals(Arrays.asList(a, b, c), out.lines);
178f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson    }
179f41de2a4a1c22e3f3ee9a8cd65ec7997c9587cdbJesse Wilson
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static class TestPrintStream extends LoggingPrintStream {
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final List<String> lines = new ArrayList<String>();
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        protected void log(String line) {
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            lines.add(line);
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
189