You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@johnzon.apache.org by sa...@apache.org on 2015/08/07 15:20:37 UTC
incubator-johnzon git commit: Fixed a bug which causes that invalid
json was not detected
Repository: incubator-johnzon
Updated Branches:
refs/heads/master 156824a15 -> e356d5a81
Fixed a bug which causes that invalid json was not detected
Project: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/commit/e356d5a8
Tree: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/tree/e356d5a8
Diff: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/diff/e356d5a8
Branch: refs/heads/master
Commit: e356d5a81d05f09bc223069fa9a73993bb358191
Parents: 156824a
Author: Hendrik Saly <he...@gmail.com>
Authored: Fri Aug 7 15:20:45 2015 +0200
Committer: Hendrik Saly <he...@gmail.com>
Committed: Fri Aug 7 15:20:45 2015 +0200
----------------------------------------------------------------------
.../johnzon/core/JsonStreamParserImpl.java | 11 ++-
.../org/apache/johnzon/core/JsonParserTest.java | 94 ++++++++++++++++++++
.../apache/johnzon/core/JsonReaderImplTest.java | 62 +++++++++++++
.../org/apache/johnzon/core/LocationTest.java | 6 +-
4 files changed, 168 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/e356d5a8/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java
index e72ca7b..27fcbe2 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java
@@ -333,9 +333,10 @@ public class JsonStreamParserImpl implements JsonChars, JsonParser{
final char c = readNextNonWhitespaceChar(readNextChar());
if (c == COMMA_CHAR) {
-
//last event must one of the following-> " ] } LITERAL
- if (previousEvent == START_ARRAY || previousEvent == START_OBJECT || previousEvent == COMMA_EVENT || previousEvent == KEY_NAME) {
+ if (previousEvent == KEY_SEPARATOR_EVENT || previousEvent == START_ARRAY
+ || previousEvent == START_OBJECT || previousEvent == COMMA_EVENT
+ || previousEvent == KEY_NAME) {
throw uexc("Expected \" ] } LITERAL");
}
@@ -434,6 +435,9 @@ public class JsonStreamParserImpl implements JsonChars, JsonParser{
if (currentStructureElement == null) {
currentStructureElement = new StructureElement(null, false);
} else {
+ if(!currentStructureElement.isArray && previousEvent != KEY_SEPARATOR_EVENT) {
+ throw uexc("Expected :");
+ }
final StructureElement localStructureElement = new StructureElement(currentStructureElement, false);
currentStructureElement = localStructureElement;
}
@@ -471,6 +475,9 @@ public class JsonStreamParserImpl implements JsonChars, JsonParser{
if (currentStructureElement == null) {
currentStructureElement = new StructureElement(null, true);
} else {
+ if(!currentStructureElement.isArray && previousEvent != KEY_SEPARATOR_EVENT) {
+ throw uexc("Expected \"");
+ }
final StructureElement localStructureElement = new StructureElement(currentStructureElement, true);
currentStructureElement = localStructureElement;
}
http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/e356d5a8/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java
index dc6326f..0ffbd6d 100644
--- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java
@@ -1712,6 +1712,100 @@ public class JsonParserTest {
Json.createReader(new ByteArrayInputStream("-{\"a\":2}".getBytes())).read();
}
+ @Test(expected = JsonParsingException.class)
+ // TODO read key and : in once
+ public void invalidArrayMissingSeparator() {
+ final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, \"a\"[1,2,3,4,5,[2,2,3,4,5]], \"z\":8}"));
+ assertNotNull(parser);
+ assertTrue(parser.next() == Event.START_OBJECT);
+ assertTrue(parser.next() == Event.KEY_NAME);
+ assertTrue(parser.next() == Event.VALUE_NUMBER);
+ assertTrue(parser.next() == Event.KEY_NAME);
+ parser.next();
+ }
+
+ @Test(expected = JsonParsingException.class)
+ public void invalidArray() {
+ final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, [1,2,3,4,5,[2,2,3,4,5]], \"z\":8}"));
+ assertNotNull(parser);
+ assertTrue(parser.next() == Event.START_OBJECT);
+ assertTrue(parser.next() == Event.KEY_NAME);
+ assertTrue(parser.next() == Event.VALUE_NUMBER);
+ parser.next();
+ }
+
+ @Test(expected = JsonParsingException.class)
+ public void invalidEmptyObject() {
+ final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, {}, \"z\":8}"));
+ assertNotNull(parser);
+ assertTrue(parser.next() == Event.START_OBJECT);
+ assertTrue(parser.next() == Event.KEY_NAME);
+ assertTrue(parser.next() == Event.VALUE_NUMBER);
+ parser.next();
+ }
+
+ @Test(expected = JsonParsingException.class)
+ public void invalidObject() {
+ final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, {\"w\":1}, \"z\":8}"));
+ assertNotNull(parser);
+ assertTrue(parser.next() == Event.START_OBJECT);
+ assertTrue(parser.next() == Event.KEY_NAME);
+ assertTrue(parser.next() == Event.VALUE_NUMBER);
+ parser.next();
+ }
+
+ @Test(expected = JsonParsingException.class)
+ public void invalidLiteral() {
+ final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, true, \"z\":8}"));
+ assertNotNull(parser);
+ assertTrue(parser.next() == Event.START_OBJECT);
+ assertTrue(parser.next() == Event.KEY_NAME);
+ assertTrue(parser.next() == Event.VALUE_NUMBER);
+ parser.next();
+ }
+
+ @Test(expected = JsonParsingException.class)
+ public void invalidString() {
+ final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, \"a\", \"z\":8}"));
+ assertNotNull(parser);
+ assertTrue(parser.next() == Event.START_OBJECT);
+ assertTrue(parser.next() == Event.KEY_NAME);
+ assertTrue(parser.next() == Event.VALUE_NUMBER);
+ assertTrue(parser.next() == Event.KEY_NAME);
+ parser.next();
+ }
+
+ @Test(expected = JsonParsingException.class)
+ public void invalidKeyWithoutValue() {
+ final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, \"a\":, \"z\":8}"));
+ assertNotNull(parser);
+ assertTrue(parser.next() == Event.START_OBJECT);
+ assertTrue(parser.next() == Event.KEY_NAME);
+ assertTrue(parser.next() == Event.VALUE_NUMBER);
+ assertTrue(parser.next() == Event.KEY_NAME);
+ parser.next();
+
+ }
+
+ @Test(expected = JsonParsingException.class)
+ public void invalidArrayMissingKeyname() {
+ final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, :[1,2,3,4,5,[2,2,3,4,5]], \"z\":8}"));
+ assertNotNull(parser);
+ assertTrue(parser.next() == Event.START_OBJECT);
+ assertTrue(parser.next() == Event.KEY_NAME);
+ assertTrue(parser.next() == Event.VALUE_NUMBER);
+ parser.next();
+ }
+
+ @Test(expected = JsonParsingException.class)
+ public void missingClosingObject() {
+ final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, \"d\": {\"m\":6}, \"z\":true"));
+ assertNotNull(parser);
+ while (parser.hasNext()) {
+ parser.next();
+ }
+ }
+
class AttemptingInputStream extends ByteArrayInputStream {
public AttemptingInputStream(byte[] buf) {
http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/e356d5a8/johnzon-core/src/test/java/org/apache/johnzon/core/JsonReaderImplTest.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonReaderImplTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonReaderImplTest.java
index 644a91b..657a5f3 100644
--- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonReaderImplTest.java
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonReaderImplTest.java
@@ -27,6 +27,7 @@ import static org.junit.Assert.assertTrue;
import java.io.ByteArrayInputStream;
import java.io.InputStreamReader;
import java.io.Reader;
+import java.io.StringReader;
import java.nio.charset.Charset;
import java.util.Collections;
import java.util.HashMap;
@@ -36,6 +37,7 @@ import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonObject;
import javax.json.JsonReader;
+import javax.json.JsonReaderFactory;
import javax.json.JsonStructure;
import org.junit.Test;
@@ -464,4 +466,64 @@ public class JsonReaderImplTest {
assertEquals("fdmcd", object.getJsonObject("//object").getString("sub"));
reader.close();
}
+
+ @Test
+ public void testGrowingString() throws Throwable {
+ JsonReaderFactory factory = Json.createReaderFactory(null);
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < 40000; i++) {
+ sb.append('x');
+ String growingString = sb.toString();
+ String str = "[4, \"\", \"" + growingString + "\", \"\", \"" + growingString + "\", \"\", 400]";
+ try {
+ JsonReader reader = factory.createReader(new StringReader(str));
+ JsonArray array = reader.readArray();
+ assertEquals(4, array.getInt(0));
+ assertEquals("", array.getString(1));
+ assertEquals(growingString, array.getString(2));
+ assertEquals("", array.getString(3));
+ assertEquals(growingString, array.getString(4));
+ assertEquals("", array.getString(5));
+ assertEquals(400, array.getInt(6));
+ reader.close();
+ } catch (Throwable t) {
+ throw new Throwable("Failed for growingString with length: " + i, t);
+ }
+ }
+ }
+
+ @Test
+ public void testGrowingStringWithDiferentBufferSizes() throws Throwable {
+ for (int size = 20; size < 500; size++) {
+ final int k = size;
+ Map<String, Object> config = new HashMap<String, Object>() {
+ {
+ put("org.apache.johnzon.default-char-buffer", k);
+ }
+ };
+ JsonReaderFactory factory = Json.createReaderFactory(config);
+
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < 1000; i++) {
+ sb.append('x');
+ String name = sb.toString();
+ String str = "[4, \"\", \"" + name + "\", \"\", \"" + name + "\", \"\", 400]";
+ try {
+ JsonReader reader = factory.createReader(new StringReader(str));
+ JsonArray array = reader.readArray();
+ assertEquals(4, array.getInt(0));
+ assertEquals("", array.getString(1));
+ assertEquals(name, array.getString(2));
+ assertEquals("", array.getString(3));
+ assertEquals(name, array.getString(4));
+ assertEquals("", array.getString(5));
+ assertEquals(400, array.getInt(6));
+ reader.close();
+
+ } catch (Throwable t) {
+ throw new Throwable("Failed for buffer size=" + size + " growingString with length: " + i, t);
+ }
+ }
+ }
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/e356d5a8/johnzon-core/src/test/java/org/apache/johnzon/core/LocationTest.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/LocationTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/LocationTest.java
index 8bc2b60..137084d 100644
--- a/johnzon-core/src/test/java/org/apache/johnzon/core/LocationTest.java
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/LocationTest.java
@@ -224,9 +224,9 @@ public class LocationTest {
// Expected
if (expectedLocation != null) {
JsonLocation loc = je.getLocation();
- assertEquals(expectedLocation.getLineNumber(), loc.getLineNumber());
- assertEquals(expectedLocation.getColumnNumber(), loc.getColumnNumber());
- assertEquals(expectedLocation.getStreamOffset(), loc.getStreamOffset());
+ assertEquals("for line number", expectedLocation.getLineNumber(), loc.getLineNumber());
+ assertEquals("for column number", expectedLocation.getColumnNumber(), loc.getColumnNumber());
+ assertEquals("for stream offset", expectedLocation.getStreamOffset(), loc.getStreamOffset());
}
} finally {
parser.close();