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