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