Skip to content

Commit c4ac331

Browse files
committed
Fill the lookahead buffer on short reads from a chunked source (#625).
Sort members
1 parent 515899a commit c4ac331

3 files changed

Lines changed: 47 additions & 46 deletions

File tree

src/changes/changes.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
<action type="fix" dev="ggregory" due-to="Naveed Khan, Gary Gregory">Skip trailing delimiter on comment lines in printComment (#623).</action>
7070
<action type="fix" dev="ggregory" due-to="Gary Gregory, Naveed Khan">Fix SpotBugs 4.10.3 USO_UNSAFE_METHOD_SYNCHRONIZATION in CSVFormat print methods (#624).</action>
7171
<action type="fix" dev="ggregory" due-to="Gary Gregory, Naveed Khan">Count rows produced instead of getRow() in printRecords(ResultSet) (#627).</action>
72+
<action type="fix" dev="ggregory" due-to="Gary Gregory, saleem malik">Fill the lookahead buffer on short reads from a chunked source (#625).</action>
7273
<!-- ADD -->
7374
<action type="add" dev="ggregory" due-to="Gary Gregory, Indy, Sylvia van Os" issue="CSV-307">Add an "Android Compatibility" section to the web site.</action>
7475
<action type="add" dev="ggregory" due-to="Ruiqi Dong, Gary Gregory" issue="CSV-325">Add CSVParser.Builder.setByteOffset(long) (#604).</action>

src/test/java/org/apache/commons/csv/CSVParserTest.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1696,29 +1696,29 @@ void testParseUrlCharsetNullFormat() throws IOException {
16961696
}
16971697

16981698
@Test
1699-
void testParseWithDelimiterStringWithEscape() throws IOException {
1700-
final String source = "a![!|!]b![|]c[|]xyz\r\nabc[abc][|]xyz";
1699+
void testParseWithDelimiterStringFromChunkedReader() throws IOException {
17011700
final CSVFormat csvFormat = CSVFormat.DEFAULT.builder().setDelimiter("[|]").setEscape('!').get();
1702-
try (CSVParser csvParser = csvFormat.parse(new StringReader(source))) {
1701+
try (CSVParser csvParser = csvFormat.parse(new ChunkedReader("a[|]b\r\nc![!|!]d[|]e"))) {
17031702
CSVRecord csvRecord = csvParser.nextRecord();
1704-
assertEquals("a[|]b![|]c", csvRecord.get(0));
1705-
assertEquals("xyz", csvRecord.get(1));
1703+
assertEquals("a", csvRecord.get(0));
1704+
assertEquals("b", csvRecord.get(1));
17061705
csvRecord = csvParser.nextRecord();
1707-
assertEquals("abc[abc]", csvRecord.get(0));
1708-
assertEquals("xyz", csvRecord.get(1));
1706+
assertEquals("c[|]d", csvRecord.get(0));
1707+
assertEquals("e", csvRecord.get(1));
17091708
}
17101709
}
17111710

17121711
@Test
1713-
void testParseWithDelimiterStringFromChunkedReader() throws IOException {
1712+
void testParseWithDelimiterStringWithEscape() throws IOException {
1713+
final String source = "a![!|!]b![|]c[|]xyz\r\nabc[abc][|]xyz";
17141714
final CSVFormat csvFormat = CSVFormat.DEFAULT.builder().setDelimiter("[|]").setEscape('!').get();
1715-
try (CSVParser csvParser = csvFormat.parse(new ChunkedReader("a[|]b\r\nc![!|!]d[|]e"))) {
1715+
try (CSVParser csvParser = csvFormat.parse(new StringReader(source))) {
17161716
CSVRecord csvRecord = csvParser.nextRecord();
1717-
assertEquals("a", csvRecord.get(0));
1718-
assertEquals("b", csvRecord.get(1));
1717+
assertEquals("a[|]b![|]c", csvRecord.get(0));
1718+
assertEquals("xyz", csvRecord.get(1));
17191719
csvRecord = csvParser.nextRecord();
1720-
assertEquals("c[|]d", csvRecord.get(0));
1721-
assertEquals("e", csvRecord.get(1));
1720+
assertEquals("abc[abc]", csvRecord.get(0));
1721+
assertEquals("xyz", csvRecord.get(1));
17221722
}
17231723
}
17241724

src/test/java/org/apache/commons/csv/ExtendedBufferedReaderTest.java

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,39 @@ void testEmptyInput() throws Exception {
5555
}
5656
}
5757

58+
@Test
59+
void testPeekArrayPastEndOfChunkedReader() throws Exception {
60+
try (ExtendedBufferedReader br = new ExtendedBufferedReader(new ChunkedReader("ab"))) {
61+
final char[] peeked = new char[4];
62+
assertEquals(2, br.peek(peeked));
63+
assertEquals('a', peeked[0]);
64+
assertEquals('b', peeked[1]);
65+
}
66+
}
67+
68+
@Test
69+
void testReadAndPeekArrayFromChunkedReader() throws Exception {
70+
try (ExtendedBufferedReader br = new ExtendedBufferedReader(new ChunkedReader("abcdef"))) {
71+
final char[] peeked = new char[3];
72+
assertEquals(3, br.peek(peeked));
73+
assertArrayEquals(new char[] { 'a', 'b', 'c' }, peeked);
74+
final char[] read = new char[3];
75+
assertEquals(3, br.read(read, 0, 3));
76+
assertArrayEquals(new char[] { 'a', 'b', 'c' }, read);
77+
}
78+
}
79+
80+
@Test
81+
void testReadArrayPastEndOfChunkedReader() throws Exception {
82+
try (ExtendedBufferedReader br = new ExtendedBufferedReader(new ChunkedReader("ab"))) {
83+
final char[] read = new char[4];
84+
assertEquals(2, br.read(read, 0, 4));
85+
assertEquals('a', read[0]);
86+
assertEquals('b', read[1]);
87+
assertEquals(EOF, br.read(read, 0, 4));
88+
}
89+
}
90+
5891
/*
5992
* Test to illustrate https://issues.apache.org/jira/browse/CSV-75
6093
*/
@@ -240,37 +273,4 @@ void testReadLookahead2() throws Exception {
240273
assertEquals('d', br.getLastChar());
241274
}
242275
}
243-
244-
@Test
245-
void testReadAndPeekArrayFromChunkedReader() throws Exception {
246-
try (ExtendedBufferedReader br = new ExtendedBufferedReader(new ChunkedReader("abcdef"))) {
247-
final char[] peeked = new char[3];
248-
assertEquals(3, br.peek(peeked));
249-
assertArrayEquals(new char[] { 'a', 'b', 'c' }, peeked);
250-
final char[] read = new char[3];
251-
assertEquals(3, br.read(read, 0, 3));
252-
assertArrayEquals(new char[] { 'a', 'b', 'c' }, read);
253-
}
254-
}
255-
256-
@Test
257-
void testReadArrayPastEndOfChunkedReader() throws Exception {
258-
try (ExtendedBufferedReader br = new ExtendedBufferedReader(new ChunkedReader("ab"))) {
259-
final char[] read = new char[4];
260-
assertEquals(2, br.read(read, 0, 4));
261-
assertEquals('a', read[0]);
262-
assertEquals('b', read[1]);
263-
assertEquals(EOF, br.read(read, 0, 4));
264-
}
265-
}
266-
267-
@Test
268-
void testPeekArrayPastEndOfChunkedReader() throws Exception {
269-
try (ExtendedBufferedReader br = new ExtendedBufferedReader(new ChunkedReader("ab"))) {
270-
final char[] peeked = new char[4];
271-
assertEquals(2, br.peek(peeked));
272-
assertEquals('a', peeked[0]);
273-
assertEquals('b', peeked[1]);
274-
}
275-
}
276276
}

0 commit comments

Comments
 (0)