Home | History | Annotate | Download | only in util
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.internal.util;
     18 
     19 import android.test.AndroidTestCase;
     20 
     21 import java.io.ByteArrayInputStream;
     22 import java.io.IOException;
     23 import java.nio.charset.StandardCharsets;
     24 
     25 /**
     26  * Tests for {@link ProcFileReader}.
     27  */
     28 public class ProcFileReaderTest extends AndroidTestCase {
     29 
     30     public void testEmpty() throws Exception {
     31         final ProcFileReader reader = buildReader("");
     32 
     33         assertFalse(reader.hasMoreData());
     34         try {
     35             reader.finishLine();
     36             fail("somehow finished line beyond end of stream?");
     37         } catch (IOException e) {
     38             // expected
     39         }
     40         assertFalse(reader.hasMoreData());
     41     }
     42 
     43     public void testSingleString() throws Exception {
     44         final ProcFileReader reader = buildReader("a\nb\nc\n");
     45 
     46         assertEquals("a", reader.nextString());
     47         reader.finishLine();
     48         assertTrue(reader.hasMoreData());
     49 
     50         assertEquals("b", reader.nextString());
     51         reader.finishLine();
     52         assertTrue(reader.hasMoreData());
     53 
     54         assertEquals("c", reader.nextString());
     55         reader.finishLine();
     56         assertFalse(reader.hasMoreData());
     57     }
     58 
     59     public void testMixedNumbersSkip() throws Exception {
     60         final ProcFileReader reader = buildReader("1 2 3\n4 abc_def 5 6 7 8 9\n10\n");
     61 
     62         assertEquals(1, reader.nextInt());
     63         assertEquals(2, reader.nextInt());
     64         assertEquals(3, reader.nextInt());
     65         reader.finishLine();
     66         assertTrue(reader.hasMoreData());
     67 
     68         assertEquals(4, reader.nextInt());
     69         assertEquals("abc_def", reader.nextString());
     70         assertEquals(5, reader.nextInt());
     71         reader.finishLine();
     72         assertTrue(reader.hasMoreData());
     73 
     74         assertEquals(10, reader.nextInt());
     75         reader.finishLine();
     76         assertFalse(reader.hasMoreData());
     77     }
     78 
     79     public void testBufferSize() throws Exception {
     80         // read numbers using very small buffer size, exercising fillBuf()
     81         final ProcFileReader reader = buildReader("1 21 3 41 5 61 7 81 9 10\n", 3);
     82 
     83         assertEquals(1, reader.nextInt());
     84         assertEquals(21, reader.nextInt());
     85         assertEquals(3, reader.nextInt());
     86         assertEquals(41, reader.nextInt());
     87         assertEquals(5, reader.nextInt());
     88         assertEquals(61, reader.nextInt());
     89         assertEquals(7, reader.nextInt());
     90         assertEquals(81, reader.nextInt());
     91         assertEquals(9, reader.nextInt());
     92         assertEquals(10, reader.nextInt());
     93         reader.finishLine();
     94         assertFalse(reader.hasMoreData());
     95     }
     96 
     97     public void testBlankLines() throws Exception {
     98         final ProcFileReader reader = buildReader("1\n\n2\n\n3\n");
     99 
    100         assertEquals(1, reader.nextInt());
    101         reader.finishLine();
    102         assertTrue(reader.hasMoreData());
    103         reader.finishLine();
    104         assertTrue(reader.hasMoreData());
    105 
    106         assertEquals(2, reader.nextInt());
    107         reader.finishLine();
    108         assertTrue(reader.hasMoreData());
    109         reader.finishLine();
    110         assertTrue(reader.hasMoreData());
    111 
    112         assertEquals(3, reader.nextInt());
    113         reader.finishLine();
    114         assertFalse(reader.hasMoreData());
    115     }
    116 
    117     public void testMinMax() throws Exception {
    118         final ProcFileReader reader = buildReader(
    119                 "1 -1024 9223372036854775807 -9223372036854775808\n");
    120 
    121         assertEquals(1, reader.nextLong());
    122         assertEquals(-1024, reader.nextLong());
    123         assertEquals(Long.MAX_VALUE, reader.nextLong());
    124         assertEquals(Long.MIN_VALUE, reader.nextLong());
    125         reader.finishLine();
    126         assertFalse(reader.hasMoreData());
    127     }
    128 
    129     public void testDelimiterNeverFound() throws Exception {
    130         final ProcFileReader reader = buildReader("teststringwithoutdelimiters");
    131 
    132         try {
    133             reader.nextString();
    134             fail("somehow read a string value?");
    135         } catch (IOException e) {
    136             // expected
    137             assertTrue(e.getMessage().contains("End of stream"));
    138         }
    139     }
    140 
    141     public void testLargerThanBuffer() throws Exception {
    142         // try finishing line larger than buffer
    143         final ProcFileReader reader = buildReader("1 teststringlongerthanbuffer\n", 4);
    144 
    145         assertEquals(1, reader.nextLong());
    146         try {
    147             reader.finishLine();
    148             fail("somehow finished line?");
    149         } catch (IOException e) {
    150             // expected
    151             assertTrue(e.getMessage().contains("already-full buffer"));
    152         }
    153     }
    154 
    155     public void testOptionalLongs() throws Exception {
    156         final ProcFileReader reader = buildReader("123 456\n789\n");
    157 
    158         assertEquals(123L, reader.nextLong());
    159         assertEquals(456L, reader.nextOptionalLong(-1L));
    160         assertEquals(-1L, reader.nextOptionalLong(-1L));
    161         assertEquals(-1L, reader.nextOptionalLong(-1L));
    162         assertEquals(-1L, reader.nextOptionalLong(-1L));
    163         reader.finishLine();
    164 
    165         assertEquals(789L, reader.nextOptionalLong(-1L));
    166         assertEquals(-1L, reader.nextOptionalLong(-1L));
    167     }
    168 
    169     private static ProcFileReader buildReader(String string) throws IOException {
    170         return buildReader(string, 2048);
    171     }
    172 
    173     private static ProcFileReader buildReader(String string, int bufferSize) throws IOException {
    174         return new ProcFileReader(
    175                 new ByteArrayInputStream(string.getBytes(StandardCharsets.US_ASCII)), bufferSize);
    176     }
    177 }
    178