Skip to content

Commit 99f749d

Browse files
authored
Add 1 passing, 2 failing tests for #1412 (#1413)
1 parent d2f70d0 commit 99f749d

File tree

1 file changed

+127
-0
lines changed

1 file changed

+127
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
package com.fasterxml.jackson.core.tofix.async;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.Objects;
6+
7+
import org.junit.jupiter.api.DisplayName;
8+
import org.junit.jupiter.api.Test;
9+
10+
import com.fasterxml.jackson.core.*;
11+
import com.fasterxml.jackson.core.async.AsyncTestBase;
12+
import com.fasterxml.jackson.core.async.ByteArrayFeeder;
13+
import com.fasterxml.jackson.core.testutil.failure.JacksonTestFailureExpected;
14+
15+
import static java.nio.charset.StandardCharsets.UTF_8;
16+
import static org.junit.jupiter.api.Assertions.assertEquals;
17+
18+
class AsyncLocation1412Test extends AsyncTestBase
19+
{
20+
private static final JsonFactory jsonFactory = new JsonFactory();
21+
private static final byte[] json = "[true]".getBytes(UTF_8);
22+
23+
static class TokenAndByteOffsets {
24+
public final JsonToken token;
25+
public final long tokenByteOffset;
26+
public final long parserByteOffset;
27+
28+
public TokenAndByteOffsets(JsonToken token,
29+
long tokenByteOffset,
30+
long parserByteOffset) {
31+
this.token = token;
32+
this.tokenByteOffset = tokenByteOffset;
33+
this.parserByteOffset = parserByteOffset;
34+
}
35+
36+
@Override
37+
public boolean equals(Object o) {
38+
if (!(o instanceof TokenAndByteOffsets)) {
39+
return false;
40+
}
41+
TokenAndByteOffsets other = (TokenAndByteOffsets) o;
42+
return Objects.equals(token, other.token)
43+
&& tokenByteOffset == other.tokenByteOffset
44+
&& parserByteOffset == other.parserByteOffset;
45+
}
46+
}
47+
48+
/**
49+
* Returns the result of feeding the whole JSON document at once from array offset zero.
50+
*/
51+
private static List<TokenAndByteOffsets> expected() throws Exception {
52+
try (JsonParser parser = jsonFactory.createNonBlockingByteArrayParser()) {
53+
ByteArrayFeeder feeder = (ByteArrayFeeder) parser.getNonBlockingInputFeeder();
54+
feeder.feedInput(json, 0, json.length);
55+
feeder.endOfInput();
56+
return readAvailableTokens(parser);
57+
}
58+
}
59+
60+
// This one passes:
61+
@Test
62+
@DisplayName("Feed one byte at a time from array offset zero")
63+
void feedByteByByteFromOffsetZero() throws Exception {
64+
try (JsonParser parser = jsonFactory.createNonBlockingByteArrayParser()) {
65+
ByteArrayFeeder feeder = (ByteArrayFeeder) parser.getNonBlockingInputFeeder();
66+
List<TokenAndByteOffsets> actual = new ArrayList<>();
67+
68+
for (int i = 0; i < json.length; i++) {
69+
byte[] temp = new byte[]{json[i]};
70+
feeder.feedInput(temp, 0, temp.length);
71+
if (i == json.length - 1) feeder.endOfInput();
72+
actual.addAll(readAvailableTokens(parser));
73+
}
74+
75+
assertEquals(expected(), actual);
76+
}
77+
}
78+
79+
@JacksonTestFailureExpected
80+
@Test
81+
@DisplayName("Feed one byte at a time from non-zero array offset")
82+
void feedByteByByteFromNonZeroOffset() throws Exception {
83+
try (JsonParser parser = jsonFactory.createNonBlockingByteArrayParser()) {
84+
ByteArrayFeeder feeder = (ByteArrayFeeder) parser.getNonBlockingInputFeeder();
85+
List<TokenAndByteOffsets> actual = new ArrayList<>();
86+
87+
for (int i = 0; i < json.length; i++) {
88+
feeder.feedInput(json, i, i + 1);
89+
if (i == json.length - 1) feeder.endOfInput();
90+
actual.addAll(readAvailableTokens(parser));
91+
}
92+
93+
assertEquals(expected(), actual);
94+
}
95+
}
96+
97+
@JacksonTestFailureExpected
98+
@Test
99+
@DisplayName("Feed whole document at once from non-zero array offset")
100+
void feedWholeDocumentFromNonZeroOffset() throws Exception {
101+
// Same document, but preceded by a 0 byte.
102+
byte[] jsonOffsetByOne = new byte[json.length + 1];
103+
System.arraycopy(json, 0, jsonOffsetByOne, 1, json.length);
104+
105+
try (JsonParser parser = jsonFactory.createNonBlockingByteArrayParser()) {
106+
ByteArrayFeeder feeder = (ByteArrayFeeder) parser.getNonBlockingInputFeeder();
107+
108+
feeder.feedInput(jsonOffsetByOne, 1, jsonOffsetByOne.length);
109+
feeder.endOfInput();
110+
assertEquals(expected(), readAvailableTokens(parser));
111+
}
112+
}
113+
114+
private static List<TokenAndByteOffsets> readAvailableTokens(JsonParser parser) throws Exception
115+
{
116+
List<TokenAndByteOffsets> result = new ArrayList<>();
117+
while (true) {
118+
JsonToken token = parser.nextToken();
119+
if (token == JsonToken.NOT_AVAILABLE || token == null) return result;
120+
result.add(new TokenAndByteOffsets(
121+
token,
122+
parser.currentTokenLocation().getByteOffset(),
123+
parser.currentLocation().getByteOffset())
124+
);
125+
}
126+
}
127+
}

0 commit comments

Comments
 (0)