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();