1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker
5*635a8641SAndroid Build Coastguard Worker #include "base/json/json_reader.h"
6*635a8641SAndroid Build Coastguard Worker
7*635a8641SAndroid Build Coastguard Worker #include <stddef.h>
8*635a8641SAndroid Build Coastguard Worker
9*635a8641SAndroid Build Coastguard Worker #include <memory>
10*635a8641SAndroid Build Coastguard Worker
11*635a8641SAndroid Build Coastguard Worker #include "base/base_paths.h"
12*635a8641SAndroid Build Coastguard Worker #include "base/files/file_util.h"
13*635a8641SAndroid Build Coastguard Worker #include "base/logging.h"
14*635a8641SAndroid Build Coastguard Worker #include "base/macros.h"
15*635a8641SAndroid Build Coastguard Worker #include "base/path_service.h"
16*635a8641SAndroid Build Coastguard Worker #include "base/strings/string_piece.h"
17*635a8641SAndroid Build Coastguard Worker #include "base/strings/utf_string_conversions.h"
18*635a8641SAndroid Build Coastguard Worker #include "base/values.h"
19*635a8641SAndroid Build Coastguard Worker #include "build/build_config.h"
20*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
21*635a8641SAndroid Build Coastguard Worker
22*635a8641SAndroid Build Coastguard Worker namespace base {
23*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,Whitespace)24*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, Whitespace) {
25*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> root = JSONReader().ReadToValue(" null ");
26*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
27*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->is_none());
28*635a8641SAndroid Build Coastguard Worker }
29*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,InvalidString)30*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, InvalidString) {
31*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader().ReadToValue("nu"));
32*635a8641SAndroid Build Coastguard Worker }
33*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,SimpleBool)34*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, SimpleBool) {
35*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> root = JSONReader().ReadToValue("true ");
36*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
37*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->is_bool());
38*635a8641SAndroid Build Coastguard Worker }
39*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,EmbeddedComments)40*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, EmbeddedComments) {
41*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> root = JSONReader().ReadToValue("/* comment */null");
42*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
43*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->is_none());
44*635a8641SAndroid Build Coastguard Worker root = JSONReader().ReadToValue("40 /* comment */");
45*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
46*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->is_int());
47*635a8641SAndroid Build Coastguard Worker root = JSONReader().ReadToValue("true // comment");
48*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
49*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->is_bool());
50*635a8641SAndroid Build Coastguard Worker root = JSONReader().ReadToValue("/* comment */\"sample string\"");
51*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
52*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->is_string());
53*635a8641SAndroid Build Coastguard Worker std::string value;
54*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->GetAsString(&value));
55*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("sample string", value);
56*635a8641SAndroid Build Coastguard Worker std::unique_ptr<ListValue> list =
57*635a8641SAndroid Build Coastguard Worker ListValue::From(JSONReader().ReadToValue("[1, /* comment, 2 ] */ \n 3]"));
58*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(list);
59*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2u, list->GetSize());
60*635a8641SAndroid Build Coastguard Worker int int_val = 0;
61*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(list->GetInteger(0, &int_val));
62*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, int_val);
63*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(list->GetInteger(1, &int_val));
64*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(3, int_val);
65*635a8641SAndroid Build Coastguard Worker list = ListValue::From(JSONReader().ReadToValue("[1, /*a*/2, 3]"));
66*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(list);
67*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(3u, list->GetSize());
68*635a8641SAndroid Build Coastguard Worker root = JSONReader().ReadToValue("/* comment **/42");
69*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
70*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->is_int());
71*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->GetAsInteger(&int_val));
72*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(42, int_val);
73*635a8641SAndroid Build Coastguard Worker root = JSONReader().ReadToValue(
74*635a8641SAndroid Build Coastguard Worker "/* comment **/\n"
75*635a8641SAndroid Build Coastguard Worker "// */ 43\n"
76*635a8641SAndroid Build Coastguard Worker "44");
77*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
78*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->is_int());
79*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->GetAsInteger(&int_val));
80*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(44, int_val);
81*635a8641SAndroid Build Coastguard Worker }
82*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,Ints)83*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, Ints) {
84*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> root = JSONReader().ReadToValue("43");
85*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
86*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->is_int());
87*635a8641SAndroid Build Coastguard Worker int int_val = 0;
88*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->GetAsInteger(&int_val));
89*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(43, int_val);
90*635a8641SAndroid Build Coastguard Worker }
91*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,NonDecimalNumbers)92*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, NonDecimalNumbers) {
93*635a8641SAndroid Build Coastguard Worker // According to RFC4627, oct, hex, and leading zeros are invalid JSON.
94*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader().ReadToValue("043"));
95*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader().ReadToValue("0x43"));
96*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader().ReadToValue("00"));
97*635a8641SAndroid Build Coastguard Worker }
98*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,NumberZero)99*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, NumberZero) {
100*635a8641SAndroid Build Coastguard Worker // Test 0 (which needs to be special cased because of the leading zero
101*635a8641SAndroid Build Coastguard Worker // clause).
102*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> root = JSONReader().ReadToValue("0");
103*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
104*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->is_int());
105*635a8641SAndroid Build Coastguard Worker int int_val = 1;
106*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->GetAsInteger(&int_val));
107*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, int_val);
108*635a8641SAndroid Build Coastguard Worker }
109*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,LargeIntPromotion)110*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, LargeIntPromotion) {
111*635a8641SAndroid Build Coastguard Worker // Numbers that overflow ints should succeed, being internally promoted to
112*635a8641SAndroid Build Coastguard Worker // storage as doubles
113*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> root = JSONReader().ReadToValue("2147483648");
114*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
115*635a8641SAndroid Build Coastguard Worker double double_val;
116*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->is_double());
117*635a8641SAndroid Build Coastguard Worker double_val = 0.0;
118*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->GetAsDouble(&double_val));
119*635a8641SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(2147483648.0, double_val);
120*635a8641SAndroid Build Coastguard Worker root = JSONReader().ReadToValue("-2147483649");
121*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
122*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->is_double());
123*635a8641SAndroid Build Coastguard Worker double_val = 0.0;
124*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->GetAsDouble(&double_val));
125*635a8641SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(-2147483649.0, double_val);
126*635a8641SAndroid Build Coastguard Worker }
127*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,Doubles)128*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, Doubles) {
129*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> root = JSONReader().ReadToValue("43.1");
130*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
131*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->is_double());
132*635a8641SAndroid Build Coastguard Worker double double_val = 0.0;
133*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->GetAsDouble(&double_val));
134*635a8641SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(43.1, double_val);
135*635a8641SAndroid Build Coastguard Worker
136*635a8641SAndroid Build Coastguard Worker root = JSONReader().ReadToValue("4.3e-1");
137*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
138*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->is_double());
139*635a8641SAndroid Build Coastguard Worker double_val = 0.0;
140*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->GetAsDouble(&double_val));
141*635a8641SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(.43, double_val);
142*635a8641SAndroid Build Coastguard Worker
143*635a8641SAndroid Build Coastguard Worker root = JSONReader().ReadToValue("2.1e0");
144*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
145*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->is_double());
146*635a8641SAndroid Build Coastguard Worker double_val = 0.0;
147*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->GetAsDouble(&double_val));
148*635a8641SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(2.1, double_val);
149*635a8641SAndroid Build Coastguard Worker
150*635a8641SAndroid Build Coastguard Worker root = JSONReader().ReadToValue("2.1e+0001");
151*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
152*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->is_double());
153*635a8641SAndroid Build Coastguard Worker double_val = 0.0;
154*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->GetAsDouble(&double_val));
155*635a8641SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(21.0, double_val);
156*635a8641SAndroid Build Coastguard Worker
157*635a8641SAndroid Build Coastguard Worker root = JSONReader().ReadToValue("0.01");
158*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
159*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->is_double());
160*635a8641SAndroid Build Coastguard Worker double_val = 0.0;
161*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->GetAsDouble(&double_val));
162*635a8641SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(0.01, double_val);
163*635a8641SAndroid Build Coastguard Worker
164*635a8641SAndroid Build Coastguard Worker root = JSONReader().ReadToValue("1.00");
165*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
166*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->is_double());
167*635a8641SAndroid Build Coastguard Worker double_val = 0.0;
168*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->GetAsDouble(&double_val));
169*635a8641SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(1.0, double_val);
170*635a8641SAndroid Build Coastguard Worker }
171*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,FractionalNumbers)172*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, FractionalNumbers) {
173*635a8641SAndroid Build Coastguard Worker // Fractional parts must have a digit before and after the decimal point.
174*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader().ReadToValue("1."));
175*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader().ReadToValue(".1"));
176*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader().ReadToValue("1.e10"));
177*635a8641SAndroid Build Coastguard Worker }
178*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,ExponentialNumbers)179*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, ExponentialNumbers) {
180*635a8641SAndroid Build Coastguard Worker // Exponent must have a digit following the 'e'.
181*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader().ReadToValue("1e"));
182*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader().ReadToValue("1E"));
183*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader().ReadToValue("1e1."));
184*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader().ReadToValue("1e1.0"));
185*635a8641SAndroid Build Coastguard Worker }
186*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,InvalidNAN)187*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, InvalidNAN) {
188*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader().ReadToValue("1e1000"));
189*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader().ReadToValue("-1e1000"));
190*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader().ReadToValue("NaN"));
191*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader().ReadToValue("nan"));
192*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader().ReadToValue("inf"));
193*635a8641SAndroid Build Coastguard Worker }
194*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,InvalidNumbers)195*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, InvalidNumbers) {
196*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader().ReadToValue("4.3.1"));
197*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader().ReadToValue("4e3.1"));
198*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader().ReadToValue("4.a"));
199*635a8641SAndroid Build Coastguard Worker }
200*635a8641SAndroid Build Coastguard Worker
TEST(JSONReader,SimpleString)201*635a8641SAndroid Build Coastguard Worker TEST(JSONReader, SimpleString) {
202*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> root = JSONReader().ReadToValue("\"hello world\"");
203*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
204*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->is_string());
205*635a8641SAndroid Build Coastguard Worker std::string str_val;
206*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->GetAsString(&str_val));
207*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("hello world", str_val);
208*635a8641SAndroid Build Coastguard Worker }
209*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,EmptyString)210*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, EmptyString) {
211*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> root = JSONReader().ReadToValue("\"\"");
212*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
213*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->is_string());
214*635a8641SAndroid Build Coastguard Worker std::string str_val;
215*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->GetAsString(&str_val));
216*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("", str_val);
217*635a8641SAndroid Build Coastguard Worker }
218*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,BasicStringEscapes)219*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, BasicStringEscapes) {
220*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> root =
221*635a8641SAndroid Build Coastguard Worker JSONReader().ReadToValue("\" \\\"\\\\\\/\\b\\f\\n\\r\\t\\v\"");
222*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
223*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->is_string());
224*635a8641SAndroid Build Coastguard Worker std::string str_val;
225*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->GetAsString(&str_val));
226*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(" \"\\/\b\f\n\r\t\v", str_val);
227*635a8641SAndroid Build Coastguard Worker }
228*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,UnicodeEscapes)229*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, UnicodeEscapes) {
230*635a8641SAndroid Build Coastguard Worker // Test hex and unicode escapes including the null character.
231*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> root =
232*635a8641SAndroid Build Coastguard Worker JSONReader().ReadToValue("\"\\x41\\x00\\u1234\\u0000\"");
233*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
234*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->is_string());
235*635a8641SAndroid Build Coastguard Worker std::string str_val;
236*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->GetAsString(&str_val));
237*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(std::wstring(L"A\0\x1234\0", 4), UTF8ToWide(str_val));
238*635a8641SAndroid Build Coastguard Worker }
239*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,InvalidStrings)240*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, InvalidStrings) {
241*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader().ReadToValue("\"no closing quote"));
242*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader().ReadToValue("\"\\z invalid escape char\""));
243*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader().ReadToValue("\"\\xAQ invalid hex code\""));
244*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader().ReadToValue("not enough hex chars\\x1\""));
245*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader().ReadToValue("\"not enough escape chars\\u123\""));
246*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(
247*635a8641SAndroid Build Coastguard Worker JSONReader().ReadToValue("\"extra backslash at end of input\\\""));
248*635a8641SAndroid Build Coastguard Worker }
249*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,BasicArray)250*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, BasicArray) {
251*635a8641SAndroid Build Coastguard Worker std::unique_ptr<ListValue> list =
252*635a8641SAndroid Build Coastguard Worker ListValue::From(JSONReader::Read("[true, false, null]"));
253*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(list);
254*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(3U, list->GetSize());
255*635a8641SAndroid Build Coastguard Worker
256*635a8641SAndroid Build Coastguard Worker // Test with trailing comma. Should be parsed the same as above.
257*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> root2 =
258*635a8641SAndroid Build Coastguard Worker JSONReader::Read("[true, false, null, ]", JSON_ALLOW_TRAILING_COMMAS);
259*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(list->Equals(root2.get()));
260*635a8641SAndroid Build Coastguard Worker }
261*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,EmptyArray)262*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, EmptyArray) {
263*635a8641SAndroid Build Coastguard Worker std::unique_ptr<ListValue> list = ListValue::From(JSONReader::Read("[]"));
264*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(list);
265*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0U, list->GetSize());
266*635a8641SAndroid Build Coastguard Worker }
267*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,NestedArrays)268*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, NestedArrays) {
269*635a8641SAndroid Build Coastguard Worker std::unique_ptr<ListValue> list = ListValue::From(
270*635a8641SAndroid Build Coastguard Worker JSONReader::Read("[[true], [], [false, [], [null]], null]"));
271*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(list);
272*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(4U, list->GetSize());
273*635a8641SAndroid Build Coastguard Worker
274*635a8641SAndroid Build Coastguard Worker // Lots of trailing commas.
275*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> root2 =
276*635a8641SAndroid Build Coastguard Worker JSONReader::Read("[[true], [], [false, [], [null, ] , ], null,]",
277*635a8641SAndroid Build Coastguard Worker JSON_ALLOW_TRAILING_COMMAS);
278*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(list->Equals(root2.get()));
279*635a8641SAndroid Build Coastguard Worker }
280*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,InvalidArrays)281*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, InvalidArrays) {
282*635a8641SAndroid Build Coastguard Worker // Missing close brace.
283*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader::Read("[[true], [], [false, [], [null]], null"));
284*635a8641SAndroid Build Coastguard Worker
285*635a8641SAndroid Build Coastguard Worker // Too many commas.
286*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader::Read("[true,, null]"));
287*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader::Read("[true,, null]", JSON_ALLOW_TRAILING_COMMAS));
288*635a8641SAndroid Build Coastguard Worker
289*635a8641SAndroid Build Coastguard Worker // No commas.
290*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader::Read("[true null]"));
291*635a8641SAndroid Build Coastguard Worker
292*635a8641SAndroid Build Coastguard Worker // Trailing comma.
293*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader::Read("[true,]"));
294*635a8641SAndroid Build Coastguard Worker }
295*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,ArrayTrailingComma)296*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, ArrayTrailingComma) {
297*635a8641SAndroid Build Coastguard Worker // Valid if we set |allow_trailing_comma| to true.
298*635a8641SAndroid Build Coastguard Worker std::unique_ptr<ListValue> list =
299*635a8641SAndroid Build Coastguard Worker ListValue::From(JSONReader::Read("[true,]", JSON_ALLOW_TRAILING_COMMAS));
300*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(list);
301*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1U, list->GetSize());
302*635a8641SAndroid Build Coastguard Worker Value* tmp_value = nullptr;
303*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(list->Get(0, &tmp_value));
304*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(tmp_value->is_bool());
305*635a8641SAndroid Build Coastguard Worker bool bool_value = false;
306*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(tmp_value->GetAsBoolean(&bool_value));
307*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(bool_value);
308*635a8641SAndroid Build Coastguard Worker }
309*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,ArrayTrailingCommaNoEmptyElements)310*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, ArrayTrailingCommaNoEmptyElements) {
311*635a8641SAndroid Build Coastguard Worker // Don't allow empty elements, even if |allow_trailing_comma| is
312*635a8641SAndroid Build Coastguard Worker // true.
313*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader::Read("[,]", JSON_ALLOW_TRAILING_COMMAS));
314*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader::Read("[true,,]", JSON_ALLOW_TRAILING_COMMAS));
315*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader::Read("[,true,]", JSON_ALLOW_TRAILING_COMMAS));
316*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader::Read("[true,,false]", JSON_ALLOW_TRAILING_COMMAS));
317*635a8641SAndroid Build Coastguard Worker }
318*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,EmptyDictionary)319*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, EmptyDictionary) {
320*635a8641SAndroid Build Coastguard Worker std::unique_ptr<DictionaryValue> dict_val =
321*635a8641SAndroid Build Coastguard Worker DictionaryValue::From(JSONReader::Read("{}"));
322*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(dict_val);
323*635a8641SAndroid Build Coastguard Worker }
324*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,CompleteDictionary)325*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, CompleteDictionary) {
326*635a8641SAndroid Build Coastguard Worker auto dict_val = DictionaryValue::From(JSONReader::Read(
327*635a8641SAndroid Build Coastguard Worker "{\"number\":9.87654321, \"null\":null , \"\\x53\" : \"str\" }"));
328*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(dict_val);
329*635a8641SAndroid Build Coastguard Worker double double_val = 0.0;
330*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(dict_val->GetDouble("number", &double_val));
331*635a8641SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(9.87654321, double_val);
332*635a8641SAndroid Build Coastguard Worker Value* null_val = nullptr;
333*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(dict_val->Get("null", &null_val));
334*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(null_val->is_none());
335*635a8641SAndroid Build Coastguard Worker std::string str_val;
336*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(dict_val->GetString("S", &str_val));
337*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("str", str_val);
338*635a8641SAndroid Build Coastguard Worker
339*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> root2 = JSONReader::Read(
340*635a8641SAndroid Build Coastguard Worker "{\"number\":9.87654321, \"null\":null , \"\\x53\" : \"str\", }",
341*635a8641SAndroid Build Coastguard Worker JSON_ALLOW_TRAILING_COMMAS);
342*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root2);
343*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(dict_val->Equals(root2.get()));
344*635a8641SAndroid Build Coastguard Worker
345*635a8641SAndroid Build Coastguard Worker // Test newline equivalence.
346*635a8641SAndroid Build Coastguard Worker root2 = JSONReader::Read(
347*635a8641SAndroid Build Coastguard Worker "{\n"
348*635a8641SAndroid Build Coastguard Worker " \"number\":9.87654321,\n"
349*635a8641SAndroid Build Coastguard Worker " \"null\":null,\n"
350*635a8641SAndroid Build Coastguard Worker " \"\\x53\":\"str\",\n"
351*635a8641SAndroid Build Coastguard Worker "}\n",
352*635a8641SAndroid Build Coastguard Worker JSON_ALLOW_TRAILING_COMMAS);
353*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root2);
354*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(dict_val->Equals(root2.get()));
355*635a8641SAndroid Build Coastguard Worker
356*635a8641SAndroid Build Coastguard Worker root2 = JSONReader::Read(
357*635a8641SAndroid Build Coastguard Worker "{\r\n"
358*635a8641SAndroid Build Coastguard Worker " \"number\":9.87654321,\r\n"
359*635a8641SAndroid Build Coastguard Worker " \"null\":null,\r\n"
360*635a8641SAndroid Build Coastguard Worker " \"\\x53\":\"str\",\r\n"
361*635a8641SAndroid Build Coastguard Worker "}\r\n",
362*635a8641SAndroid Build Coastguard Worker JSON_ALLOW_TRAILING_COMMAS);
363*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root2);
364*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(dict_val->Equals(root2.get()));
365*635a8641SAndroid Build Coastguard Worker }
366*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,NestedDictionaries)367*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, NestedDictionaries) {
368*635a8641SAndroid Build Coastguard Worker std::unique_ptr<DictionaryValue> dict_val =
369*635a8641SAndroid Build Coastguard Worker DictionaryValue::From(JSONReader::Read(
370*635a8641SAndroid Build Coastguard Worker "{\"inner\":{\"array\":[true]},\"false\":false,\"d\":{}}"));
371*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(dict_val);
372*635a8641SAndroid Build Coastguard Worker DictionaryValue* inner_dict = nullptr;
373*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(dict_val->GetDictionary("inner", &inner_dict));
374*635a8641SAndroid Build Coastguard Worker ListValue* inner_array = nullptr;
375*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(inner_dict->GetList("array", &inner_array));
376*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1U, inner_array->GetSize());
377*635a8641SAndroid Build Coastguard Worker bool bool_value = true;
378*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(dict_val->GetBoolean("false", &bool_value));
379*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(bool_value);
380*635a8641SAndroid Build Coastguard Worker inner_dict = nullptr;
381*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(dict_val->GetDictionary("d", &inner_dict));
382*635a8641SAndroid Build Coastguard Worker
383*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> root2 = JSONReader::Read(
384*635a8641SAndroid Build Coastguard Worker "{\"inner\": {\"array\":[true] , },\"false\":false,\"d\":{},}",
385*635a8641SAndroid Build Coastguard Worker JSON_ALLOW_TRAILING_COMMAS);
386*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(dict_val->Equals(root2.get()));
387*635a8641SAndroid Build Coastguard Worker }
388*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,DictionaryKeysWithPeriods)389*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, DictionaryKeysWithPeriods) {
390*635a8641SAndroid Build Coastguard Worker std::unique_ptr<DictionaryValue> dict_val = DictionaryValue::From(
391*635a8641SAndroid Build Coastguard Worker JSONReader::Read("{\"a.b\":3,\"c\":2,\"d.e.f\":{\"g.h.i.j\":1}}"));
392*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(dict_val);
393*635a8641SAndroid Build Coastguard Worker int integer_value = 0;
394*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(dict_val->GetIntegerWithoutPathExpansion("a.b", &integer_value));
395*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(3, integer_value);
396*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(dict_val->GetIntegerWithoutPathExpansion("c", &integer_value));
397*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2, integer_value);
398*635a8641SAndroid Build Coastguard Worker DictionaryValue* inner_dict = nullptr;
399*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(
400*635a8641SAndroid Build Coastguard Worker dict_val->GetDictionaryWithoutPathExpansion("d.e.f", &inner_dict));
401*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1U, inner_dict->size());
402*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(
403*635a8641SAndroid Build Coastguard Worker inner_dict->GetIntegerWithoutPathExpansion("g.h.i.j", &integer_value));
404*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, integer_value);
405*635a8641SAndroid Build Coastguard Worker
406*635a8641SAndroid Build Coastguard Worker dict_val =
407*635a8641SAndroid Build Coastguard Worker DictionaryValue::From(JSONReader::Read("{\"a\":{\"b\":2},\"a.b\":1}"));
408*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(dict_val);
409*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(dict_val->GetInteger("a.b", &integer_value));
410*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2, integer_value);
411*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(dict_val->GetIntegerWithoutPathExpansion("a.b", &integer_value));
412*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, integer_value);
413*635a8641SAndroid Build Coastguard Worker }
414*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,InvalidDictionaries)415*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, InvalidDictionaries) {
416*635a8641SAndroid Build Coastguard Worker // No closing brace.
417*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader::Read("{\"a\": true"));
418*635a8641SAndroid Build Coastguard Worker
419*635a8641SAndroid Build Coastguard Worker // Keys must be quoted strings.
420*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader::Read("{foo:true}"));
421*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader::Read("{1234: false}"));
422*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader::Read("{:false}"));
423*635a8641SAndroid Build Coastguard Worker
424*635a8641SAndroid Build Coastguard Worker // Trailing comma.
425*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader::Read("{\"a\":true,}"));
426*635a8641SAndroid Build Coastguard Worker
427*635a8641SAndroid Build Coastguard Worker // Too many commas.
428*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader::Read("{\"a\":true,,\"b\":false}"));
429*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader::Read("{\"a\":true,,\"b\":false}",
430*635a8641SAndroid Build Coastguard Worker JSON_ALLOW_TRAILING_COMMAS));
431*635a8641SAndroid Build Coastguard Worker
432*635a8641SAndroid Build Coastguard Worker // No separator.
433*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader::Read("{\"a\" \"b\"}"));
434*635a8641SAndroid Build Coastguard Worker
435*635a8641SAndroid Build Coastguard Worker // Lone comma.
436*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader::Read("{,}"));
437*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader::Read("{,}", JSON_ALLOW_TRAILING_COMMAS));
438*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader::Read("{\"a\":true,,}", JSON_ALLOW_TRAILING_COMMAS));
439*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader::Read("{,\"a\":true}", JSON_ALLOW_TRAILING_COMMAS));
440*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader::Read("{\"a\":true,,\"b\":false}",
441*635a8641SAndroid Build Coastguard Worker JSON_ALLOW_TRAILING_COMMAS));
442*635a8641SAndroid Build Coastguard Worker }
443*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,StackOverflow)444*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, StackOverflow) {
445*635a8641SAndroid Build Coastguard Worker std::string evil(1000000, '[');
446*635a8641SAndroid Build Coastguard Worker evil.append(std::string(1000000, ']'));
447*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader::Read(evil));
448*635a8641SAndroid Build Coastguard Worker
449*635a8641SAndroid Build Coastguard Worker // A few thousand adjacent lists is fine.
450*635a8641SAndroid Build Coastguard Worker std::string not_evil("[");
451*635a8641SAndroid Build Coastguard Worker not_evil.reserve(15010);
452*635a8641SAndroid Build Coastguard Worker for (int i = 0; i < 5000; ++i)
453*635a8641SAndroid Build Coastguard Worker not_evil.append("[],");
454*635a8641SAndroid Build Coastguard Worker not_evil.append("[]]");
455*635a8641SAndroid Build Coastguard Worker std::unique_ptr<ListValue> list = ListValue::From(JSONReader::Read(not_evil));
456*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(list);
457*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(5001U, list->GetSize());
458*635a8641SAndroid Build Coastguard Worker }
459*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,UTF8Input)460*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, UTF8Input) {
461*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> root =
462*635a8641SAndroid Build Coastguard Worker JSONReader().ReadToValue("\"\xe7\xbd\x91\xe9\xa1\xb5\"");
463*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
464*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->is_string());
465*635a8641SAndroid Build Coastguard Worker std::string str_val;
466*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->GetAsString(&str_val));
467*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(L"\x7f51\x9875", UTF8ToWide(str_val));
468*635a8641SAndroid Build Coastguard Worker
469*635a8641SAndroid Build Coastguard Worker std::unique_ptr<DictionaryValue> dict_val =
470*635a8641SAndroid Build Coastguard Worker DictionaryValue::From(JSONReader().ReadToValue(
471*635a8641SAndroid Build Coastguard Worker "{\"path\": \"/tmp/\xc3\xa0\xc3\xa8\xc3\xb2.png\"}"));
472*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(dict_val);
473*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(dict_val->GetString("path", &str_val));
474*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("/tmp/\xC3\xA0\xC3\xA8\xC3\xB2.png", str_val);
475*635a8641SAndroid Build Coastguard Worker }
476*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,InvalidUTF8Input)477*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, InvalidUTF8Input) {
478*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader().ReadToValue("\"345\xb0\xa1\xb0\xa2\""));
479*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader().ReadToValue("\"123\xc0\x81\""));
480*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(JSONReader().ReadToValue("\"abc\xc0\xae\""));
481*635a8641SAndroid Build Coastguard Worker }
482*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,UTF16Escapes)483*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, UTF16Escapes) {
484*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> root = JSONReader().ReadToValue("\"\\u20ac3,14\"");
485*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
486*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->is_string());
487*635a8641SAndroid Build Coastguard Worker std::string str_val;
488*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->GetAsString(&str_val));
489*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(
490*635a8641SAndroid Build Coastguard Worker "\xe2\x82\xac"
491*635a8641SAndroid Build Coastguard Worker "3,14",
492*635a8641SAndroid Build Coastguard Worker str_val);
493*635a8641SAndroid Build Coastguard Worker
494*635a8641SAndroid Build Coastguard Worker root = JSONReader().ReadToValue("\"\\ud83d\\udca9\\ud83d\\udc6c\"");
495*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
496*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->is_string());
497*635a8641SAndroid Build Coastguard Worker str_val.clear();
498*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->GetAsString(&str_val));
499*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("\xf0\x9f\x92\xa9\xf0\x9f\x91\xac", str_val);
500*635a8641SAndroid Build Coastguard Worker }
501*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,InvalidUTF16Escapes)502*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, InvalidUTF16Escapes) {
503*635a8641SAndroid Build Coastguard Worker const char* const cases[] = {
504*635a8641SAndroid Build Coastguard Worker "\"\\u123\"", // Invalid scalar.
505*635a8641SAndroid Build Coastguard Worker "\"\\ud83d\"", // Invalid scalar.
506*635a8641SAndroid Build Coastguard Worker "\"\\u$%@!\"", // Invalid scalar.
507*635a8641SAndroid Build Coastguard Worker "\"\\uzz89\"", // Invalid scalar.
508*635a8641SAndroid Build Coastguard Worker "\"\\ud83d\\udca\"", // Invalid lower surrogate.
509*635a8641SAndroid Build Coastguard Worker "\"\\ud83d\\ud83d\"", // Invalid lower surrogate.
510*635a8641SAndroid Build Coastguard Worker "\"\\ud83d\\uaaaZ\"" // Invalid lower surrogate.
511*635a8641SAndroid Build Coastguard Worker "\"\\ud83foo\"", // No lower surrogate.
512*635a8641SAndroid Build Coastguard Worker "\"\\ud83d\\foo\"" // No lower surrogate.
513*635a8641SAndroid Build Coastguard Worker "\"\\ud83\\foo\"" // Invalid upper surrogate.
514*635a8641SAndroid Build Coastguard Worker "\"\\ud83d\\u1\"" // No lower surrogate.
515*635a8641SAndroid Build Coastguard Worker "\"\\ud83\\u1\"" // Invalid upper surrogate.
516*635a8641SAndroid Build Coastguard Worker };
517*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> root;
518*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(cases); ++i) {
519*635a8641SAndroid Build Coastguard Worker root = JSONReader().ReadToValue(cases[i]);
520*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(root) << cases[i];
521*635a8641SAndroid Build Coastguard Worker }
522*635a8641SAndroid Build Coastguard Worker }
523*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,LiteralRoots)524*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, LiteralRoots) {
525*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> root = JSONReader::Read("null");
526*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
527*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->is_none());
528*635a8641SAndroid Build Coastguard Worker
529*635a8641SAndroid Build Coastguard Worker root = JSONReader::Read("true");
530*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
531*635a8641SAndroid Build Coastguard Worker bool bool_value;
532*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->GetAsBoolean(&bool_value));
533*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(bool_value);
534*635a8641SAndroid Build Coastguard Worker
535*635a8641SAndroid Build Coastguard Worker root = JSONReader::Read("10");
536*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
537*635a8641SAndroid Build Coastguard Worker int integer_value;
538*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->GetAsInteger(&integer_value));
539*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(10, integer_value);
540*635a8641SAndroid Build Coastguard Worker
541*635a8641SAndroid Build Coastguard Worker root = JSONReader::Read("\"root\"");
542*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
543*635a8641SAndroid Build Coastguard Worker std::string str_val;
544*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->GetAsString(&str_val));
545*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("root", str_val);
546*635a8641SAndroid Build Coastguard Worker }
547*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,DISABLED_ReadFromFile)548*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, DISABLED_ReadFromFile) {
549*635a8641SAndroid Build Coastguard Worker FilePath path;
550*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(PathService::Get(base::DIR_TEST_DATA, &path));
551*635a8641SAndroid Build Coastguard Worker path = path.AppendASCII("json");
552*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(base::PathExists(path));
553*635a8641SAndroid Build Coastguard Worker
554*635a8641SAndroid Build Coastguard Worker std::string input;
555*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(ReadFileToString(path.AppendASCII("bom_feff.json"), &input));
556*635a8641SAndroid Build Coastguard Worker
557*635a8641SAndroid Build Coastguard Worker JSONReader reader;
558*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> root(reader.ReadToValue(input));
559*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root) << reader.GetErrorMessage();
560*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(root->is_dict());
561*635a8641SAndroid Build Coastguard Worker }
562*635a8641SAndroid Build Coastguard Worker
563*635a8641SAndroid Build Coastguard Worker // Tests that the root of a JSON object can be deleted safely while its
564*635a8641SAndroid Build Coastguard Worker // children outlive it.
TEST(JSONReaderTest,StringOptimizations)565*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, StringOptimizations) {
566*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> dict_literal_0;
567*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> dict_literal_1;
568*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> dict_string_0;
569*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> dict_string_1;
570*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> list_value_0;
571*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> list_value_1;
572*635a8641SAndroid Build Coastguard Worker
573*635a8641SAndroid Build Coastguard Worker {
574*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> root = JSONReader::Read(
575*635a8641SAndroid Build Coastguard Worker "{"
576*635a8641SAndroid Build Coastguard Worker " \"test\": {"
577*635a8641SAndroid Build Coastguard Worker " \"foo\": true,"
578*635a8641SAndroid Build Coastguard Worker " \"bar\": 3.14,"
579*635a8641SAndroid Build Coastguard Worker " \"baz\": \"bat\","
580*635a8641SAndroid Build Coastguard Worker " \"moo\": \"cow\""
581*635a8641SAndroid Build Coastguard Worker " },"
582*635a8641SAndroid Build Coastguard Worker " \"list\": ["
583*635a8641SAndroid Build Coastguard Worker " \"a\","
584*635a8641SAndroid Build Coastguard Worker " \"b\""
585*635a8641SAndroid Build Coastguard Worker " ]"
586*635a8641SAndroid Build Coastguard Worker "}",
587*635a8641SAndroid Build Coastguard Worker JSON_PARSE_RFC);
588*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
589*635a8641SAndroid Build Coastguard Worker
590*635a8641SAndroid Build Coastguard Worker DictionaryValue* root_dict = nullptr;
591*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root->GetAsDictionary(&root_dict));
592*635a8641SAndroid Build Coastguard Worker
593*635a8641SAndroid Build Coastguard Worker DictionaryValue* dict = nullptr;
594*635a8641SAndroid Build Coastguard Worker ListValue* list = nullptr;
595*635a8641SAndroid Build Coastguard Worker
596*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root_dict->GetDictionary("test", &dict));
597*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root_dict->GetList("list", &list));
598*635a8641SAndroid Build Coastguard Worker
599*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(dict->Remove("foo", &dict_literal_0));
600*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(dict->Remove("bar", &dict_literal_1));
601*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(dict->Remove("baz", &dict_string_0));
602*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(dict->Remove("moo", &dict_string_1));
603*635a8641SAndroid Build Coastguard Worker
604*635a8641SAndroid Build Coastguard Worker ASSERT_EQ(2u, list->GetSize());
605*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(list->Remove(0, &list_value_0));
606*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(list->Remove(0, &list_value_1));
607*635a8641SAndroid Build Coastguard Worker }
608*635a8641SAndroid Build Coastguard Worker
609*635a8641SAndroid Build Coastguard Worker bool b = false;
610*635a8641SAndroid Build Coastguard Worker double d = 0;
611*635a8641SAndroid Build Coastguard Worker std::string s;
612*635a8641SAndroid Build Coastguard Worker
613*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(dict_literal_0->GetAsBoolean(&b));
614*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(b);
615*635a8641SAndroid Build Coastguard Worker
616*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(dict_literal_1->GetAsDouble(&d));
617*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(3.14, d);
618*635a8641SAndroid Build Coastguard Worker
619*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(dict_string_0->GetAsString(&s));
620*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("bat", s);
621*635a8641SAndroid Build Coastguard Worker
622*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(dict_string_1->GetAsString(&s));
623*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("cow", s);
624*635a8641SAndroid Build Coastguard Worker
625*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(list_value_0->GetAsString(&s));
626*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("a", s);
627*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(list_value_1->GetAsString(&s));
628*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("b", s);
629*635a8641SAndroid Build Coastguard Worker }
630*635a8641SAndroid Build Coastguard Worker
631*635a8641SAndroid Build Coastguard Worker // A smattering of invalid JSON designed to test specific portions of the
632*635a8641SAndroid Build Coastguard Worker // parser implementation against buffer overflow. Best run with DCHECKs so
633*635a8641SAndroid Build Coastguard Worker // that the one in NextChar fires.
TEST(JSONReaderTest,InvalidSanity)634*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, InvalidSanity) {
635*635a8641SAndroid Build Coastguard Worker const char* const kInvalidJson[] = {
636*635a8641SAndroid Build Coastguard Worker "/* test *", "{\"foo\"", "{\"foo\":", " [", "\"\\u123g\"", "{\n\"eh:\n}",
637*635a8641SAndroid Build Coastguard Worker };
638*635a8641SAndroid Build Coastguard Worker
639*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(kInvalidJson); ++i) {
640*635a8641SAndroid Build Coastguard Worker JSONReader reader;
641*635a8641SAndroid Build Coastguard Worker LOG(INFO) << "Sanity test " << i << ": <" << kInvalidJson[i] << ">";
642*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(reader.ReadToValue(kInvalidJson[i]));
643*635a8641SAndroid Build Coastguard Worker EXPECT_NE(JSONReader::JSON_NO_ERROR, reader.error_code());
644*635a8641SAndroid Build Coastguard Worker EXPECT_NE("", reader.GetErrorMessage());
645*635a8641SAndroid Build Coastguard Worker }
646*635a8641SAndroid Build Coastguard Worker }
647*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,IllegalTrailingNull)648*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, IllegalTrailingNull) {
649*635a8641SAndroid Build Coastguard Worker const char json[] = { '"', 'n', 'u', 'l', 'l', '"', '\0' };
650*635a8641SAndroid Build Coastguard Worker std::string json_string(json, sizeof(json));
651*635a8641SAndroid Build Coastguard Worker JSONReader reader;
652*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(reader.ReadToValue(json_string));
653*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(JSONReader::JSON_UNEXPECTED_DATA_AFTER_ROOT, reader.error_code());
654*635a8641SAndroid Build Coastguard Worker }
655*635a8641SAndroid Build Coastguard Worker
TEST(JSONReaderTest,MaxNesting)656*635a8641SAndroid Build Coastguard Worker TEST(JSONReaderTest, MaxNesting) {
657*635a8641SAndroid Build Coastguard Worker std::string json(R"({"outer": { "inner": {"foo": true}}})");
658*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Value> root;
659*635a8641SAndroid Build Coastguard Worker root = JSONReader::Read(json, JSON_PARSE_RFC, 3);
660*635a8641SAndroid Build Coastguard Worker ASSERT_FALSE(root);
661*635a8641SAndroid Build Coastguard Worker root = JSONReader::Read(json, JSON_PARSE_RFC, 4);
662*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(root);
663*635a8641SAndroid Build Coastguard Worker }
664*635a8641SAndroid Build Coastguard Worker
665*635a8641SAndroid Build Coastguard Worker } // namespace base
666