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