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_parser.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_reader.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class JSONParserTest : public testing::Test { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONParser* NewTestParser(const std::string& input) { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONParser* parser = new JSONParser(JSON_PARSE_RFC); 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parser->start_pos_ = input.data(); 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parser->pos_ = parser->start_pos_; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parser->end_pos_ = parser->start_pos_ + input.length(); 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return parser; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TestLastThree(JSONParser* parser) { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(',', *parser->NextChar()); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ('|', *parser->NextChar()); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ('\0', *parser->NextChar()); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(parser->end_pos_, parser->pos_); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(JSONParserTest, NextChar) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string input("Hello world"); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<JSONParser> parser(NewTestParser(input)); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ('H', *parser->pos_); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 1; i < input.length(); ++i) { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(input[i], *parser->NextChar()); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(parser->end_pos_, parser->NextChar()); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(JSONParserTest, ConsumeString) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string input("\"test\",|"); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<JSONParser> parser(NewTestParser(input)); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Value> value(parser->ConsumeString()); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ('"', *parser->pos_); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLastThree(parser.get()); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(value.get()); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string str; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(value->GetAsString(&str)); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("test", str); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(JSONParserTest, ConsumeList) { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string input("[true, false],|"); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<JSONParser> parser(NewTestParser(input)); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Value> value(parser->ConsumeList()); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(']', *parser->pos_); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLastThree(parser.get()); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(value.get()); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* list; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(value->GetAsList(&list)); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2u, list->GetSize()); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(JSONParserTest, ConsumeDictionary) { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string input("{\"abc\":\"def\"},|"); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<JSONParser> parser(NewTestParser(input)); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Value> value(parser->ConsumeDictionary()); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ('}', *parser->pos_); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLastThree(parser.get()); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(value.get()); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* dict; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(value->GetAsDictionary(&dict)); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string str; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(dict->GetString("abc", &str)); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("def", str); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(JSONParserTest, ConsumeLiterals) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Literal |true|. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string input("true,|"); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<JSONParser> parser(NewTestParser(input)); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Value> value(parser->ConsumeLiteral()); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ('e', *parser->pos_); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLastThree(parser.get()); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(value.get()); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool bool_value = false; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(value->GetAsBoolean(&bool_value)); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(bool_value); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Literal |false|. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input = "false,|"; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parser.reset(NewTestParser(input)); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value.reset(parser->ConsumeLiteral()); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ('e', *parser->pos_); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLastThree(parser.get()); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(value.get()); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(value->GetAsBoolean(&bool_value)); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(bool_value); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Literal |null|. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input = "null,|"; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parser.reset(NewTestParser(input)); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value.reset(parser->ConsumeLiteral()); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ('l', *parser->pos_); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLastThree(parser.get()); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(value.get()); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(value->IsType(Value::TYPE_NULL)); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(JSONParserTest, ConsumeNumbers) { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Integer. 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string input("1234,|"); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<JSONParser> parser(NewTestParser(input)); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Value> value(parser->ConsumeNumber()); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ('4', *parser->pos_); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLastThree(parser.get()); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(value.get()); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int number_i; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(value->GetAsInteger(&number_i)); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1234, number_i); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Negative integer. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input = "-1234,|"; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parser.reset(NewTestParser(input)); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value.reset(parser->ConsumeNumber()); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ('4', *parser->pos_); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLastThree(parser.get()); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(value.get()); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(value->GetAsInteger(&number_i)); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1234, number_i); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Double. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input = "12.34,|"; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parser.reset(NewTestParser(input)); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value.reset(parser->ConsumeNumber()); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ('4', *parser->pos_); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLastThree(parser.get()); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(value.get()); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double number_d; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(value->GetAsDouble(&number_d)); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(12.34, number_d); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Scientific. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input = "42e3,|"; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parser.reset(NewTestParser(input)); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value.reset(parser->ConsumeNumber()); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ('3', *parser->pos_); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLastThree(parser.get()); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(value.get()); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(value->GetAsDouble(&number_d)); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(42000, number_d); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Negative scientific. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input = "314159e-5,|"; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parser.reset(NewTestParser(input)); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value.reset(parser->ConsumeNumber()); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ('5', *parser->pos_); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLastThree(parser.get()); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(value.get()); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(value->GetAsDouble(&number_d)); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3.14159, number_d); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Positive scientific. 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input = "0.42e+3,|"; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parser.reset(NewTestParser(input)); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value.reset(parser->ConsumeNumber()); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ('3', *parser->pos_); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestLastThree(parser.get()); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(value.get()); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(value->GetAsDouble(&number_d)); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(420, number_d); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(JSONParserTest, ErrorMessages) { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Error strings should not be modified in case of success. 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error_message; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_code = 0; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Value> root; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::ReadAndReturnError("[42]", JSON_PARSE_RFC, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &error_code, &error_message)); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(error_message.empty()); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, error_code); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test line and column counting 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char big_json[] = "[\n0,\n1,\n2,\n3,4,5,6 7,\n8,\n9\n]"; 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // error here ----------------------------------^ 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::ReadAndReturnError(big_json, JSON_PARSE_RFC, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &error_code, &error_message)); 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(root.get()); 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(JSONParser::FormatErrorMessage(5, 10, JSONReader::kSyntaxError), 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error_message); 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(JSONReader::JSON_SYNTAX_ERROR, error_code); 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error_code = 0; 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error_message = ""; 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test line and column counting with "\r\n" line ending 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char big_json_crlf[] = 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[\r\n0,\r\n1,\r\n2,\r\n3,4,5,6 7,\r\n8,\r\n9\r\n]"; 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // error here ----------------------^ 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root.reset(JSONReader::ReadAndReturnError(big_json_crlf, JSON_PARSE_RFC, 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &error_code, &error_message)); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(JSONParser::FormatErrorMessage(5, 10, JSONReader::kSyntaxError), 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_message); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(JSONReader::JSON_SYNTAX_ERROR, error_code); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test each of the error conditions 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::ReadAndReturnError("{},{}", JSON_PARSE_RFC, 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &error_code, &error_message)); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(JSONParser::FormatErrorMessage(1, 3, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONReader::kUnexpectedDataAfterRoot), error_message); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(JSONReader::JSON_UNEXPECTED_DATA_AFTER_ROOT, error_code); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string nested_json; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 101; ++i) { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nested_json.insert(nested_json.begin(), '['); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nested_json.append(1, ']'); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::ReadAndReturnError(nested_json, JSON_PARSE_RFC, 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &error_code, &error_message)); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(JSONParser::FormatErrorMessage(1, 100, JSONReader::kTooMuchNesting), 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_message); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(JSONReader::JSON_TOO_MUCH_NESTING, error_code); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::ReadAndReturnError("[1,]", JSON_PARSE_RFC, 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &error_code, &error_message)); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(JSONParser::FormatErrorMessage(1, 4, JSONReader::kTrailingComma), 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_message); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(JSONReader::JSON_TRAILING_COMMA, error_code); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::ReadAndReturnError("{foo:\"bar\"}", JSON_PARSE_RFC, 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &error_code, &error_message)); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(JSONParser::FormatErrorMessage(1, 2, 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONReader::kUnquotedDictionaryKey), error_message); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(JSONReader::JSON_UNQUOTED_DICTIONARY_KEY, error_code); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::ReadAndReturnError("{\"foo\":\"bar\",}", 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSON_PARSE_RFC, 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &error_code, &error_message)); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(JSONParser::FormatErrorMessage(1, 14, JSONReader::kTrailingComma), 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_message); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::ReadAndReturnError("[nu]", JSON_PARSE_RFC, 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &error_code, &error_message)); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(JSONParser::FormatErrorMessage(1, 2, JSONReader::kSyntaxError), 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_message); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(JSONReader::JSON_SYNTAX_ERROR, error_code); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::ReadAndReturnError("[\"xxx\\xq\"]", JSON_PARSE_RFC, 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &error_code, &error_message)); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(JSONParser::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape), 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_message); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(JSONReader::JSON_INVALID_ESCAPE, error_code); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::ReadAndReturnError("[\"xxx\\uq\"]", JSON_PARSE_RFC, 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &error_code, &error_message)); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(JSONParser::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape), 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_message); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(JSONReader::JSON_INVALID_ESCAPE, error_code); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root.reset(JSONReader::ReadAndReturnError("[\"xxx\\q\"]", JSON_PARSE_RFC, 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &error_code, &error_message)); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(root.get()); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(JSONParser::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape), 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_message); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(JSONReader::JSON_INVALID_ESCAPE, error_code); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(JSONParserTest, Decode4ByteUtf8Char) { 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This test strings contains a 4 byte unicode character (a smiley!) that the 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reader should be able to handle (the character is \xf0\x9f\x98\x87). 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kUtf8Data[] = 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "[\"\",[],[],[],{\"google:suggesttype\":[]}]"; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error_message; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_code = 0; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Value> root( 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONReader::ReadAndReturnError(kUtf8Data, JSON_PARSE_RFC, &error_code, 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &error_message)); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(root.get()) << error_message; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 320