Skip to content

Commit 2b65ea1

Browse files
committed
Add bit more testing for names with null bytes (inspired by [dataformats-binary#312])
1 parent f3f1f78 commit 2b65ea1

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed

src/test/java/com/fasterxml/jackson/core/read/ParserSymbolHandlingTest.java

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,68 @@ private void _testSymbolsWithNull(JsonFactory f, boolean useBytes) throws Except
5252
assertToken(JsonToken.END_OBJECT, parser.nextToken());
5353
parser.close();
5454
}
55+
56+
// // Additional testing inspired by [dataformats-binary#312]; did not
57+
// // affect JSON backend but wanted to ensure
58+
59+
public void testSymbolsWithNullOnlyNameBytes() throws Exception {
60+
JsonFactory f = new JsonFactory();
61+
_testSymbolsWithNullOnlyNameBytes(f, true);
62+
// and repeat with same factory, just for fun, and to ensure symbol table is fine
63+
_testSymbolsWithNullOnlyNameBytes(f, true);
64+
}
65+
66+
public void testSymbolsWithNullOnlyNameChars() throws Exception {
67+
JsonFactory f = new JsonFactory();
68+
_testSymbolsWithNullOnlyNameBytes(f, false);
69+
_testSymbolsWithNullOnlyNameBytes(f, false);
70+
}
71+
72+
private void _testSymbolsWithNullOnlyNameBytes(JsonFactory f, boolean useBytes) throws Exception
73+
{
74+
final String FIELD1 = "\u0000";
75+
final String FIELD2 = FIELD1 + FIELD1;
76+
final String FIELD3 = FIELD2 + FIELD1;
77+
final String FIELD4 = FIELD3 + FIELD1;
78+
final String QUOTED_NULL = "\\u0000";
79+
80+
final String INPUT = a2q(String.format("{'%s':1, '%s':2, '%s':3, '%s':4}",
81+
QUOTED_NULL, QUOTED_NULL + QUOTED_NULL,
82+
QUOTED_NULL + QUOTED_NULL + QUOTED_NULL,
83+
QUOTED_NULL + QUOTED_NULL + QUOTED_NULL + QUOTED_NULL
84+
));
85+
JsonParser p = useBytes ? f.createParser(INPUT.getBytes("UTF-8"))
86+
: f.createParser(INPUT);
87+
88+
assertToken(JsonToken.START_OBJECT, p.nextToken());
89+
90+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
91+
_assertNullStrings(FIELD1, p.currentName());
92+
assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken());
93+
assertEquals(1, p.getIntValue());
94+
95+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
96+
_assertNullStrings(FIELD2, p.currentName());
97+
assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken());
98+
assertEquals(2, p.getIntValue());
99+
100+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
101+
_assertNullStrings(FIELD3, p.currentName());
102+
assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken());
103+
assertEquals(3, p.getIntValue());
104+
105+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
106+
_assertNullStrings(FIELD4, p.currentName());
107+
assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken());
108+
assertEquals(4, p.getIntValue());
109+
110+
assertToken(JsonToken.END_OBJECT, p.nextToken());
111+
}
112+
113+
private void _assertNullStrings(String exp, String actual) {
114+
if (exp.length() != actual.length()) {
115+
fail("Expected "+exp.length()+" nulls, got "+actual.length());
116+
}
117+
assertEquals(exp, actual);
118+
}
55119
}

0 commit comments

Comments
 (0)