Home | History | Annotate | Download | only in json
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/json/json_parser.h"
      6 
      7 #include <stddef.h>
      8 
      9 #include <memory>
     10 
     11 #include "base/json/json_reader.h"
     12 #include "base/values.h"
     13 #include "testing/gtest/include/gtest/gtest.h"
     14 
     15 namespace base {
     16 namespace internal {
     17 
     18 class JSONParserTest : public testing::Test {
     19  public:
     20   JSONParser* NewTestParser(const std::string& input) {
     21     JSONParser* parser = new JSONParser(JSON_PARSE_RFC);
     22     parser->start_pos_ = input.data();
     23     parser->pos_ = parser->start_pos_;
     24     parser->end_pos_ = parser->start_pos_ + input.length();
     25     return parser;
     26   }
     27 
     28   void TestLastThree(JSONParser* parser) {
     29     EXPECT_EQ(',', *parser->NextChar());
     30     EXPECT_EQ('|', *parser->NextChar());
     31     EXPECT_EQ('\0', *parser->NextChar());
     32     EXPECT_EQ(parser->end_pos_, parser->pos_);
     33   }
     34 };
     35 
     36 TEST_F(JSONParserTest, NextChar) {
     37   std::string input("Hello world");
     38   std::unique_ptr<JSONParser> parser(NewTestParser(input));
     39 
     40   EXPECT_EQ('H', *parser->pos_);
     41   for (size_t i = 1; i < input.length(); ++i) {
     42     EXPECT_EQ(input[i], *parser->NextChar());
     43   }
     44   EXPECT_EQ(parser->end_pos_, parser->NextChar());
     45 }
     46 
     47 TEST_F(JSONParserTest, ConsumeString) {
     48   std::string input("\"test\",|");
     49   std::unique_ptr<JSONParser> parser(NewTestParser(input));
     50   std::unique_ptr<Value> value(parser->ConsumeString());
     51   EXPECT_EQ('"', *parser->pos_);
     52 
     53   TestLastThree(parser.get());
     54 
     55   ASSERT_TRUE(value.get());
     56   std::string str;
     57   EXPECT_TRUE(value->GetAsString(&str));
     58   EXPECT_EQ("test", str);
     59 }
     60 
     61 TEST_F(JSONParserTest, ConsumeList) {
     62   std::string input("[true, false],|");
     63   std::unique_ptr<JSONParser> parser(NewTestParser(input));
     64   std::unique_ptr<Value> value(parser->ConsumeList());
     65   EXPECT_EQ(']', *parser->pos_);
     66 
     67   TestLastThree(parser.get());
     68 
     69   ASSERT_TRUE(value.get());
     70   base::ListValue* list;
     71   EXPECT_TRUE(value->GetAsList(&list));
     72   EXPECT_EQ(2u, list->GetSize());
     73 }
     74 
     75 TEST_F(JSONParserTest, ConsumeDictionary) {
     76   std::string input("{\"abc\":\"def\"},|");
     77   std::unique_ptr<JSONParser> parser(NewTestParser(input));
     78   std::unique_ptr<Value> value(parser->ConsumeDictionary());
     79   EXPECT_EQ('}', *parser->pos_);
     80 
     81   TestLastThree(parser.get());
     82 
     83   ASSERT_TRUE(value.get());
     84   base::DictionaryValue* dict;
     85   EXPECT_TRUE(value->GetAsDictionary(&dict));
     86   std::string str;
     87   EXPECT_TRUE(dict->GetString("abc", &str));
     88   EXPECT_EQ("def", str);
     89 }
     90 
     91 TEST_F(JSONParserTest, ConsumeLiterals) {
     92   // Literal |true|.
     93   std::string input("true,|");
     94   std::unique_ptr<JSONParser> parser(NewTestParser(input));
     95   std::unique_ptr<Value> value(parser->ConsumeLiteral());
     96   EXPECT_EQ('e', *parser->pos_);
     97 
     98   TestLastThree(parser.get());
     99 
    100   ASSERT_TRUE(value.get());
    101   bool bool_value = false;
    102   EXPECT_TRUE(value->GetAsBoolean(&bool_value));
    103   EXPECT_TRUE(bool_value);
    104 
    105   // Literal |false|.
    106   input = "false,|";
    107   parser.reset(NewTestParser(input));
    108   value.reset(parser->ConsumeLiteral());
    109   EXPECT_EQ('e', *parser->pos_);
    110 
    111   TestLastThree(parser.get());
    112 
    113   ASSERT_TRUE(value.get());
    114   EXPECT_TRUE(value->GetAsBoolean(&bool_value));
    115   EXPECT_FALSE(bool_value);
    116 
    117   // Literal |null|.
    118   input = "null,|";
    119   parser.reset(NewTestParser(input));
    120   value.reset(parser->ConsumeLiteral());
    121   EXPECT_EQ('l', *parser->pos_);
    122 
    123   TestLastThree(parser.get());
    124 
    125   ASSERT_TRUE(value.get());
    126   EXPECT_TRUE(value->IsType(Value::TYPE_NULL));
    127 }
    128 
    129 TEST_F(JSONParserTest, ConsumeNumbers) {
    130   // Integer.
    131   std::string input("1234,|");
    132   std::unique_ptr<JSONParser> parser(NewTestParser(input));
    133   std::unique_ptr<Value> value(parser->ConsumeNumber());
    134   EXPECT_EQ('4', *parser->pos_);
    135 
    136   TestLastThree(parser.get());
    137 
    138   ASSERT_TRUE(value.get());
    139   int number_i;
    140   EXPECT_TRUE(value->GetAsInteger(&number_i));
    141   EXPECT_EQ(1234, number_i);
    142 
    143   // Negative integer.
    144   input = "-1234,|";
    145   parser.reset(NewTestParser(input));
    146   value.reset(parser->ConsumeNumber());
    147   EXPECT_EQ('4', *parser->pos_);
    148 
    149   TestLastThree(parser.get());
    150 
    151   ASSERT_TRUE(value.get());
    152   EXPECT_TRUE(value->GetAsInteger(&number_i));
    153   EXPECT_EQ(-1234, number_i);
    154 
    155   // Double.
    156   input = "12.34,|";
    157   parser.reset(NewTestParser(input));
    158   value.reset(parser->ConsumeNumber());
    159   EXPECT_EQ('4', *parser->pos_);
    160 
    161   TestLastThree(parser.get());
    162 
    163   ASSERT_TRUE(value.get());
    164   double number_d;
    165   EXPECT_TRUE(value->GetAsDouble(&number_d));
    166   EXPECT_EQ(12.34, number_d);
    167 
    168   // Scientific.
    169   input = "42e3,|";
    170   parser.reset(NewTestParser(input));
    171   value.reset(parser->ConsumeNumber());
    172   EXPECT_EQ('3', *parser->pos_);
    173 
    174   TestLastThree(parser.get());
    175 
    176   ASSERT_TRUE(value.get());
    177   EXPECT_TRUE(value->GetAsDouble(&number_d));
    178   EXPECT_EQ(42000, number_d);
    179 
    180   // Negative scientific.
    181   input = "314159e-5,|";
    182   parser.reset(NewTestParser(input));
    183   value.reset(parser->ConsumeNumber());
    184   EXPECT_EQ('5', *parser->pos_);
    185 
    186   TestLastThree(parser.get());
    187 
    188   ASSERT_TRUE(value.get());
    189   EXPECT_TRUE(value->GetAsDouble(&number_d));
    190   EXPECT_EQ(3.14159, number_d);
    191 
    192   // Positive scientific.
    193   input = "0.42e+3,|";
    194   parser.reset(NewTestParser(input));
    195   value.reset(parser->ConsumeNumber());
    196   EXPECT_EQ('3', *parser->pos_);
    197 
    198   TestLastThree(parser.get());
    199 
    200   ASSERT_TRUE(value.get());
    201   EXPECT_TRUE(value->GetAsDouble(&number_d));
    202   EXPECT_EQ(420, number_d);
    203 }
    204 
    205 TEST_F(JSONParserTest, ErrorMessages) {
    206   // Error strings should not be modified in case of success.
    207   std::string error_message;
    208   int error_code = 0;
    209   std::unique_ptr<Value> root = JSONReader::ReadAndReturnError(
    210       "[42]", JSON_PARSE_RFC, &error_code, &error_message);
    211   EXPECT_TRUE(error_message.empty());
    212   EXPECT_EQ(0, error_code);
    213 
    214   // Test line and column counting
    215   const char big_json[] = "[\n0,\n1,\n2,\n3,4,5,6 7,\n8,\n9\n]";
    216   // error here ----------------------------------^
    217   root = JSONReader::ReadAndReturnError(big_json, JSON_PARSE_RFC, &error_code,
    218                                         &error_message);
    219   EXPECT_FALSE(root.get());
    220   EXPECT_EQ(JSONParser::FormatErrorMessage(5, 10, JSONReader::kSyntaxError),
    221             error_message);
    222   EXPECT_EQ(JSONReader::JSON_SYNTAX_ERROR, error_code);
    223 
    224   error_code = 0;
    225   error_message = "";
    226   // Test line and column counting with "\r\n" line ending
    227   const char big_json_crlf[] =
    228       "[\r\n0,\r\n1,\r\n2,\r\n3,4,5,6 7,\r\n8,\r\n9\r\n]";
    229   // error here ----------------------^
    230   root = JSONReader::ReadAndReturnError(big_json_crlf, JSON_PARSE_RFC,
    231                                         &error_code, &error_message);
    232   EXPECT_FALSE(root.get());
    233   EXPECT_EQ(JSONParser::FormatErrorMessage(5, 10, JSONReader::kSyntaxError),
    234             error_message);
    235   EXPECT_EQ(JSONReader::JSON_SYNTAX_ERROR, error_code);
    236 
    237   // Test each of the error conditions
    238   root = JSONReader::ReadAndReturnError("{},{}", JSON_PARSE_RFC, &error_code,
    239                                         &error_message);
    240   EXPECT_FALSE(root.get());
    241   EXPECT_EQ(JSONParser::FormatErrorMessage(1, 3,
    242       JSONReader::kUnexpectedDataAfterRoot), error_message);
    243   EXPECT_EQ(JSONReader::JSON_UNEXPECTED_DATA_AFTER_ROOT, error_code);
    244 
    245   std::string nested_json;
    246   for (int i = 0; i < 101; ++i) {
    247     nested_json.insert(nested_json.begin(), '[');
    248     nested_json.append(1, ']');
    249   }
    250   root = JSONReader::ReadAndReturnError(nested_json, JSON_PARSE_RFC,
    251                                         &error_code, &error_message);
    252   EXPECT_FALSE(root.get());
    253   EXPECT_EQ(JSONParser::FormatErrorMessage(1, 100, JSONReader::kTooMuchNesting),
    254             error_message);
    255   EXPECT_EQ(JSONReader::JSON_TOO_MUCH_NESTING, error_code);
    256 
    257   root = JSONReader::ReadAndReturnError("[1,]", JSON_PARSE_RFC, &error_code,
    258                                         &error_message);
    259   EXPECT_FALSE(root.get());
    260   EXPECT_EQ(JSONParser::FormatErrorMessage(1, 4, JSONReader::kTrailingComma),
    261             error_message);
    262   EXPECT_EQ(JSONReader::JSON_TRAILING_COMMA, error_code);
    263 
    264   root = JSONReader::ReadAndReturnError("{foo:\"bar\"}", JSON_PARSE_RFC,
    265                                         &error_code, &error_message);
    266   EXPECT_FALSE(root.get());
    267   EXPECT_EQ(JSONParser::FormatErrorMessage(1, 2,
    268       JSONReader::kUnquotedDictionaryKey), error_message);
    269   EXPECT_EQ(JSONReader::JSON_UNQUOTED_DICTIONARY_KEY, error_code);
    270 
    271   root = JSONReader::ReadAndReturnError("{\"foo\":\"bar\",}", JSON_PARSE_RFC,
    272                                         &error_code, &error_message);
    273   EXPECT_FALSE(root.get());
    274   EXPECT_EQ(JSONParser::FormatErrorMessage(1, 14, JSONReader::kTrailingComma),
    275             error_message);
    276 
    277   root = JSONReader::ReadAndReturnError("[nu]", JSON_PARSE_RFC, &error_code,
    278                                         &error_message);
    279   EXPECT_FALSE(root.get());
    280   EXPECT_EQ(JSONParser::FormatErrorMessage(1, 2, JSONReader::kSyntaxError),
    281             error_message);
    282   EXPECT_EQ(JSONReader::JSON_SYNTAX_ERROR, error_code);
    283 
    284   root = JSONReader::ReadAndReturnError("[\"xxx\\xq\"]", JSON_PARSE_RFC,
    285                                         &error_code, &error_message);
    286   EXPECT_FALSE(root.get());
    287   EXPECT_EQ(JSONParser::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape),
    288             error_message);
    289   EXPECT_EQ(JSONReader::JSON_INVALID_ESCAPE, error_code);
    290 
    291   root = JSONReader::ReadAndReturnError("[\"xxx\\uq\"]", JSON_PARSE_RFC,
    292                                         &error_code, &error_message);
    293   EXPECT_FALSE(root.get());
    294   EXPECT_EQ(JSONParser::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape),
    295             error_message);
    296   EXPECT_EQ(JSONReader::JSON_INVALID_ESCAPE, error_code);
    297 
    298   root = JSONReader::ReadAndReturnError("[\"xxx\\q\"]", JSON_PARSE_RFC,
    299                                         &error_code, &error_message);
    300   EXPECT_FALSE(root.get());
    301   EXPECT_EQ(JSONParser::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape),
    302             error_message);
    303   EXPECT_EQ(JSONReader::JSON_INVALID_ESCAPE, error_code);
    304 }
    305 
    306 TEST_F(JSONParserTest, Decode4ByteUtf8Char) {
    307   // This test strings contains a 4 byte unicode character (a smiley!) that the
    308   // reader should be able to handle (the character is \xf0\x9f\x98\x87).
    309   const char kUtf8Data[] =
    310       "[\"\",[],[],[],{\"google:suggesttype\":[]}]";
    311   std::string error_message;
    312   int error_code = 0;
    313   std::unique_ptr<Value> root = JSONReader::ReadAndReturnError(
    314       kUtf8Data, JSON_PARSE_RFC, &error_code, &error_message);
    315   EXPECT_TRUE(root.get()) << error_message;
    316 }
    317 
    318 TEST_F(JSONParserTest, DecodeUnicodeNonCharacter) {
    319   // Tests Unicode code points (encoded as escaped UTF-16) that are not valid
    320   // characters.
    321   EXPECT_FALSE(JSONReader::Read("[\"\\ufdd0\"]"));
    322   EXPECT_FALSE(JSONReader::Read("[\"\\ufffe\"]"));
    323   EXPECT_FALSE(JSONReader::Read("[\"\\ud83f\\udffe\"]"));
    324 }
    325 
    326 }  // namespace internal
    327 }  // namespace base
    328