15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_reader.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_paths.h" 86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/files/file_util.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(JSONReaderTest, Reading) { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // some whitespace checking 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Value> root; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue(" null ")); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_NULL)); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invalid JSON string 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("nu")); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simple bool 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("true ")); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_BOOLEAN)); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Embedded comment 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("/* comment */null")); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_NULL)); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("40 /* comment */")); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_INTEGER)); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("true // comment")); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_BOOLEAN)); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("/* comment */\"sample string\"")); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string value; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->GetAsString(&value)); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("sample string", value); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("[1, /* comment, 2 ] */ \n 3]")); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue* list = static_cast<ListValue*>(root.get()); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2u, list->GetSize()); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int int_val = 0; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(list->GetInteger(0, &int_val)); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, int_val); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(list->GetInteger(1, &int_val)); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, int_val); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("[1, /*a*/2, 3]")); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = static_cast<ListValue*>(root.get()); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3u, list->GetSize()); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root.reset(JSONReader().ReadToValue("/* comment **/42")); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(root.get()); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_INTEGER)); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(root->GetAsInteger(&int_val)); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(42, int_val); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root.reset(JSONReader().ReadToValue( 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "/* comment **/\n" 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "// */ 43\n" 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "44")); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(root.get()); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_INTEGER)); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(root->GetAsInteger(&int_val)); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(44, int_val); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test number formats 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("43")); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_INTEGER)); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->GetAsInteger(&int_val)); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(43, int_val); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // According to RFC4627, oct, hex, and leading zeros are invalid JSON. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("043")); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("0x43")); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("00")); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test 0 (which needs to be special cased because of the leading zero 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // clause). 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("0")); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_INTEGER)); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int_val = 1; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->GetAsInteger(&int_val)); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, int_val); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Numbers that overflow ints should succeed, being internally promoted to 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // storage as doubles 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("2147483648")); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double double_val; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double_val = 0.0; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->GetAsDouble(&double_val)); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_DOUBLE_EQ(2147483648.0, double_val); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("-2147483649")); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double_val = 0.0; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->GetAsDouble(&double_val)); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_DOUBLE_EQ(-2147483649.0, double_val); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Parse a double 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("43.1")); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double_val = 0.0; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->GetAsDouble(&double_val)); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_DOUBLE_EQ(43.1, double_val); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("4.3e-1")); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double_val = 0.0; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->GetAsDouble(&double_val)); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_DOUBLE_EQ(.43, double_val); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("2.1e0")); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double_val = 0.0; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->GetAsDouble(&double_val)); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_DOUBLE_EQ(2.1, double_val); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("2.1e+0001")); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double_val = 0.0; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->GetAsDouble(&double_val)); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_DOUBLE_EQ(21.0, double_val); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("0.01")); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double_val = 0.0; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->GetAsDouble(&double_val)); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_DOUBLE_EQ(0.01, double_val); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("1.00")); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double_val = 0.0; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->GetAsDouble(&double_val)); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_DOUBLE_EQ(1.0, double_val); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fractional parts must have a digit before and after the decimal point. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("1.")); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue(".1")); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("1.e10")); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Exponent must have a digit following the 'e'. 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("1e")); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("1E")); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("1e1.")); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("1e1.0")); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // INF/-INF/NaN are not valid 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("1e1000")); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("-1e1000")); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("NaN")); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("nan")); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("inf")); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invalid number formats 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("4.3.1")); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("4e3.1")); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test string parser 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("\"hello world\"")); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string str_val; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->GetAsString(&str_val)); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("hello world", str_val); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Empty string 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("\"\"")); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) str_val.clear(); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->GetAsString(&str_val)); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", str_val); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test basic string escapes 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("\" \\\"\\\\\\/\\b\\f\\n\\r\\t\\v\"")); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) str_val.clear(); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->GetAsString(&str_val)); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(" \"\\/\b\f\n\r\t\v", str_val); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test hex and unicode escapes including the null character. 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("\"\\x41\\x00\\u1234\"")); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) str_val.clear(); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->GetAsString(&str_val)); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::wstring(L"A\0\x1234", 3), UTF8ToWide(str_val)); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test invalid strings 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("\"no closing quote")); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("\"\\z invalid escape char\"")); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("\"\\xAQ invalid hex code\"")); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("not enough hex chars\\x1\"")); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("\"not enough escape chars\\u123\"")); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("\"extra backslash at end of input\\\"")); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Basic array 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("[true, false, null]")); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_LIST)); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = static_cast<ListValue*>(root.get()); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3U, list->GetSize()); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test with trailing comma. Should be parsed the same as above. 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Value> root2; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root2.reset(JSONReader::Read("[true, false, null, ]", 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSON_ALLOW_TRAILING_COMMAS)); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->Equals(root2.get())); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Empty array 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("[]")); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_LIST)); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = static_cast<ListValue*>(root.get()); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0U, list->GetSize()); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Nested arrays 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("[[true], [], [false, [], [null]], null]")); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_LIST)); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = static_cast<ListValue*>(root.get()); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4U, list->GetSize()); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lots of trailing commas. 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root2.reset(JSONReader::Read("[[true], [], [false, [], [null, ] , ], null,]", 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSON_ALLOW_TRAILING_COMMAS)); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->Equals(root2.get())); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invalid, missing close brace. 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("[[true], [], [false, [], [null]], null")); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invalid, too many commas 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("[true,, null]")); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("[true,, null]", JSON_ALLOW_TRAILING_COMMAS)); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invalid, no commas 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("[true null]")); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invalid, trailing comma 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("[true,]")); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Valid if we set |allow_trailing_comma| to true. 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("[true,]", JSON_ALLOW_TRAILING_COMMAS)); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_LIST)); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = static_cast<ListValue*>(root.get()); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1U, list->GetSize()); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value* tmp_value = NULL; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(list->Get(0, &tmp_value)); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tmp_value->IsType(Value::TYPE_BOOLEAN)); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool bool_value = false; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tmp_value->GetAsBoolean(&bool_value)); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(bool_value); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't allow empty elements, even if |allow_trailing_comma| is 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // true. 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("[,]", JSON_ALLOW_TRAILING_COMMAS)); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("[true,,]", JSON_ALLOW_TRAILING_COMMAS)); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("[,true,]", JSON_ALLOW_TRAILING_COMMAS)); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("[true,,false]", JSON_ALLOW_TRAILING_COMMAS)); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test objects 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("{}")); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read( 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "{\"number\":9.87654321, \"null\":null , \"\\x53\" : \"str\" }")); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* dict_val = static_cast<DictionaryValue*>(root.get()); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double_val = 0.0; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(dict_val->GetDouble("number", &double_val)); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_DOUBLE_EQ(9.87654321, double_val); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value* null_val = NULL; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(dict_val->Get("null", &null_val)); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(null_val->IsType(Value::TYPE_NULL)); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) str_val.clear(); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(dict_val->GetString("S", &str_val)); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("str", str_val); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root2.reset(JSONReader::Read( 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "{\"number\":9.87654321, \"null\":null , \"\\x53\" : \"str\", }", 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSON_ALLOW_TRAILING_COMMAS)); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root2.get()); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->Equals(root2.get())); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test newline equivalence. 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root2.reset(JSONReader::Read( 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "{\n" 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"number\":9.87654321,\n" 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"null\":null,\n" 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"\\x53\":\"str\",\n" 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n", JSON_ALLOW_TRAILING_COMMAS)); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root2.get()); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->Equals(root2.get())); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root2.reset(JSONReader::Read( 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "{\r\n" 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"number\":9.87654321,\r\n" 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"null\":null,\r\n" 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"\\x53\":\"str\",\r\n" 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\r\n", JSON_ALLOW_TRAILING_COMMAS)); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root2.get()); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->Equals(root2.get())); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test nesting 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read( 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "{\"inner\":{\"array\":[true]},\"false\":false,\"d\":{}}")); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict_val = static_cast<DictionaryValue*>(root.get()); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* inner_dict = NULL; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(dict_val->GetDictionary("inner", &inner_dict)); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue* inner_array = NULL; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(inner_dict->GetList("array", &inner_array)); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1U, inner_array->GetSize()); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool_value = true; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(dict_val->GetBoolean("false", &bool_value)); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(bool_value); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inner_dict = NULL; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(dict_val->GetDictionary("d", &inner_dict)); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root2.reset(JSONReader::Read( 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "{\"inner\": {\"array\":[true] , },\"false\":false,\"d\":{},}", 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSON_ALLOW_TRAILING_COMMAS)); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->Equals(root2.get())); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test keys with periods 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read( 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "{\"a.b\":3,\"c\":2,\"d.e.f\":{\"g.h.i.j\":1}}")); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict_val = static_cast<DictionaryValue*>(root.get()); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int integer_value = 0; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(dict_val->GetIntegerWithoutPathExpansion("a.b", &integer_value)); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, integer_value); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(dict_val->GetIntegerWithoutPathExpansion("c", &integer_value)); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, integer_value); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inner_dict = NULL; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(dict_val->GetDictionaryWithoutPathExpansion("d.e.f", 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &inner_dict)); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1U, inner_dict->size()); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(inner_dict->GetIntegerWithoutPathExpansion("g.h.i.j", 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &integer_value)); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, integer_value); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("{\"a\":{\"b\":2},\"a.b\":1}")); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict_val = static_cast<DictionaryValue*>(root.get()); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(dict_val->GetInteger("a.b", &integer_value)); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, integer_value); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(dict_val->GetIntegerWithoutPathExpansion("a.b", &integer_value)); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, integer_value); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invalid, no closing brace 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("{\"a\": true")); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invalid, keys must be quoted 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("{foo:true}")); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invalid, trailing comma 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("{\"a\":true,}")); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invalid, too many commas 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("{\"a\":true,,\"b\":false}")); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("{\"a\":true,,\"b\":false}", 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSON_ALLOW_TRAILING_COMMAS)); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invalid, no separator 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("{\"a\" \"b\"}")); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invalid, lone comma. 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("{,}")); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("{,}", JSON_ALLOW_TRAILING_COMMAS)); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("{\"a\":true,,}", JSON_ALLOW_TRAILING_COMMAS)); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("{,\"a\":true}", JSON_ALLOW_TRAILING_COMMAS)); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("{\"a\":true,,\"b\":false}", 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSON_ALLOW_TRAILING_COMMAS)); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test stack overflow 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string evil(1000000, '['); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) evil.append(std::string(1000000, ']')); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read(evil)); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A few thousand adjacent lists is fine. 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string not_evil("["); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) not_evil.reserve(15010); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 5000; ++i) { 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) not_evil.append("[],"); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) not_evil.append("[]]"); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read(not_evil)); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_LIST)); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = static_cast<ListValue*>(root.get()); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5001U, list->GetSize()); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test utf8 encoded input 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("\"\xe7\xbd\x91\xe9\xa1\xb5\"")); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) str_val.clear(); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->GetAsString(&str_val)); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(L"\x7f51\x9875", UTF8ToWide(str_val)); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue( 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "{\"path\": \"/tmp/\xc3\xa0\xc3\xa8\xc3\xb2.png\"}")); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->GetAsDictionary(&dict_val)); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(dict_val->GetString("path", &str_val)); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("/tmp/\xC3\xA0\xC3\xA8\xC3\xB2.png", str_val); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test invalid utf8 encoded input 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("\"345\xb0\xa1\xb0\xa2\"")); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("\"123\xc0\x81\"")); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("\"abc\xc0\xae\"")); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test utf16 encoded strings. 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("\"\\u20ac3,14\"")); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) str_val.clear(); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->GetAsString(&str_val)); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("\xe2\x82\xac""3,14", str_val); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue("\"\\ud83d\\udca9\\ud83d\\udc6c\"")); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) str_val.clear(); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->GetAsString(&str_val)); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("\xf0\x9f\x92\xa9\xf0\x9f\x91\xac", str_val); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test invalid utf16 strings. 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* cases[] = { 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\"\\u123\"", // Invalid scalar. 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\"\\ud83d\"", // Invalid scalar. 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\"\\u$%@!\"", // Invalid scalar. 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\"\\uzz89\"", // Invalid scalar. 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\"\\ud83d\\udca\"", // Invalid lower surrogate. 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\"\\ud83d\\ud83d\"", // Invalid lower surrogate. 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\"\\ud83foo\"", // No lower surrogate. 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\"\\ud83\\foo\"" // No lower surrogate. 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(cases); ++i) { 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader().ReadToValue(cases[i])); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()) << cases[i]; 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test literal root objects. 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("null")); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_NULL)); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("true")); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->GetAsBoolean(&bool_value)); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(bool_value); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("10")); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->GetAsInteger(&integer_value)); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(10, integer_value); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::Read("\"root\"")); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->GetAsString(&str_val)); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", str_val); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(JSONReaderTest, ReadFromFile) { 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilePath path; 545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(PathService::Get(base::DIR_TEST_DATA, &path)); 546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) path = path.AppendASCII("json"); 5477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::PathExists(path)); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string input; 55058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(ReadFileToString( 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path.Append(FILE_PATH_LITERAL("bom_feff.json")), &input)); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONReader reader; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Value> root(reader.ReadToValue(input)); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()) << reader.GetErrorMessage(); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the root of a JSON object can be deleted safely while its 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// children outlive it. 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(JSONReaderTest, StringOptimizations) { 5623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch scoped_ptr<Value> dict_literal_0; 5633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch scoped_ptr<Value> dict_literal_1; 5643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch scoped_ptr<Value> dict_string_0; 5653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch scoped_ptr<Value> dict_string_1; 5663240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch scoped_ptr<Value> list_value_0; 5673240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch scoped_ptr<Value> list_value_1; 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Value> root(JSONReader::Read( 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "{" 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"test\": {" 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"foo\": true," 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"bar\": 3.14," 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"baz\": \"bat\"," 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"moo\": \"cow\"" 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }," 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"list\": [" 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"a\"," 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"b\"" 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " ]" 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}", JSON_DETACHABLE_CHILDREN)); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root.get()); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* root_dict = NULL; 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root->GetAsDictionary(&root_dict)); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* dict = NULL; 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue* list = NULL; 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root_dict->GetDictionary("test", &dict)); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(root_dict->GetList("list", &list)); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5943240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_TRUE(dict->Remove("foo", &dict_literal_0)); 5953240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_TRUE(dict->Remove("bar", &dict_literal_1)); 5963240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_TRUE(dict->Remove("baz", &dict_string_0)); 5973240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_TRUE(dict->Remove("moo", &dict_string_1)); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, list->GetSize()); 6003240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_TRUE(list->Remove(0, &list_value_0)); 6013240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_TRUE(list->Remove(0, &list_value_1)); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool b = false; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double d = 0; 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string s; 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6083240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_TRUE(dict_literal_0->GetAsBoolean(&b)); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(b); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6113240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_TRUE(dict_literal_1->GetAsDouble(&d)); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3.14, d); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6143240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_TRUE(dict_string_0->GetAsString(&s)); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("bat", s); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6173240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_TRUE(dict_string_1->GetAsString(&s)); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("cow", s); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6203240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_TRUE(list_value_0->GetAsString(&s)); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("a", s); 6223240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_TRUE(list_value_1->GetAsString(&s)); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("b", s); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A smattering of invalid JSON designed to test specific portions of the 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// parser implementation against buffer overflow. Best run with DCHECKs so 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that the one in NextChar fires. 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(JSONReaderTest, InvalidSanity) { 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* invalid_json[] = { 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/* test *", 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "{\"foo\"", 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "{\"foo\":", 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " [", 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\"\\u123g\"", 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "{\n\"eh:\n}", 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(invalid_json); ++i) { 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONReader reader; 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(INFO) << "Sanity test " << i << ": <" << invalid_json[i] << ">"; 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(reader.ReadToValue(invalid_json[i])); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(JSONReader::JSON_NO_ERROR, reader.error_code()); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE("", reader.GetErrorMessage()); 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(JSONReaderTest, IllegalTrailingNull) { 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char json[] = { '"', 'n', 'u', 'l', 'l', '"', '\0' }; 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string json_string(json, sizeof(json)); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONReader reader; 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(reader.ReadToValue(json_string)); 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(JSONReader::JSON_UNEXPECTED_DATA_AFTER_ROOT, reader.error_code()); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 657