Index: third_party/WebKit/Source/platform/inspector_protocol/ParserTest.cpp |
diff --git a/third_party/WebKit/Source/platform/inspector_protocol/ParserTest.cpp b/third_party/WebKit/Source/platform/inspector_protocol/ParserTest.cpp |
deleted file mode 100644 |
index 40c6af754cedbe1d1dfe255c31694bbf6c87ed68..0000000000000000000000000000000000000000 |
--- a/third_party/WebKit/Source/platform/inspector_protocol/ParserTest.cpp |
+++ /dev/null |
@@ -1,501 +0,0 @@ |
-// Copyright (c) 2016 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "platform/inspector_protocol/InspectorProtocol.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace blink { |
-namespace protocol { |
- |
-TEST(ParserTest, Reading) |
-{ |
- protocol::Value* tmpValue; |
- std::unique_ptr<protocol::Value> root; |
- std::unique_ptr<protocol::Value> root2; |
- String16 strVal; |
- int intVal = 0; |
- |
- // some whitespace checking |
- root = parseJSON(" null "); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeNull, root->type()); |
- |
- // Invalid JSON string |
- root = parseJSON("nu"); |
- EXPECT_FALSE(root.get()); |
- |
- // Simple bool |
- root = parseJSON("true "); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeBoolean, root->type()); |
- |
- // Embedded comment |
- root = parseJSON("40 /*/"); |
- EXPECT_FALSE(root.get()); |
- root = parseJSON("/* comment */null"); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeNull, root->type()); |
- root = parseJSON("40 /* comment */"); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeInteger, root->type()); |
- EXPECT_TRUE(root->asInteger(&intVal)); |
- EXPECT_EQ(40, intVal); |
- root = parseJSON("/**/ 40 /* multi-line\n comment */ // more comment"); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeInteger, root->type()); |
- EXPECT_TRUE(root->asInteger(&intVal)); |
- EXPECT_EQ(40, intVal); |
- root = parseJSON("true // comment"); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeBoolean, root->type()); |
- root = parseJSON("/* comment */\"sample string\""); |
- ASSERT_TRUE(root.get()); |
- EXPECT_TRUE(root->asString(&strVal)); |
- EXPECT_EQ("sample string", strVal); |
- root = parseJSON("[1, /* comment, 2 ] */ \n 3]"); |
- ASSERT_TRUE(root.get()); |
- protocol::ListValue* list = ListValue::cast(root.get()); |
- ASSERT_TRUE(list); |
- EXPECT_EQ(2u, list->size()); |
- tmpValue = list->at(0); |
- ASSERT_TRUE(tmpValue); |
- EXPECT_TRUE(tmpValue->asInteger(&intVal)); |
- EXPECT_EQ(1, intVal); |
- tmpValue = list->at(1); |
- ASSERT_TRUE(tmpValue); |
- EXPECT_TRUE(tmpValue->asInteger(&intVal)); |
- EXPECT_EQ(3, intVal); |
- root = parseJSON("[1, /*a*/2, 3]"); |
- ASSERT_TRUE(root.get()); |
- list = ListValue::cast(root.get()); |
- ASSERT_TRUE(list); |
- EXPECT_EQ(3u, list->size()); |
- root = parseJSON("/* comment **/42"); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeInteger, root->type()); |
- EXPECT_TRUE(root->asInteger(&intVal)); |
- EXPECT_EQ(42, intVal); |
- root = parseJSON( |
- "/* comment **/\n" |
- "// */ 43\n" |
- "44"); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeInteger, root->type()); |
- EXPECT_TRUE(root->asInteger(&intVal)); |
- EXPECT_EQ(44, intVal); |
- |
- // Test number formats |
- root = parseJSON("43"); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeInteger, root->type()); |
- EXPECT_TRUE(root->asInteger(&intVal)); |
- EXPECT_EQ(43, intVal); |
- |
- // According to RFC4627, oct, hex, and leading zeros are invalid JSON. |
- root = parseJSON("043"); |
- EXPECT_FALSE(root.get()); |
- root = parseJSON("0x43"); |
- EXPECT_FALSE(root.get()); |
- root = parseJSON("00"); |
- EXPECT_FALSE(root.get()); |
- |
- // Test 0 (which needs to be special cased because of the leading zero |
- // clause). |
- root = parseJSON("0"); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeInteger, root->type()); |
- intVal = 1; |
- EXPECT_TRUE(root->asInteger(&intVal)); |
- EXPECT_EQ(0, intVal); |
- |
- // Numbers that overflow ints should succeed, being internally promoted to |
- // storage as doubles |
- root = parseJSON("2147483648"); |
- ASSERT_TRUE(root.get()); |
- double doubleVal; |
- EXPECT_EQ(Value::TypeDouble, root->type()); |
- doubleVal = 0.0; |
- EXPECT_TRUE(root->asDouble(&doubleVal)); |
- EXPECT_DOUBLE_EQ(2147483648.0, doubleVal); |
- root = parseJSON("-2147483649"); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeDouble, root->type()); |
- doubleVal = 0.0; |
- EXPECT_TRUE(root->asDouble(&doubleVal)); |
- EXPECT_DOUBLE_EQ(-2147483649.0, doubleVal); |
- |
- // Parse a double |
- root = parseJSON("43.1"); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeDouble, root->type()); |
- doubleVal = 0.0; |
- EXPECT_TRUE(root->asDouble(&doubleVal)); |
- EXPECT_DOUBLE_EQ(43.1, doubleVal); |
- |
- root = parseJSON("4.3e-1"); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeDouble, root->type()); |
- doubleVal = 0.0; |
- EXPECT_TRUE(root->asDouble(&doubleVal)); |
- EXPECT_DOUBLE_EQ(.43, doubleVal); |
- |
- root = parseJSON("2.1e0"); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeDouble, root->type()); |
- doubleVal = 0.0; |
- EXPECT_TRUE(root->asDouble(&doubleVal)); |
- EXPECT_DOUBLE_EQ(2.1, doubleVal); |
- |
- root = parseJSON("2.1e+0001"); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeInteger, root->type()); |
- doubleVal = 0.0; |
- EXPECT_TRUE(root->asDouble(&doubleVal)); |
- EXPECT_DOUBLE_EQ(21.0, doubleVal); |
- |
- root = parseJSON("0.01"); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeDouble, root->type()); |
- doubleVal = 0.0; |
- EXPECT_TRUE(root->asDouble(&doubleVal)); |
- EXPECT_DOUBLE_EQ(0.01, doubleVal); |
- |
- root = parseJSON("1.00"); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeInteger, root->type()); |
- doubleVal = 0.0; |
- EXPECT_TRUE(root->asDouble(&doubleVal)); |
- EXPECT_DOUBLE_EQ(1.0, doubleVal); |
- |
- // Fractional parts must have a digit before and after the decimal point. |
- root = parseJSON("1."); |
- EXPECT_FALSE(root.get()); |
- root = parseJSON(".1"); |
- EXPECT_FALSE(root.get()); |
- root = parseJSON("1.e10"); |
- EXPECT_FALSE(root.get()); |
- |
- // Exponent must have a digit following the 'e'. |
- root = parseJSON("1e"); |
- EXPECT_FALSE(root.get()); |
- root = parseJSON("1E"); |
- EXPECT_FALSE(root.get()); |
- root = parseJSON("1e1."); |
- EXPECT_FALSE(root.get()); |
- root = parseJSON("1e1.0"); |
- EXPECT_FALSE(root.get()); |
- |
- // INF/-INF/NaN are not valid |
- root = parseJSON("NaN"); |
- EXPECT_FALSE(root.get()); |
- root = parseJSON("nan"); |
- EXPECT_FALSE(root.get()); |
- root = parseJSON("inf"); |
- EXPECT_FALSE(root.get()); |
- |
- // Invalid number formats |
- root = parseJSON("4.3.1"); |
- EXPECT_FALSE(root.get()); |
- root = parseJSON("4e3.1"); |
- EXPECT_FALSE(root.get()); |
- |
- // Test string parser |
- root = parseJSON("\"hello world\""); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeString, root->type()); |
- EXPECT_TRUE(root->asString(&strVal)); |
- EXPECT_EQ("hello world", strVal); |
- |
- // Empty string |
- root = parseJSON("\"\""); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeString, root->type()); |
- EXPECT_TRUE(root->asString(&strVal)); |
- EXPECT_EQ("", strVal); |
- |
- // Test basic string escapes |
- root = parseJSON("\" \\\"\\\\\\/\\b\\f\\n\\r\\t\\v\""); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeString, root->type()); |
- EXPECT_TRUE(root->asString(&strVal)); |
- EXPECT_EQ(" \"\\/\b\f\n\r\t\v", strVal); |
- |
- // Test hex and unicode escapes including the null character. |
- root = parseJSON("\"\\x41\\x00\\u1234\""); |
- EXPECT_FALSE(root.get()); |
- |
- // Test invalid strings |
- root = parseJSON("\"no closing quote"); |
- EXPECT_FALSE(root.get()); |
- root = parseJSON("\"\\z invalid escape char\""); |
- EXPECT_FALSE(root.get()); |
- root = parseJSON("\"not enough escape chars\\u123\""); |
- EXPECT_FALSE(root.get()); |
- root = parseJSON("\"extra backslash at end of input\\\""); |
- EXPECT_FALSE(root.get()); |
- |
- // Basic array |
- root = parseJSON("[true, false, null]"); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeArray, root->type()); |
- list = ListValue::cast(root.get()); |
- ASSERT_TRUE(list); |
- EXPECT_EQ(3U, list->size()); |
- |
- // Empty array |
- root = parseJSON("[]"); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeArray, root->type()); |
- list = ListValue::cast(root.get()); |
- ASSERT_TRUE(list); |
- EXPECT_EQ(0U, list->size()); |
- |
- // Nested arrays |
- root = parseJSON("[[true], [], [false, [], [null]], null]"); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeArray, root->type()); |
- list = ListValue::cast(root.get()); |
- ASSERT_TRUE(list); |
- EXPECT_EQ(4U, list->size()); |
- |
- // Invalid, missing close brace. |
- root = parseJSON("[[true], [], [false, [], [null]], null"); |
- EXPECT_FALSE(root.get()); |
- |
- // Invalid, too many commas |
- root = parseJSON("[true,, null]"); |
- EXPECT_FALSE(root.get()); |
- |
- // Invalid, no commas |
- root = parseJSON("[true null]"); |
- EXPECT_FALSE(root.get()); |
- |
- // Invalid, trailing comma |
- root = parseJSON("[true,]"); |
- EXPECT_FALSE(root.get()); |
- |
- root = parseJSON("[true]"); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeArray, root->type()); |
- list = ListValue::cast(root.get()); |
- ASSERT_TRUE(list); |
- EXPECT_EQ(1U, list->size()); |
- tmpValue = list->at(0); |
- ASSERT_TRUE(tmpValue); |
- EXPECT_EQ(Value::TypeBoolean, tmpValue->type()); |
- bool boolValue = false; |
- EXPECT_TRUE(tmpValue->asBoolean(&boolValue)); |
- EXPECT_TRUE(boolValue); |
- |
- // Don't allow empty elements. |
- root = parseJSON("[,]"); |
- EXPECT_FALSE(root.get()); |
- root = parseJSON("[true,,]"); |
- EXPECT_FALSE(root.get()); |
- root = parseJSON("[,true,]"); |
- EXPECT_FALSE(root.get()); |
- root = parseJSON("[true,,false]"); |
- EXPECT_FALSE(root.get()); |
- |
- // Test objects |
- root = parseJSON("{}"); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeObject, root->type()); |
- |
- root = parseJSON("{\"number\":9.87654321, \"null\":null , \"S\" : \"str\" }"); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeObject, root->type()); |
- protocol::DictionaryValue* objectVal = DictionaryValue::cast(root.get()); |
- ASSERT_TRUE(objectVal); |
- doubleVal = 0.0; |
- EXPECT_TRUE(objectVal->getDouble("number", &doubleVal)); |
- EXPECT_DOUBLE_EQ(9.87654321, doubleVal); |
- protocol::Value* nullVal = objectVal->get("null"); |
- ASSERT_TRUE(nullVal); |
- EXPECT_EQ(Value::TypeNull, nullVal->type()); |
- EXPECT_TRUE(objectVal->getString("S", &strVal)); |
- EXPECT_EQ("str", strVal); |
- |
- // Test newline equivalence. |
- root2 = parseJSON( |
- "{\n" |
- " \"number\":9.87654321,\n" |
- " \"null\":null,\n" |
- " \"S\":\"str\"\n" |
- "}\n"); |
- ASSERT_TRUE(root2.get()); |
- EXPECT_EQ(root->toJSONString(), root2->toJSONString()); |
- |
- root2 = parseJSON( |
- "{\r\n" |
- " \"number\":9.87654321,\r\n" |
- " \"null\":null,\r\n" |
- " \"S\":\"str\"\r\n" |
- "}\r\n"); |
- ASSERT_TRUE(root2.get()); |
- EXPECT_EQ(root->toJSONString(), root2->toJSONString()); |
- |
- // Test nesting |
- root = parseJSON("{\"inner\":{\"array\":[true]},\"false\":false,\"d\":{}}"); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeObject, root->type()); |
- objectVal = DictionaryValue::cast(root.get()); |
- ASSERT_TRUE(objectVal); |
- protocol::DictionaryValue* innerObject = objectVal->getObject("inner"); |
- ASSERT_TRUE(innerObject); |
- protocol::ListValue* innerArray = innerObject->getArray("array"); |
- ASSERT_TRUE(innerArray); |
- EXPECT_EQ(1U, innerArray->size()); |
- boolValue = true; |
- EXPECT_TRUE(objectVal->getBoolean("false", &boolValue)); |
- EXPECT_FALSE(boolValue); |
- innerObject = objectVal->getObject("d"); |
- EXPECT_TRUE(innerObject); |
- |
- // Test keys with periods |
- root = parseJSON("{\"a.b\":3,\"c\":2,\"d.e.f\":{\"g.h.i.j\":1}}"); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeObject, root->type()); |
- objectVal = DictionaryValue::cast(root.get()); |
- ASSERT_TRUE(objectVal); |
- int integerValue = 0; |
- EXPECT_TRUE(objectVal->getInteger("a.b", &integerValue)); |
- EXPECT_EQ(3, integerValue); |
- EXPECT_TRUE(objectVal->getInteger("c", &integerValue)); |
- EXPECT_EQ(2, integerValue); |
- innerObject = objectVal->getObject("d.e.f"); |
- ASSERT_TRUE(innerObject); |
- EXPECT_EQ(1U, innerObject->size()); |
- EXPECT_TRUE(innerObject->getInteger("g.h.i.j", &integerValue)); |
- EXPECT_EQ(1, integerValue); |
- |
- root = parseJSON("{\"a\":{\"b\":2},\"a.b\":1}"); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeObject, root->type()); |
- objectVal = DictionaryValue::cast(root.get()); |
- ASSERT_TRUE(objectVal); |
- innerObject = objectVal->getObject("a"); |
- ASSERT_TRUE(innerObject); |
- EXPECT_TRUE(innerObject->getInteger("b", &integerValue)); |
- EXPECT_EQ(2, integerValue); |
- EXPECT_TRUE(objectVal->getInteger("a.b", &integerValue)); |
- EXPECT_EQ(1, integerValue); |
- |
- // Invalid, no closing brace |
- root = parseJSON("{\"a\": true"); |
- EXPECT_FALSE(root.get()); |
- |
- // Invalid, keys must be quoted |
- root = parseJSON("{foo:true}"); |
- EXPECT_FALSE(root.get()); |
- |
- // Invalid, trailing comma |
- root = parseJSON("{\"a\":true,}"); |
- EXPECT_FALSE(root.get()); |
- |
- // Invalid, too many commas |
- root = parseJSON("{\"a\":true,,\"b\":false}"); |
- EXPECT_FALSE(root.get()); |
- |
- // Invalid, no separator |
- root = parseJSON("{\"a\" \"b\"}"); |
- EXPECT_FALSE(root.get()); |
- |
- // Invalid, lone comma. |
- root = parseJSON("{,}"); |
- EXPECT_FALSE(root.get()); |
- root = parseJSON("{\"a\":true,,}"); |
- EXPECT_FALSE(root.get()); |
- root = parseJSON("{,\"a\":true}"); |
- EXPECT_FALSE(root.get()); |
- root = parseJSON("{\"a\":true,,\"b\":false}"); |
- EXPECT_FALSE(root.get()); |
- |
- // Test stack overflow |
- String16Builder evil; |
- evil.reserveCapacity(2000000); |
- for (int i = 0; i < 1000000; ++i) |
- evil.append('['); |
- for (int i = 0; i < 1000000; ++i) |
- evil.append(']'); |
- root = parseJSON(evil.toString()); |
- EXPECT_FALSE(root.get()); |
- |
- // A few thousand adjacent lists is fine. |
- String16Builder notEvil; |
- notEvil.reserveCapacity(15010); |
- notEvil.append('['); |
- for (int i = 0; i < 5000; ++i) |
- notEvil.append("[],"); |
- notEvil.append("[]]"); |
- root = parseJSON(notEvil.toString()); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeArray, root->type()); |
- list = ListValue::cast(root.get()); |
- ASSERT_TRUE(list); |
- EXPECT_EQ(5001U, list->size()); |
- |
- // Test utf8 encoded input |
- root = parseJSON("\"\\xe7\\xbd\\x91\\xe9\\xa1\\xb5\""); |
- ASSERT_FALSE(root.get()); |
- |
- // Test utf16 encoded strings. |
- root = parseJSON("\"\\u20ac3,14\""); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeString, root->type()); |
- EXPECT_TRUE(root->asString(&strVal)); |
- UChar tmp2[] = {0x20ac, 0x33, 0x2c, 0x31, 0x34}; |
- EXPECT_EQ(String16(tmp2, 5), strVal); |
- |
- root = parseJSON("\"\\ud83d\\udca9\\ud83d\\udc6c\""); |
- ASSERT_TRUE(root.get()); |
- EXPECT_EQ(Value::TypeString, root->type()); |
- EXPECT_TRUE(root->asString(&strVal)); |
- UChar tmp3[] = {0xd83d, 0xdca9, 0xd83d, 0xdc6c}; |
- EXPECT_EQ(String16(tmp3, 4), strVal); |
- |
- // Test literal root objects. |
- root = parseJSON("null"); |
- EXPECT_EQ(Value::TypeNull, root->type()); |
- |
- root = parseJSON("true"); |
- ASSERT_TRUE(root.get()); |
- EXPECT_TRUE(root->asBoolean(&boolValue)); |
- EXPECT_TRUE(boolValue); |
- |
- root = parseJSON("10"); |
- ASSERT_TRUE(root.get()); |
- EXPECT_TRUE(root->asInteger(&integerValue)); |
- EXPECT_EQ(10, integerValue); |
- |
- root = parseJSON("\"root\""); |
- ASSERT_TRUE(root.get()); |
- EXPECT_TRUE(root->asString(&strVal)); |
- EXPECT_EQ("root", strVal); |
-} |
- |
-TEST(ParserTest, InvalidSanity) |
-{ |
- const char* const invalidJson[] = { |
- "/* test *", |
- "{\"foo\"", |
- "{\"foo\":", |
- " [", |
- "\"\\u123g\"", |
- "{\n\"eh:\n}", |
- "////", |
- "*/**/", |
- "/**/", |
- "/*/", |
- "//**/" |
- }; |
- |
- for (size_t i = 0; i < 11; ++i) { |
- std::unique_ptr<protocol::Value> result = parseJSON(invalidJson[i]); |
- EXPECT_FALSE(result.get()); |
- } |
-} |
- |
-} // namespace protocol |
-} // namespace blink |