1163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey/* 2163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey * Copyright (C) 2011 The Android Open Source Project 3163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey * 4163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 5163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey * you may not use this file except in compliance with the License. 6163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey * You may obtain a copy of the License at 7163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey * 8163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 9163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey * 10163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey * Unless required by applicable law or agreed to in writing, software 11163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 12163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey * See the License for the specific language governing permissions and 14163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey * limitations under the License. 15163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey */ 16163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 17163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkeypackage com.android.internal.util; 18163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 19163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkeyimport android.test.AndroidTestCase; 20163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 21163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkeyimport java.io.ByteArrayInputStream; 22163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkeyimport java.io.IOException; 23d396a448b2e36e29598c954b64bfddef73f3fae0Elliott Hughesimport java.nio.charset.StandardCharsets; 24163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 25163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey/** 26163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey * Tests for {@link ProcFileReader}. 27163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey */ 28163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkeypublic class ProcFileReaderTest extends AndroidTestCase { 29163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 30163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey public void testEmpty() throws Exception { 31163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey final ProcFileReader reader = buildReader(""); 32163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 33163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertFalse(reader.hasMoreData()); 34163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey try { 35163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey reader.finishLine(); 36163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey fail("somehow finished line beyond end of stream?"); 37163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey } catch (IOException e) { 38163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey // expected 39163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey } 40163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertFalse(reader.hasMoreData()); 41163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey } 42163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 43163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey public void testSingleString() throws Exception { 44163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey final ProcFileReader reader = buildReader("a\nb\nc\n"); 45163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 46163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals("a", reader.nextString()); 47163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey reader.finishLine(); 48163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertTrue(reader.hasMoreData()); 49163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 50163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals("b", reader.nextString()); 51163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey reader.finishLine(); 52163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertTrue(reader.hasMoreData()); 53163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 54163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals("c", reader.nextString()); 55163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey reader.finishLine(); 56163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertFalse(reader.hasMoreData()); 57163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey } 58163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 59163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey public void testMixedNumbersSkip() throws Exception { 60163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey final ProcFileReader reader = buildReader("1 2 3\n4 abc_def 5 6 7 8 9\n10\n"); 61163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 62163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals(1, reader.nextInt()); 63163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals(2, reader.nextInt()); 64163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals(3, reader.nextInt()); 65163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey reader.finishLine(); 66163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertTrue(reader.hasMoreData()); 67163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 68163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals(4, reader.nextInt()); 69163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals("abc_def", reader.nextString()); 70163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals(5, reader.nextInt()); 71163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey reader.finishLine(); 72163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertTrue(reader.hasMoreData()); 73163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 74163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals(10, reader.nextInt()); 75163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey reader.finishLine(); 76163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertFalse(reader.hasMoreData()); 77163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey } 78163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 79163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey public void testBufferSize() throws Exception { 80163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey // read numbers using very small buffer size, exercising fillBuf() 81163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey final ProcFileReader reader = buildReader("1 21 3 41 5 61 7 81 9 10\n", 3); 82163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 83163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals(1, reader.nextInt()); 84163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals(21, reader.nextInt()); 85163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals(3, reader.nextInt()); 86163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals(41, reader.nextInt()); 87163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals(5, reader.nextInt()); 88163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals(61, reader.nextInt()); 89163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals(7, reader.nextInt()); 90163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals(81, reader.nextInt()); 91163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals(9, reader.nextInt()); 92163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals(10, reader.nextInt()); 93163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey reader.finishLine(); 94163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertFalse(reader.hasMoreData()); 95163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey } 96163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 97163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey public void testBlankLines() throws Exception { 98163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey final ProcFileReader reader = buildReader("1\n\n2\n\n3\n"); 99163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 100163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals(1, reader.nextInt()); 101163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey reader.finishLine(); 102163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertTrue(reader.hasMoreData()); 103163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey reader.finishLine(); 104163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertTrue(reader.hasMoreData()); 105163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 106163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals(2, reader.nextInt()); 107163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey reader.finishLine(); 108163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertTrue(reader.hasMoreData()); 109163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey reader.finishLine(); 110163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertTrue(reader.hasMoreData()); 111163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 112163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals(3, reader.nextInt()); 113163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey reader.finishLine(); 114163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertFalse(reader.hasMoreData()); 115163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey } 116163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 117163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey public void testMinMax() throws Exception { 118163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey final ProcFileReader reader = buildReader( 119163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey "1 -1024 9223372036854775807 -9223372036854775808\n"); 120163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 121163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals(1, reader.nextLong()); 122163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals(-1024, reader.nextLong()); 123163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals(Long.MAX_VALUE, reader.nextLong()); 124163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals(Long.MIN_VALUE, reader.nextLong()); 125163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey reader.finishLine(); 126163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertFalse(reader.hasMoreData()); 127163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey } 128163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 129163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey public void testDelimiterNeverFound() throws Exception { 130163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey final ProcFileReader reader = buildReader("teststringwithoutdelimiters"); 131163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 132163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey try { 133163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey reader.nextString(); 134163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey fail("somehow read a string value?"); 135163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey } catch (IOException e) { 136163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey // expected 1378e7b3b15f7a4f888d55f080d3ed61860cd5fab55Jeff Sharkey assertTrue(e.getMessage().contains("End of stream")); 138163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey } 139163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey } 140163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 141163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey public void testLargerThanBuffer() throws Exception { 142163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey // try finishing line larger than buffer 143163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey final ProcFileReader reader = buildReader("1 teststringlongerthanbuffer\n", 4); 144163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 145163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertEquals(1, reader.nextLong()); 146163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey try { 147163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey reader.finishLine(); 148163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey fail("somehow finished line?"); 149163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey } catch (IOException e) { 150163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey // expected 151163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey assertTrue(e.getMessage().contains("already-full buffer")); 152163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey } 153163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey } 154163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 1558e7b3b15f7a4f888d55f080d3ed61860cd5fab55Jeff Sharkey public void testOptionalLongs() throws Exception { 1568e7b3b15f7a4f888d55f080d3ed61860cd5fab55Jeff Sharkey final ProcFileReader reader = buildReader("123 456\n789\n"); 1578e7b3b15f7a4f888d55f080d3ed61860cd5fab55Jeff Sharkey 1588e7b3b15f7a4f888d55f080d3ed61860cd5fab55Jeff Sharkey assertEquals(123L, reader.nextLong()); 1598e7b3b15f7a4f888d55f080d3ed61860cd5fab55Jeff Sharkey assertEquals(456L, reader.nextOptionalLong(-1L)); 1608e7b3b15f7a4f888d55f080d3ed61860cd5fab55Jeff Sharkey assertEquals(-1L, reader.nextOptionalLong(-1L)); 1618e7b3b15f7a4f888d55f080d3ed61860cd5fab55Jeff Sharkey assertEquals(-1L, reader.nextOptionalLong(-1L)); 1628e7b3b15f7a4f888d55f080d3ed61860cd5fab55Jeff Sharkey assertEquals(-1L, reader.nextOptionalLong(-1L)); 1638e7b3b15f7a4f888d55f080d3ed61860cd5fab55Jeff Sharkey reader.finishLine(); 1648e7b3b15f7a4f888d55f080d3ed61860cd5fab55Jeff Sharkey 1658e7b3b15f7a4f888d55f080d3ed61860cd5fab55Jeff Sharkey assertEquals(789L, reader.nextOptionalLong(-1L)); 1668e7b3b15f7a4f888d55f080d3ed61860cd5fab55Jeff Sharkey assertEquals(-1L, reader.nextOptionalLong(-1L)); 1678e7b3b15f7a4f888d55f080d3ed61860cd5fab55Jeff Sharkey } 1688e7b3b15f7a4f888d55f080d3ed61860cd5fab55Jeff Sharkey 169163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey private static ProcFileReader buildReader(String string) throws IOException { 170163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey return buildReader(string, 2048); 171163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey } 172163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 173163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey private static ProcFileReader buildReader(String string, int bufferSize) throws IOException { 174163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey return new ProcFileReader( 175d396a448b2e36e29598c954b64bfddef73f3fae0Elliott Hughes new ByteArrayInputStream(string.getBytes(StandardCharsets.US_ASCII)), bufferSize); 176163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey } 177163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey} 178