There are enough variants of csv, and it's simple enough that it's easier to just have our own parser than to introduce a dependency on some other library, as this library will be used in a variety of environments. Test: atest frameworks/base/tools/powermodel --host Change-Id: Ib0f7aceb2a58b58f447f6bcef5c95729303dee8a
312 lines
11 KiB
Java
312 lines
11 KiB
Java
/*
|
|
* Copyright (C) 2018 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package com.android.powermodel;
|
|
|
|
import java.io.ByteArrayInputStream;
|
|
import java.io.InputStream;
|
|
import java.nio.charset.StandardCharsets;
|
|
import java.util.ArrayList;
|
|
import org.junit.Assert;
|
|
import org.junit.Test;
|
|
|
|
/**
|
|
* Tests {@link PowerProfile}
|
|
*/
|
|
public class CsvParserTest {
|
|
|
|
class LineCollector implements CsvParser.LineProcessor {
|
|
ArrayList<ArrayList<String>> results = new ArrayList<ArrayList<String>>();
|
|
|
|
@Override
|
|
public void onLine(int lineNumber, ArrayList<String> fields) {
|
|
System.out.println(lineNumber);
|
|
for (String str: fields) {
|
|
System.out.println("-->" + str + "<--");
|
|
}
|
|
results.add(fields);
|
|
}
|
|
}
|
|
|
|
private void assertEquals(String[][] expected, ArrayList<ArrayList<String>> results) {
|
|
final String[][] resultArray = new String[results.size()][];
|
|
for (int i=0; i<results.size(); i++) {
|
|
final ArrayList<String> list = results.get(i);
|
|
resultArray[i] = list.toArray(new String[list.size()]);
|
|
}
|
|
Assert.assertArrayEquals(expected, resultArray);
|
|
}
|
|
|
|
private String makeString(int length) {
|
|
final StringBuilder str = new StringBuilder();
|
|
for (int i=0; i<length; i++) {
|
|
str.append('a');
|
|
}
|
|
return str.toString();
|
|
}
|
|
|
|
@Test public void testEmpty() throws Exception {
|
|
final String text = "";
|
|
System.out.println("Test: [" + text + "]");
|
|
final InputStream is = new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8));
|
|
LineCollector collector = new LineCollector();
|
|
|
|
CsvParser.parse(is, collector);
|
|
|
|
assertEquals(new String[][] {
|
|
}, collector.results);
|
|
}
|
|
|
|
@Test public void testOnlyNewline() throws Exception {
|
|
final String text = "\n";
|
|
System.out.println("Test: [" + text + "]");
|
|
final InputStream is = new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8));
|
|
LineCollector collector = new LineCollector();
|
|
|
|
CsvParser.parse(is, collector);
|
|
|
|
assertEquals(new String[][] {
|
|
}, collector.results);
|
|
}
|
|
|
|
@Test public void testTwoLines() throws Exception {
|
|
final String text = "one,twoo,3\nfour,5,six\n";
|
|
System.out.println("Test: [" + text + "]");
|
|
final InputStream is = new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8));
|
|
LineCollector collector = new LineCollector();
|
|
|
|
CsvParser.parse(is, collector);
|
|
|
|
assertEquals(new String[][] {
|
|
{ "one", "twoo", "3", },
|
|
{ "four", "5", "six", },
|
|
}, collector.results);
|
|
}
|
|
|
|
|
|
@Test public void testEscapedEmpty() throws Exception {
|
|
final String text = "\"\",\"\",\"\"\n";
|
|
System.out.println("Test: [" + text + "]");
|
|
final InputStream is = new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8));
|
|
LineCollector collector = new LineCollector();
|
|
|
|
CsvParser.parse(is, collector);
|
|
|
|
assertEquals(new String[][] {
|
|
{ "", "", "", },
|
|
}, collector.results);
|
|
}
|
|
|
|
@Test public void testEscapedText() throws Exception {
|
|
final String text = "\"one\",\"twoo\",\"3\"\n";
|
|
System.out.println("Test: [" + text + "]");
|
|
final InputStream is = new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8));
|
|
LineCollector collector = new LineCollector();
|
|
|
|
CsvParser.parse(is, collector);
|
|
|
|
assertEquals(new String[][] {
|
|
{ "one", "twoo", "3", },
|
|
}, collector.results);
|
|
}
|
|
|
|
@Test public void testEscapedQuotes() throws Exception {
|
|
final String text = "\"\"\"\",\"\"\"\"\"\",\"\"\"\"\n";
|
|
System.out.println("Test: [" + text + "]");
|
|
final InputStream is = new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8));
|
|
LineCollector collector = new LineCollector();
|
|
|
|
CsvParser.parse(is, collector);
|
|
|
|
assertEquals(new String[][] {
|
|
{ "\"", "\"\"", "\"", },
|
|
}, collector.results);
|
|
}
|
|
|
|
@Test public void testEscapedCommas() throws Exception {
|
|
final String text = "\",\",\",\",\",\"\n";
|
|
System.out.println("Test: [" + text + "]");
|
|
final InputStream is = new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8));
|
|
LineCollector collector = new LineCollector();
|
|
|
|
CsvParser.parse(is, collector);
|
|
|
|
assertEquals(new String[][] {
|
|
{ ",", ",", ",", },
|
|
}, collector.results);
|
|
}
|
|
|
|
@Test public void testEscapedQuotesAndCommas() throws Exception {
|
|
final String text = "\"\"\",\",\"\"\",\",\"\"\",\"\n";
|
|
System.out.println("Test: [" + text + "]");
|
|
final InputStream is = new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8));
|
|
LineCollector collector = new LineCollector();
|
|
|
|
CsvParser.parse(is, collector);
|
|
|
|
assertEquals(new String[][] {
|
|
{ "\",", "\",", "\",", },
|
|
}, collector.results);
|
|
}
|
|
|
|
@Test public void testNoNewline() throws Exception {
|
|
final String text = "a,b,c";
|
|
System.out.println("Test: [" + text + "]");
|
|
final InputStream is = new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8));
|
|
LineCollector collector = new LineCollector();
|
|
|
|
CsvParser.parse(is, collector);
|
|
|
|
assertEquals(new String[][] {
|
|
{ "a", "b", "c", }
|
|
}, collector.results);
|
|
}
|
|
|
|
@Test public void testNoNewlineWithCommas() throws Exception {
|
|
final String text = "a,b,,";
|
|
System.out.println("Test: [" + text + "]");
|
|
final InputStream is = new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8));
|
|
LineCollector collector = new LineCollector();
|
|
|
|
CsvParser.parse(is, collector);
|
|
|
|
assertEquals(new String[][] {
|
|
{ "a", "b", "", "" }
|
|
}, collector.results);
|
|
}
|
|
|
|
@Test public void testNoNewlineWithQuote() throws Exception {
|
|
final String text = "a,b,\",\"";
|
|
System.out.println("Test: [" + text + "]");
|
|
final InputStream is = new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8));
|
|
LineCollector collector = new LineCollector();
|
|
|
|
CsvParser.parse(is, collector);
|
|
|
|
assertEquals(new String[][] {
|
|
{ "a", "b", "," }
|
|
}, collector.results);
|
|
}
|
|
|
|
@Test public void testNoCommas() throws Exception {
|
|
final String text = "aasdfadfadfad";
|
|
System.out.println("Test: [" + text + "]");
|
|
final InputStream is = new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8));
|
|
LineCollector collector = new LineCollector();
|
|
|
|
CsvParser.parse(is, collector);
|
|
|
|
assertEquals(new String[][] {
|
|
{ "aasdfadfadfad", }
|
|
}, collector.results);
|
|
}
|
|
|
|
@Test public void testMaxLength() throws Exception {
|
|
final String text = makeString(CsvParser.MAX_FIELD_SIZE);
|
|
System.out.println("Test: [" + text + "]");
|
|
final InputStream is = new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8));
|
|
LineCollector collector = new LineCollector();
|
|
|
|
CsvParser.parse(is, collector);
|
|
|
|
assertEquals(new String[][] {
|
|
{ text, }
|
|
}, collector.results);
|
|
}
|
|
|
|
@Test public void testMaxLengthTwice() throws Exception {
|
|
String big = makeString(CsvParser.MAX_FIELD_SIZE);
|
|
final String text = big + "," + big;
|
|
System.out.println("Test: [" + text + "]");
|
|
final InputStream is = new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8));
|
|
LineCollector collector = new LineCollector();
|
|
|
|
CsvParser.parse(is, collector);
|
|
|
|
assertEquals(new String[][] {
|
|
{ big, big, }
|
|
}, collector.results);
|
|
}
|
|
|
|
@Test public void testTooLong() throws Exception {
|
|
final String text = makeString(CsvParser.MAX_FIELD_SIZE+1);
|
|
final InputStream is = new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8));
|
|
LineCollector collector = new LineCollector();
|
|
|
|
try {
|
|
CsvParser.parse(is, collector);
|
|
throw new RuntimeException("Expected CsvParser.parse to throw ParseException");
|
|
} catch (ParseException ex) {
|
|
// good
|
|
}
|
|
}
|
|
|
|
@Test public void testBufferBoundary() throws Exception {
|
|
final String big = makeString(CsvParser.MAX_FIELD_SIZE-3);
|
|
final String text = big + ",b,c,d,e,f,g";
|
|
final InputStream is = new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8));
|
|
LineCollector collector = new LineCollector();
|
|
|
|
CsvParser.parse(is, collector);
|
|
|
|
assertEquals(new String[][] {
|
|
{ big, "b", "c", "d", "e", "f", "g", }
|
|
}, collector.results);
|
|
}
|
|
|
|
@Test public void testBufferBoundaryEmpty() throws Exception {
|
|
final String big = makeString(CsvParser.MAX_FIELD_SIZE-3);
|
|
final String text = big + ",,,,,,";
|
|
final InputStream is = new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8));
|
|
LineCollector collector = new LineCollector();
|
|
|
|
CsvParser.parse(is, collector);
|
|
|
|
assertEquals(new String[][] {
|
|
{ big, "", "", "", "", "", "", }
|
|
}, collector.results);
|
|
}
|
|
|
|
// Checks that the escaping and sawQuote behavior is correct at the buffer boundary
|
|
@Test public void testBufferBoundaryEscapingEven() throws Exception {
|
|
final String big = makeString(CsvParser.MAX_FIELD_SIZE-2);
|
|
final String text = big + ",\"\"\"\"\"\"\"\"\"\"\"\"," + big;
|
|
final InputStream is = new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8));
|
|
LineCollector collector = new LineCollector();
|
|
|
|
CsvParser.parse(is, collector);
|
|
|
|
assertEquals(new String[][] {
|
|
{ big, "\"\"\"\"\"", big }
|
|
}, collector.results);
|
|
}
|
|
|
|
// Checks that the escaping and sawQuote behavior is correct at the buffer boundary
|
|
@Test public void testBufferBoundaryEscapingOdd() throws Exception {
|
|
final String big = makeString(CsvParser.MAX_FIELD_SIZE-3);
|
|
final String text = big + ",\"\"\"\"\"\"\"\"\"\"\"\"," + big;
|
|
final InputStream is = new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8));
|
|
LineCollector collector = new LineCollector();
|
|
|
|
CsvParser.parse(is, collector);
|
|
|
|
assertEquals(new String[][] {
|
|
{ big, "\"\"\"\"\"", big }
|
|
}, collector.results);
|
|
}
|
|
|
|
}
|