10d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Copyright (c) 2012 The Chromium Authors. All rights reserved. 20d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Use of this source code is governed by a BSD-style license that can be 30d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// found in the LICENSE file. 40d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 50d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "base/json/json_reader.h" 60d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 70d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include <stddef.h> 80d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 90c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez#include <memory> 100c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 110d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#if !defined(__ANDROID__) && !defined(__ANDROID_HOST__) 120d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "base/base_paths.h" 130d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "base/path_service.h" 140d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#endif 150d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 160d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "base/files/file_util.h" 170d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "base/logging.h" 180d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "base/macros.h" 190d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "base/strings/string_piece.h" 200d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "base/strings/utf_string_conversions.h" 210d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "base/values.h" 220d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "build/build_config.h" 230d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "testing/gtest/include/gtest/gtest.h" 240d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 250d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenkonamespace base { 260d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 270d205d712abd16eeed2f5d5b1052a367d23a223fAlex VakulenkoTEST(JSONReaderTest, Reading) { 280c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 290c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // some whitespace checking 300c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<Value> root = JSONReader().ReadToValue(" null "); 310c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 323a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(root->IsType(Value::Type::NONE)); 330c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 340d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 350c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 360c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Invalid JSON string 370c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader().ReadToValue("nu")); 380c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 390c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 400c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 410c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Simple bool 420c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<Value> root = JSONReader().ReadToValue("true "); 430c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 443a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(root->IsType(Value::Type::BOOLEAN)); 450d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko } 460d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 470c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 480c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Embedded comment 490c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<Value> root = JSONReader().ReadToValue("/* comment */null"); 500c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 513a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(root->IsType(Value::Type::NONE)); 520c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez root = JSONReader().ReadToValue("40 /* comment */"); 530c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 543a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(root->IsType(Value::Type::INTEGER)); 550c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez root = JSONReader().ReadToValue("true // comment"); 560c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 573a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(root->IsType(Value::Type::BOOLEAN)); 580c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez root = JSONReader().ReadToValue("/* comment */\"sample string\""); 590c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 603a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(root->IsType(Value::Type::STRING)); 610c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::string value; 620c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(root->GetAsString(&value)); 630c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ("sample string", value); 640c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<ListValue> list = ListValue::From( 650c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez JSONReader().ReadToValue("[1, /* comment, 2 ] */ \n 3]")); 660c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(list); 670c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ(2u, list->GetSize()); 680c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez int int_val = 0; 690c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(list->GetInteger(0, &int_val)); 700c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ(1, int_val); 710c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(list->GetInteger(1, &int_val)); 720c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ(3, int_val); 730c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez list = ListValue::From(JSONReader().ReadToValue("[1, /*a*/2, 3]")); 740c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(list); 750c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ(3u, list->GetSize()); 760c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez root = JSONReader().ReadToValue("/* comment **/42"); 770c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 783a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(root->IsType(Value::Type::INTEGER)); 790c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(root->GetAsInteger(&int_val)); 800c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ(42, int_val); 810c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez root = JSONReader().ReadToValue( 820c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez "/* comment **/\n" 830c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez "// */ 43\n" 840c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez "44"); 850c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 863a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(root->IsType(Value::Type::INTEGER)); 870c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(root->GetAsInteger(&int_val)); 880c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ(44, int_val); 890c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 900c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 910c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 920c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Test number formats 930c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<Value> root = JSONReader().ReadToValue("43"); 940c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 953a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(root->IsType(Value::Type::INTEGER)); 960c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez int int_val = 0; 970c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(root->GetAsInteger(&int_val)); 980c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ(43, int_val); 990c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 1000c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 1010c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 1020c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // According to RFC4627, oct, hex, and leading zeros are invalid JSON. 1030c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader().ReadToValue("043")); 1040c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader().ReadToValue("0x43")); 1050c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader().ReadToValue("00")); 1060c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 1070d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 1080c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 1090c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Test 0 (which needs to be special cased because of the leading zero 1100c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // clause). 1110c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<Value> root = JSONReader().ReadToValue("0"); 1120c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 1133a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(root->IsType(Value::Type::INTEGER)); 1140c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez int int_val = 1; 1150c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(root->GetAsInteger(&int_val)); 1160c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ(0, int_val); 1170c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 1180d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 1190c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 1200c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Numbers that overflow ints should succeed, being internally promoted to 1210c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // storage as doubles 1220c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<Value> root = JSONReader().ReadToValue("2147483648"); 1230c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 1240c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez double double_val; 1253a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(root->IsType(Value::Type::DOUBLE)); 1260c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez double_val = 0.0; 1270c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(root->GetAsDouble(&double_val)); 1280c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_DOUBLE_EQ(2147483648.0, double_val); 1290c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez root = JSONReader().ReadToValue("-2147483649"); 1300c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 1313a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(root->IsType(Value::Type::DOUBLE)); 1320c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez double_val = 0.0; 1330c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(root->GetAsDouble(&double_val)); 1340c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_DOUBLE_EQ(-2147483649.0, double_val); 1350c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 1360d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 1370c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 1380c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Parse a double 1390c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<Value> root = JSONReader().ReadToValue("43.1"); 1400c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 1413a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(root->IsType(Value::Type::DOUBLE)); 1420c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez double double_val = 0.0; 1430c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(root->GetAsDouble(&double_val)); 1440c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_DOUBLE_EQ(43.1, double_val); 1450c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 1460c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez root = JSONReader().ReadToValue("4.3e-1"); 1470c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 1483a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(root->IsType(Value::Type::DOUBLE)); 1490c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez double_val = 0.0; 1500c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(root->GetAsDouble(&double_val)); 1510c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_DOUBLE_EQ(.43, double_val); 1520c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 1530c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez root = JSONReader().ReadToValue("2.1e0"); 1540c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 1553a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(root->IsType(Value::Type::DOUBLE)); 1560c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez double_val = 0.0; 1570c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(root->GetAsDouble(&double_val)); 1580c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_DOUBLE_EQ(2.1, double_val); 1590c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 1600c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez root = JSONReader().ReadToValue("2.1e+0001"); 1610c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 1623a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(root->IsType(Value::Type::DOUBLE)); 1630c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez double_val = 0.0; 1640c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(root->GetAsDouble(&double_val)); 1650c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_DOUBLE_EQ(21.0, double_val); 1660c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 1670c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez root = JSONReader().ReadToValue("0.01"); 1680c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 1693a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(root->IsType(Value::Type::DOUBLE)); 1700c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez double_val = 0.0; 1710c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(root->GetAsDouble(&double_val)); 1720c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_DOUBLE_EQ(0.01, double_val); 1730c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 1740c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez root = JSONReader().ReadToValue("1.00"); 1750c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 1763a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(root->IsType(Value::Type::DOUBLE)); 1770c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez double_val = 0.0; 1780c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(root->GetAsDouble(&double_val)); 1790c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_DOUBLE_EQ(1.0, double_val); 1800c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 1810c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 1820c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 1830c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Fractional parts must have a digit before and after the decimal point. 1840c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader().ReadToValue("1.")); 1850c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader().ReadToValue(".1")); 1860c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader().ReadToValue("1.e10")); 1870c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 1880c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 1890c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 1900c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Exponent must have a digit following the 'e'. 1910c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader().ReadToValue("1e")); 1920c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader().ReadToValue("1E")); 1930c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader().ReadToValue("1e1.")); 1940c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader().ReadToValue("1e1.0")); 1950c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 1960c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 1970c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 1980c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // INF/-INF/NaN are not valid 1990c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader().ReadToValue("1e1000")); 2000c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader().ReadToValue("-1e1000")); 2010c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader().ReadToValue("NaN")); 2020c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader().ReadToValue("nan")); 2030c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader().ReadToValue("inf")); 2040c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 2050c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 2060c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 2070c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Invalid number formats 2080c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader().ReadToValue("4.3.1")); 2090c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader().ReadToValue("4e3.1")); 2100c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 2110c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 2120c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 2130c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Test string parser 2140c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<Value> root = JSONReader().ReadToValue("\"hello world\""); 2150c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 2163a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(root->IsType(Value::Type::STRING)); 2170c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::string str_val; 2180c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(root->GetAsString(&str_val)); 2190c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ("hello world", str_val); 2200c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 2210c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 2220c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 2230c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Empty string 2240c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<Value> root = JSONReader().ReadToValue("\"\""); 2250c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 2263a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(root->IsType(Value::Type::STRING)); 2270c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::string str_val; 2280c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(root->GetAsString(&str_val)); 2290c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ("", str_val); 2300c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 2310c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 2320c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 2330c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Test basic string escapes 2340c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<Value> root = 2350c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez JSONReader().ReadToValue("\" \\\"\\\\\\/\\b\\f\\n\\r\\t\\v\""); 2360c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 2373a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(root->IsType(Value::Type::STRING)); 2380c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::string str_val; 2390c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(root->GetAsString(&str_val)); 2400c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ(" \"\\/\b\f\n\r\t\v", str_val); 2410c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 2420c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 2430c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 2440c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Test hex and unicode escapes including the null character. 2450c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<Value> root = 2460c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez JSONReader().ReadToValue("\"\\x41\\x00\\u1234\""); 2470c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 2483a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(root->IsType(Value::Type::STRING)); 2490c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::string str_val; 2500c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(root->GetAsString(&str_val)); 2510c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ(std::wstring(L"A\0\x1234", 3), UTF8ToWide(str_val)); 2520c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 2530c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 2540c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 2550c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Test invalid strings 2560c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader().ReadToValue("\"no closing quote")); 2570c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader().ReadToValue("\"\\z invalid escape char\"")); 2580c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader().ReadToValue("\"\\xAQ invalid hex code\"")); 2590c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader().ReadToValue("not enough hex chars\\x1\"")); 2600c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader().ReadToValue("\"not enough escape chars\\u123\"")); 2610c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE( 2620c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez JSONReader().ReadToValue("\"extra backslash at end of input\\\"")); 2630c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 2640c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 2650c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 2660c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Basic array 2670c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<ListValue> list = 2680c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ListValue::From(JSONReader::Read("[true, false, null]")); 2690c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(list); 2700c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ(3U, list->GetSize()); 2710c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 2720c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Test with trailing comma. Should be parsed the same as above. 2730c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<Value> root2 = 2740c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez JSONReader::Read("[true, false, null, ]", JSON_ALLOW_TRAILING_COMMAS); 2750c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(list->Equals(root2.get())); 2760c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 2770c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 2780c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 2790c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Empty array 2800c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<ListValue> list = ListValue::From(JSONReader::Read("[]")); 2810c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(list); 2820c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ(0U, list->GetSize()); 2830c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 2840c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 2850c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 2860c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Nested arrays 2870c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<ListValue> list = ListValue::From( 2880c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez JSONReader::Read("[[true], [], [false, [], [null]], null]")); 2890c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(list); 2900c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ(4U, list->GetSize()); 2910c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 2920c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Lots of trailing commas. 2930c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<Value> root2 = 2940c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez JSONReader::Read("[[true], [], [false, [], [null, ] , ], null,]", 2950c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez JSON_ALLOW_TRAILING_COMMAS); 2960c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(list->Equals(root2.get())); 2970c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 2980c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 2990c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 3000c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Invalid, missing close brace. 3010c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader::Read("[[true], [], [false, [], [null]], null")); 3020c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 3030c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Invalid, too many commas 3040c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader::Read("[true,, null]")); 3050c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader::Read("[true,, null]", JSON_ALLOW_TRAILING_COMMAS)); 3060c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 3070c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Invalid, no commas 3080c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader::Read("[true null]")); 3090c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 3100c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Invalid, trailing comma 3110c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader::Read("[true,]")); 3120c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 3130c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 3140c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 3150c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Valid if we set |allow_trailing_comma| to true. 3160c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<ListValue> list = ListValue::From( 3170c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez JSONReader::Read("[true,]", JSON_ALLOW_TRAILING_COMMAS)); 3180c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(list); 3190c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ(1U, list->GetSize()); 3200c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez Value* tmp_value = nullptr; 3210c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(list->Get(0, &tmp_value)); 3223a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(tmp_value->IsType(Value::Type::BOOLEAN)); 3230c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez bool bool_value = false; 3240c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(tmp_value->GetAsBoolean(&bool_value)); 3250c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(bool_value); 3260c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 3270c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 3280c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 3290c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Don't allow empty elements, even if |allow_trailing_comma| is 3300c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // true. 3310c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader::Read("[,]", JSON_ALLOW_TRAILING_COMMAS)); 3320c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader::Read("[true,,]", JSON_ALLOW_TRAILING_COMMAS)); 3330c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader::Read("[,true,]", JSON_ALLOW_TRAILING_COMMAS)); 3340c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader::Read("[true,,false]", JSON_ALLOW_TRAILING_COMMAS)); 3350c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 3360c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 3370c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 3380c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Test objects 3390c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<DictionaryValue> dict_val = 3400c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez DictionaryValue::From(JSONReader::Read("{}")); 3410c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(dict_val); 3420c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 3430c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez dict_val = DictionaryValue::From(JSONReader::Read( 3440c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez "{\"number\":9.87654321, \"null\":null , \"\\x53\" : \"str\" }")); 3450c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(dict_val); 3460c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez double double_val = 0.0; 3470c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(dict_val->GetDouble("number", &double_val)); 3480c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_DOUBLE_EQ(9.87654321, double_val); 3490c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez Value* null_val = nullptr; 3500c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(dict_val->Get("null", &null_val)); 3513a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(null_val->IsType(Value::Type::NONE)); 3520c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::string str_val; 3530c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(dict_val->GetString("S", &str_val)); 3540c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ("str", str_val); 3550c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 3560c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<Value> root2 = JSONReader::Read( 3570c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez "{\"number\":9.87654321, \"null\":null , \"\\x53\" : \"str\", }", 3580c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez JSON_ALLOW_TRAILING_COMMAS); 3590c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root2); 3600c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(dict_val->Equals(root2.get())); 3610c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 3620c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Test newline equivalence. 3630c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez root2 = JSONReader::Read( 3640c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez "{\n" 3650c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez " \"number\":9.87654321,\n" 3660c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez " \"null\":null,\n" 3670c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez " \"\\x53\":\"str\",\n" 3680c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez "}\n", 3690c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez JSON_ALLOW_TRAILING_COMMAS); 3700c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root2); 3710c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(dict_val->Equals(root2.get())); 3720c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 3730c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez root2 = JSONReader::Read( 3740c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez "{\r\n" 3750c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez " \"number\":9.87654321,\r\n" 3760c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez " \"null\":null,\r\n" 3770c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez " \"\\x53\":\"str\",\r\n" 3780c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez "}\r\n", 3790c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez JSON_ALLOW_TRAILING_COMMAS); 3800c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root2); 3810c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(dict_val->Equals(root2.get())); 3820c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 3830c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 3840c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 3850c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Test nesting 3860c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<DictionaryValue> dict_val = 3870c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez DictionaryValue::From(JSONReader::Read( 3880c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez "{\"inner\":{\"array\":[true]},\"false\":false,\"d\":{}}")); 3890c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(dict_val); 3900c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez DictionaryValue* inner_dict = nullptr; 3910c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(dict_val->GetDictionary("inner", &inner_dict)); 3920c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ListValue* inner_array = nullptr; 3930c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(inner_dict->GetList("array", &inner_array)); 3940c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ(1U, inner_array->GetSize()); 3950c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez bool bool_value = true; 3960c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(dict_val->GetBoolean("false", &bool_value)); 3970c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(bool_value); 3980c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez inner_dict = nullptr; 3990c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(dict_val->GetDictionary("d", &inner_dict)); 4000c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 4010c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<Value> root2 = JSONReader::Read( 4020c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez "{\"inner\": {\"array\":[true] , },\"false\":false,\"d\":{},}", 4030c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez JSON_ALLOW_TRAILING_COMMAS); 4040c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(dict_val->Equals(root2.get())); 4050c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 4060c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 4070c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 4080c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Test keys with periods 4090c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<DictionaryValue> dict_val = DictionaryValue::From( 4100c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez JSONReader::Read("{\"a.b\":3,\"c\":2,\"d.e.f\":{\"g.h.i.j\":1}}")); 4110c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(dict_val); 4120c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez int integer_value = 0; 4130c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE( 4140c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez dict_val->GetIntegerWithoutPathExpansion("a.b", &integer_value)); 4150c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ(3, integer_value); 4160c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(dict_val->GetIntegerWithoutPathExpansion("c", &integer_value)); 4170c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ(2, integer_value); 4180c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez DictionaryValue* inner_dict = nullptr; 4190c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE( 4200c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez dict_val->GetDictionaryWithoutPathExpansion("d.e.f", &inner_dict)); 4210c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ(1U, inner_dict->size()); 4220c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE( 4230c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez inner_dict->GetIntegerWithoutPathExpansion("g.h.i.j", &integer_value)); 4240c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ(1, integer_value); 4250c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 4260c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez dict_val = 4270c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez DictionaryValue::From(JSONReader::Read("{\"a\":{\"b\":2},\"a.b\":1}")); 4280c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(dict_val); 4290c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(dict_val->GetInteger("a.b", &integer_value)); 4300c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ(2, integer_value); 4310c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE( 4320c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez dict_val->GetIntegerWithoutPathExpansion("a.b", &integer_value)); 4330c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ(1, integer_value); 4340c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 4350c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 4360c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 4370c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Invalid, no closing brace 4380c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader::Read("{\"a\": true")); 4390c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 4400c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Invalid, keys must be quoted 4410c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader::Read("{foo:true}")); 4420c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 4430c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Invalid, trailing comma 4440c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader::Read("{\"a\":true,}")); 4450c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 4460c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Invalid, too many commas 4470c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader::Read("{\"a\":true,,\"b\":false}")); 4480c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader::Read("{\"a\":true,,\"b\":false}", 4490c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez JSON_ALLOW_TRAILING_COMMAS)); 4500c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 4510c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Invalid, no separator 4520c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader::Read("{\"a\" \"b\"}")); 4530c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 4540c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Invalid, lone comma. 4550c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader::Read("{,}")); 4560c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader::Read("{,}", JSON_ALLOW_TRAILING_COMMAS)); 4570c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE( 4580c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez JSONReader::Read("{\"a\":true,,}", JSON_ALLOW_TRAILING_COMMAS)); 4590c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader::Read("{,\"a\":true}", JSON_ALLOW_TRAILING_COMMAS)); 4600c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader::Read("{\"a\":true,,\"b\":false}", 4610c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez JSON_ALLOW_TRAILING_COMMAS)); 4620c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 4630c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 4640c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 4650c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Test stack overflow 4660c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::string evil(1000000, '['); 4670c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez evil.append(std::string(1000000, ']')); 4680c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader::Read(evil)); 4690c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 4700c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 4710c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 4720c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // A few thousand adjacent lists is fine. 4730c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::string not_evil("["); 4740c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez not_evil.reserve(15010); 4750c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez for (int i = 0; i < 5000; ++i) 4760c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez not_evil.append("[],"); 4770c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez not_evil.append("[]]"); 4780c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<ListValue> list = 4790c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ListValue::From(JSONReader::Read(not_evil)); 4800c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(list); 4810c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ(5001U, list->GetSize()); 4820c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 4830c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 4840c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 4850c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Test utf8 encoded input 4860c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<Value> root = 4870c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez JSONReader().ReadToValue("\"\xe7\xbd\x91\xe9\xa1\xb5\""); 4880c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 4893a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(root->IsType(Value::Type::STRING)); 4900c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::string str_val; 4910c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(root->GetAsString(&str_val)); 4920c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ(L"\x7f51\x9875", UTF8ToWide(str_val)); 4930c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 4940c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<DictionaryValue> dict_val = 4950c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez DictionaryValue::From(JSONReader().ReadToValue( 4960c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez "{\"path\": \"/tmp/\xc3\xa0\xc3\xa8\xc3\xb2.png\"}")); 4970c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(dict_val); 4980c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(dict_val->GetString("path", &str_val)); 4990c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ("/tmp/\xC3\xA0\xC3\xA8\xC3\xB2.png", str_val); 5000c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 5010c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 5020c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 5030c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Test invalid utf8 encoded input 5040c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader().ReadToValue("\"345\xb0\xa1\xb0\xa2\"")); 5050c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader().ReadToValue("\"123\xc0\x81\"")); 5060c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(JSONReader().ReadToValue("\"abc\xc0\xae\"")); 5070c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 5080c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 5090c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 5100c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Test utf16 encoded strings. 5110c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<Value> root = JSONReader().ReadToValue("\"\\u20ac3,14\""); 5120c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 5133a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(root->IsType(Value::Type::STRING)); 5140c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::string str_val; 5150c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(root->GetAsString(&str_val)); 5160c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ( 5170c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez "\xe2\x82\xac" 5180c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez "3,14", 5190c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez str_val); 5200c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 5210c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez root = JSONReader().ReadToValue("\"\\ud83d\\udca9\\ud83d\\udc6c\""); 5220c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 5233a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(root->IsType(Value::Type::STRING)); 5240c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez str_val.clear(); 5250c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(root->GetAsString(&str_val)); 5260c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ("\xf0\x9f\x92\xa9\xf0\x9f\x91\xac", str_val); 5270c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 5280c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 5290c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 5300c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Test invalid utf16 strings. 5310c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez const char* const cases[] = { 5320c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez "\"\\u123\"", // Invalid scalar. 5330c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez "\"\\ud83d\"", // Invalid scalar. 5340c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez "\"\\u$%@!\"", // Invalid scalar. 5350c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez "\"\\uzz89\"", // Invalid scalar. 5360c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez "\"\\ud83d\\udca\"", // Invalid lower surrogate. 5370c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez "\"\\ud83d\\ud83d\"", // Invalid lower surrogate. 5380c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez "\"\\ud83foo\"", // No lower surrogate. 5390c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez "\"\\ud83\\foo\"" // No lower surrogate. 5400c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez }; 5410c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<Value> root; 5420c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez for (size_t i = 0; i < arraysize(cases); ++i) { 5430c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez root = JSONReader().ReadToValue(cases[i]); 5440c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(root) << cases[i]; 5450c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 5460c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 5470c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 5480c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez { 5490c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez // Test literal root objects. 5500c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::unique_ptr<Value> root = JSONReader::Read("null"); 5513a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(root->IsType(Value::Type::NONE)); 5520c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 5530c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez root = JSONReader::Read("true"); 5540c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 5550c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez bool bool_value; 5560c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(root->GetAsBoolean(&bool_value)); 5570c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(bool_value); 5580c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 5590c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez root = JSONReader::Read("10"); 5600c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 5610c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez int integer_value; 5620c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(root->GetAsInteger(&integer_value)); 5630c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ(10, integer_value); 5640c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 5650c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez root = JSONReader::Read("\"root\""); 5660c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 5670c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez std::string str_val; 5680c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_TRUE(root->GetAsString(&str_val)); 5690c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_EQ("root", str_val); 5700c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez } 5710d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko} 5720d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 5730d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#if !defined(__ANDROID__) && !defined(__ANDROID_HOST__) 5740d205d712abd16eeed2f5d5b1052a367d23a223fAlex VakulenkoTEST(JSONReaderTest, ReadFromFile) { 5750d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko FilePath path; 5760d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko ASSERT_TRUE(PathService::Get(base::DIR_TEST_DATA, &path)); 5770d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko path = path.AppendASCII("json"); 5780d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko ASSERT_TRUE(base::PathExists(path)); 5790d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 5800d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko std::string input; 5810c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(ReadFileToString(path.AppendASCII("bom_feff.json"), &input)); 5820d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 5830d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko JSONReader reader; 58494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<Value> root(reader.ReadToValue(input)); 5850c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root) << reader.GetErrorMessage(); 5863a83cddbf6d8fe9c9d70d01e008ff8e86a823cb6Jay Civelli EXPECT_TRUE(root->IsType(Value::Type::DICTIONARY)); 5870d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko} 5880d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#endif // !__ANDROID__ && !__ANDROID_HOST__ 5890d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 5900d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Tests that the root of a JSON object can be deleted safely while its 5910d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// children outlive it. 5920d205d712abd16eeed2f5d5b1052a367d23a223fAlex VakulenkoTEST(JSONReaderTest, StringOptimizations) { 59394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<Value> dict_literal_0; 59494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<Value> dict_literal_1; 59594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<Value> dict_string_0; 59694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<Value> dict_string_1; 59794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<Value> list_value_0; 59894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<Value> list_value_1; 5990d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 6000d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko { 60194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<Value> root = JSONReader::Read( 6020d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko "{" 6030d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko " \"test\": {" 6040d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko " \"foo\": true," 6050d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko " \"bar\": 3.14," 6060d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko " \"baz\": \"bat\"," 6070d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko " \"moo\": \"cow\"" 6080d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko " }," 6090d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko " \"list\": [" 6100d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko " \"a\"," 6110d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko " \"b\"" 6120d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko " ]" 6130d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko "}", 6140d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko JSON_DETACHABLE_CHILDREN); 6150c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(root); 6160d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 6170c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez DictionaryValue* root_dict = nullptr; 6180d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko ASSERT_TRUE(root->GetAsDictionary(&root_dict)); 6190d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 6200c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez DictionaryValue* dict = nullptr; 6210c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ListValue* list = nullptr; 6220d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 6230d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko ASSERT_TRUE(root_dict->GetDictionary("test", &dict)); 6240d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko ASSERT_TRUE(root_dict->GetList("list", &list)); 6250d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 6260c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(dict->Remove("foo", &dict_literal_0)); 6270c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(dict->Remove("bar", &dict_literal_1)); 6280c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(dict->Remove("baz", &dict_string_0)); 6290c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(dict->Remove("moo", &dict_string_1)); 6300d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 6310d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko ASSERT_EQ(2u, list->GetSize()); 6320c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(list->Remove(0, &list_value_0)); 6330c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez ASSERT_TRUE(list->Remove(0, &list_value_1)); 6340d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko } 6350d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 6360d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko bool b = false; 6370d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko double d = 0; 6380d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko std::string s; 6390d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 6400d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko EXPECT_TRUE(dict_literal_0->GetAsBoolean(&b)); 6410d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko EXPECT_TRUE(b); 6420d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 6430d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko EXPECT_TRUE(dict_literal_1->GetAsDouble(&d)); 6440d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko EXPECT_EQ(3.14, d); 6450d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 6460d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko EXPECT_TRUE(dict_string_0->GetAsString(&s)); 6470d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko EXPECT_EQ("bat", s); 6480d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 6490d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko EXPECT_TRUE(dict_string_1->GetAsString(&s)); 6500d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko EXPECT_EQ("cow", s); 6510d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 6520d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko EXPECT_TRUE(list_value_0->GetAsString(&s)); 6530d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko EXPECT_EQ("a", s); 6540d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko EXPECT_TRUE(list_value_1->GetAsString(&s)); 6550d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko EXPECT_EQ("b", s); 6560d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko} 6570d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 6580d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// A smattering of invalid JSON designed to test specific portions of the 6590d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// parser implementation against buffer overflow. Best run with DCHECKs so 6600d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// that the one in NextChar fires. 6610d205d712abd16eeed2f5d5b1052a367d23a223fAlex VakulenkoTEST(JSONReaderTest, InvalidSanity) { 6620c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez const char* const kInvalidJson[] = { 6630c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez "/* test *", "{\"foo\"", "{\"foo\":", " [", "\"\\u123g\"", "{\n\"eh:\n}", 6640d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko }; 6650d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 6660c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez for (size_t i = 0; i < arraysize(kInvalidJson); ++i) { 6670d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko JSONReader reader; 6680c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez LOG(INFO) << "Sanity test " << i << ": <" << kInvalidJson[i] << ">"; 6690c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez EXPECT_FALSE(reader.ReadToValue(kInvalidJson[i])); 6700d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko EXPECT_NE(JSONReader::JSON_NO_ERROR, reader.error_code()); 6710d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko EXPECT_NE("", reader.GetErrorMessage()); 6720d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko } 6730d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko} 6740d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 6750d205d712abd16eeed2f5d5b1052a367d23a223fAlex VakulenkoTEST(JSONReaderTest, IllegalTrailingNull) { 6760d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko const char json[] = { '"', 'n', 'u', 'l', 'l', '"', '\0' }; 6770d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko std::string json_string(json, sizeof(json)); 6780d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko JSONReader reader; 6790d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko EXPECT_FALSE(reader.ReadToValue(json_string)); 6800d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko EXPECT_EQ(JSONReader::JSON_UNEXPECTED_DATA_AFTER_ROOT, reader.error_code()); 6810d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko} 6820d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 6830d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko} // namespace base 684