OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/json/json_reader.h" | 5 #include "base/json/json_reader.h" |
6 | 6 |
7 #include "base/base_paths.h" | 7 #include "base/base_paths.h" |
8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
| 9 #include "base/logging.h" |
9 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
10 #include "base/path_service.h" | 11 #include "base/path_service.h" |
11 #include "base/string_piece.h" | 12 #include "base/string_piece.h" |
12 #include "base/utf_string_conversions.h" | 13 #include "base/utf_string_conversions.h" |
13 #include "base/values.h" | 14 #include "base/values.h" |
14 #include "build/build_config.h" | 15 #include "build/build_config.h" |
15 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
16 | 17 |
17 namespace base { | 18 namespace base { |
18 | 19 |
19 TEST(JSONReaderTest, Reading) { | 20 TEST(JSONReaderTest, Reading) { |
20 // some whitespace checking | 21 // some whitespace checking |
21 scoped_ptr<Value> root; | 22 scoped_ptr<Value> root; |
22 root.reset(JSONReader().JsonToValue(" null ", false, false)); | 23 root.reset(JSONReader().ReadToValue(" null ")); |
23 ASSERT_TRUE(root.get()); | 24 ASSERT_TRUE(root.get()); |
24 EXPECT_TRUE(root->IsType(Value::TYPE_NULL)); | 25 EXPECT_TRUE(root->IsType(Value::TYPE_NULL)); |
25 | 26 |
26 // Invalid JSON string | 27 // Invalid JSON string |
27 root.reset(JSONReader().JsonToValue("nu", false, false)); | 28 root.reset(JSONReader().ReadToValue("nu")); |
28 EXPECT_FALSE(root.get()); | 29 EXPECT_FALSE(root.get()); |
29 | 30 |
30 // Simple bool | 31 // Simple bool |
31 root.reset(JSONReader().JsonToValue("true ", false, false)); | 32 root.reset(JSONReader().ReadToValue("true ")); |
32 ASSERT_TRUE(root.get()); | 33 ASSERT_TRUE(root.get()); |
33 EXPECT_TRUE(root->IsType(Value::TYPE_BOOLEAN)); | 34 EXPECT_TRUE(root->IsType(Value::TYPE_BOOLEAN)); |
34 | 35 |
35 // Embedded comment | 36 // Embedded comment |
36 root.reset(JSONReader().JsonToValue("/* comment */null", false, false)); | 37 root.reset(JSONReader().ReadToValue("/* comment */null")); |
37 ASSERT_TRUE(root.get()); | 38 ASSERT_TRUE(root.get()); |
38 EXPECT_TRUE(root->IsType(Value::TYPE_NULL)); | 39 EXPECT_TRUE(root->IsType(Value::TYPE_NULL)); |
39 root.reset(JSONReader().JsonToValue("40 /* comment */", false, false)); | 40 root.reset(JSONReader().ReadToValue("40 /* comment */")); |
40 ASSERT_TRUE(root.get()); | 41 ASSERT_TRUE(root.get()); |
41 EXPECT_TRUE(root->IsType(Value::TYPE_INTEGER)); | 42 EXPECT_TRUE(root->IsType(Value::TYPE_INTEGER)); |
42 root.reset(JSONReader().JsonToValue("true // comment", false, false)); | 43 root.reset(JSONReader().ReadToValue("true // comment")); |
43 ASSERT_TRUE(root.get()); | 44 ASSERT_TRUE(root.get()); |
44 EXPECT_TRUE(root->IsType(Value::TYPE_BOOLEAN)); | 45 EXPECT_TRUE(root->IsType(Value::TYPE_BOOLEAN)); |
45 root.reset(JSONReader().JsonToValue("/* comment */\"sample string\"", | 46 root.reset(JSONReader().ReadToValue("/* comment */\"sample string\"")); |
46 false, false)); | |
47 ASSERT_TRUE(root.get()); | 47 ASSERT_TRUE(root.get()); |
48 EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); | 48 EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); |
49 std::string value; | 49 std::string value; |
50 EXPECT_TRUE(root->GetAsString(&value)); | 50 EXPECT_TRUE(root->GetAsString(&value)); |
51 EXPECT_EQ("sample string", value); | 51 EXPECT_EQ("sample string", value); |
| 52 root.reset(JSONReader().ReadToValue("[1, /* comment, 2 ] */ \n 3]")); |
| 53 ASSERT_TRUE(root.get()); |
| 54 ListValue* list = static_cast<ListValue*>(root.get()); |
| 55 EXPECT_EQ(2u, list->GetSize()); |
| 56 int int_val = 0; |
| 57 EXPECT_TRUE(list->GetInteger(0, &int_val)); |
| 58 EXPECT_EQ(1, int_val); |
| 59 EXPECT_TRUE(list->GetInteger(1, &int_val)); |
| 60 EXPECT_EQ(3, int_val); |
| 61 root.reset(JSONReader().ReadToValue("[1, /*a*/2, 3]")); |
| 62 ASSERT_TRUE(root.get()); |
| 63 list = static_cast<ListValue*>(root.get()); |
| 64 EXPECT_EQ(3u, list->GetSize()); |
52 | 65 |
53 // Test number formats | 66 // Test number formats |
54 root.reset(JSONReader().JsonToValue("43", false, false)); | 67 root.reset(JSONReader().ReadToValue("43")); |
55 ASSERT_TRUE(root.get()); | 68 ASSERT_TRUE(root.get()); |
56 EXPECT_TRUE(root->IsType(Value::TYPE_INTEGER)); | 69 EXPECT_TRUE(root->IsType(Value::TYPE_INTEGER)); |
57 int int_val = 0; | |
58 EXPECT_TRUE(root->GetAsInteger(&int_val)); | 70 EXPECT_TRUE(root->GetAsInteger(&int_val)); |
59 EXPECT_EQ(43, int_val); | 71 EXPECT_EQ(43, int_val); |
60 | 72 |
61 // According to RFC4627, oct, hex, and leading zeros are invalid JSON. | 73 // According to RFC4627, oct, hex, and leading zeros are invalid JSON. |
62 root.reset(JSONReader().JsonToValue("043", false, false)); | 74 root.reset(JSONReader().ReadToValue("043")); |
63 EXPECT_FALSE(root.get()); | 75 EXPECT_FALSE(root.get()); |
64 root.reset(JSONReader().JsonToValue("0x43", false, false)); | 76 root.reset(JSONReader().ReadToValue("0x43")); |
65 EXPECT_FALSE(root.get()); | 77 EXPECT_FALSE(root.get()); |
66 root.reset(JSONReader().JsonToValue("00", false, false)); | 78 root.reset(JSONReader().ReadToValue("00")); |
67 EXPECT_FALSE(root.get()); | 79 EXPECT_FALSE(root.get()); |
68 | 80 |
69 // Test 0 (which needs to be special cased because of the leading zero | 81 // Test 0 (which needs to be special cased because of the leading zero |
70 // clause). | 82 // clause). |
71 root.reset(JSONReader().JsonToValue("0", false, false)); | 83 root.reset(JSONReader().ReadToValue("0")); |
72 ASSERT_TRUE(root.get()); | 84 ASSERT_TRUE(root.get()); |
73 EXPECT_TRUE(root->IsType(Value::TYPE_INTEGER)); | 85 EXPECT_TRUE(root->IsType(Value::TYPE_INTEGER)); |
74 int_val = 1; | 86 int_val = 1; |
75 EXPECT_TRUE(root->GetAsInteger(&int_val)); | 87 EXPECT_TRUE(root->GetAsInteger(&int_val)); |
76 EXPECT_EQ(0, int_val); | 88 EXPECT_EQ(0, int_val); |
77 | 89 |
78 // Numbers that overflow ints should succeed, being internally promoted to | 90 // Numbers that overflow ints should succeed, being internally promoted to |
79 // storage as doubles | 91 // storage as doubles |
80 root.reset(JSONReader().JsonToValue("2147483648", false, false)); | 92 root.reset(JSONReader().ReadToValue("2147483648")); |
81 ASSERT_TRUE(root.get()); | 93 ASSERT_TRUE(root.get()); |
82 double double_val; | 94 double double_val; |
83 EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); | 95 EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); |
84 double_val = 0.0; | 96 double_val = 0.0; |
85 EXPECT_TRUE(root->GetAsDouble(&double_val)); | 97 EXPECT_TRUE(root->GetAsDouble(&double_val)); |
86 EXPECT_DOUBLE_EQ(2147483648.0, double_val); | 98 EXPECT_DOUBLE_EQ(2147483648.0, double_val); |
87 root.reset(JSONReader().JsonToValue("-2147483649", false, false)); | 99 root.reset(JSONReader().ReadToValue("-2147483649")); |
88 ASSERT_TRUE(root.get()); | 100 ASSERT_TRUE(root.get()); |
89 EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); | 101 EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); |
90 double_val = 0.0; | 102 double_val = 0.0; |
91 EXPECT_TRUE(root->GetAsDouble(&double_val)); | 103 EXPECT_TRUE(root->GetAsDouble(&double_val)); |
92 EXPECT_DOUBLE_EQ(-2147483649.0, double_val); | 104 EXPECT_DOUBLE_EQ(-2147483649.0, double_val); |
93 | 105 |
94 // Parse a double | 106 // Parse a double |
95 root.reset(JSONReader().JsonToValue("43.1", false, false)); | 107 root.reset(JSONReader().ReadToValue("43.1")); |
96 ASSERT_TRUE(root.get()); | 108 ASSERT_TRUE(root.get()); |
97 EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); | 109 EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); |
98 double_val = 0.0; | 110 double_val = 0.0; |
99 EXPECT_TRUE(root->GetAsDouble(&double_val)); | 111 EXPECT_TRUE(root->GetAsDouble(&double_val)); |
100 EXPECT_DOUBLE_EQ(43.1, double_val); | 112 EXPECT_DOUBLE_EQ(43.1, double_val); |
101 | 113 |
102 root.reset(JSONReader().JsonToValue("4.3e-1", false, false)); | 114 root.reset(JSONReader().ReadToValue("4.3e-1")); |
103 ASSERT_TRUE(root.get()); | 115 ASSERT_TRUE(root.get()); |
104 EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); | 116 EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); |
105 double_val = 0.0; | 117 double_val = 0.0; |
106 EXPECT_TRUE(root->GetAsDouble(&double_val)); | 118 EXPECT_TRUE(root->GetAsDouble(&double_val)); |
107 EXPECT_DOUBLE_EQ(.43, double_val); | 119 EXPECT_DOUBLE_EQ(.43, double_val); |
108 | 120 |
109 root.reset(JSONReader().JsonToValue("2.1e0", false, false)); | 121 root.reset(JSONReader().ReadToValue("2.1e0")); |
110 ASSERT_TRUE(root.get()); | 122 ASSERT_TRUE(root.get()); |
111 EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); | 123 EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); |
112 double_val = 0.0; | 124 double_val = 0.0; |
113 EXPECT_TRUE(root->GetAsDouble(&double_val)); | 125 EXPECT_TRUE(root->GetAsDouble(&double_val)); |
114 EXPECT_DOUBLE_EQ(2.1, double_val); | 126 EXPECT_DOUBLE_EQ(2.1, double_val); |
115 | 127 |
116 root.reset(JSONReader().JsonToValue("2.1e+0001", false, false)); | 128 root.reset(JSONReader().ReadToValue("2.1e+0001")); |
117 ASSERT_TRUE(root.get()); | 129 ASSERT_TRUE(root.get()); |
118 EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); | 130 EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); |
119 double_val = 0.0; | 131 double_val = 0.0; |
120 EXPECT_TRUE(root->GetAsDouble(&double_val)); | 132 EXPECT_TRUE(root->GetAsDouble(&double_val)); |
121 EXPECT_DOUBLE_EQ(21.0, double_val); | 133 EXPECT_DOUBLE_EQ(21.0, double_val); |
122 | 134 |
123 root.reset(JSONReader().JsonToValue("0.01", false, false)); | 135 root.reset(JSONReader().ReadToValue("0.01")); |
124 ASSERT_TRUE(root.get()); | 136 ASSERT_TRUE(root.get()); |
125 EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); | 137 EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); |
126 double_val = 0.0; | 138 double_val = 0.0; |
127 EXPECT_TRUE(root->GetAsDouble(&double_val)); | 139 EXPECT_TRUE(root->GetAsDouble(&double_val)); |
128 EXPECT_DOUBLE_EQ(0.01, double_val); | 140 EXPECT_DOUBLE_EQ(0.01, double_val); |
129 | 141 |
130 root.reset(JSONReader().JsonToValue("1.00", false, false)); | 142 root.reset(JSONReader().ReadToValue("1.00")); |
131 ASSERT_TRUE(root.get()); | 143 ASSERT_TRUE(root.get()); |
132 EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); | 144 EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); |
133 double_val = 0.0; | 145 double_val = 0.0; |
134 EXPECT_TRUE(root->GetAsDouble(&double_val)); | 146 EXPECT_TRUE(root->GetAsDouble(&double_val)); |
135 EXPECT_DOUBLE_EQ(1.0, double_val); | 147 EXPECT_DOUBLE_EQ(1.0, double_val); |
136 | 148 |
137 // Fractional parts must have a digit before and after the decimal point. | 149 // Fractional parts must have a digit before and after the decimal point. |
138 root.reset(JSONReader().JsonToValue("1.", false, false)); | 150 root.reset(JSONReader().ReadToValue("1.")); |
139 EXPECT_FALSE(root.get()); | 151 EXPECT_FALSE(root.get()); |
140 root.reset(JSONReader().JsonToValue(".1", false, false)); | 152 root.reset(JSONReader().ReadToValue(".1")); |
141 EXPECT_FALSE(root.get()); | 153 EXPECT_FALSE(root.get()); |
142 root.reset(JSONReader().JsonToValue("1.e10", false, false)); | 154 root.reset(JSONReader().ReadToValue("1.e10")); |
143 EXPECT_FALSE(root.get()); | 155 EXPECT_FALSE(root.get()); |
144 | 156 |
145 // Exponent must have a digit following the 'e'. | 157 // Exponent must have a digit following the 'e'. |
146 root.reset(JSONReader().JsonToValue("1e", false, false)); | 158 root.reset(JSONReader().ReadToValue("1e")); |
147 EXPECT_FALSE(root.get()); | 159 EXPECT_FALSE(root.get()); |
148 root.reset(JSONReader().JsonToValue("1E", false, false)); | 160 root.reset(JSONReader().ReadToValue("1E")); |
149 EXPECT_FALSE(root.get()); | 161 EXPECT_FALSE(root.get()); |
150 root.reset(JSONReader().JsonToValue("1e1.", false, false)); | 162 root.reset(JSONReader().ReadToValue("1e1.")); |
151 EXPECT_FALSE(root.get()); | 163 EXPECT_FALSE(root.get()); |
152 root.reset(JSONReader().JsonToValue("1e1.0", false, false)); | 164 root.reset(JSONReader().ReadToValue("1e1.0")); |
153 EXPECT_FALSE(root.get()); | 165 EXPECT_FALSE(root.get()); |
154 | 166 |
155 // INF/-INF/NaN are not valid | 167 // INF/-INF/NaN are not valid |
156 root.reset(JSONReader().JsonToValue("1e1000", false, false)); | 168 root.reset(JSONReader().ReadToValue("1e1000")); |
157 EXPECT_FALSE(root.get()); | 169 EXPECT_FALSE(root.get()); |
158 root.reset(JSONReader().JsonToValue("-1e1000", false, false)); | 170 root.reset(JSONReader().ReadToValue("-1e1000")); |
159 EXPECT_FALSE(root.get()); | 171 EXPECT_FALSE(root.get()); |
160 root.reset(JSONReader().JsonToValue("NaN", false, false)); | 172 root.reset(JSONReader().ReadToValue("NaN")); |
161 EXPECT_FALSE(root.get()); | 173 EXPECT_FALSE(root.get()); |
162 root.reset(JSONReader().JsonToValue("nan", false, false)); | 174 root.reset(JSONReader().ReadToValue("nan")); |
163 EXPECT_FALSE(root.get()); | 175 EXPECT_FALSE(root.get()); |
164 root.reset(JSONReader().JsonToValue("inf", false, false)); | 176 root.reset(JSONReader().ReadToValue("inf")); |
165 EXPECT_FALSE(root.get()); | 177 EXPECT_FALSE(root.get()); |
166 | 178 |
167 // Invalid number formats | 179 // Invalid number formats |
168 root.reset(JSONReader().JsonToValue("4.3.1", false, false)); | 180 root.reset(JSONReader().ReadToValue("4.3.1")); |
169 EXPECT_FALSE(root.get()); | 181 EXPECT_FALSE(root.get()); |
170 root.reset(JSONReader().JsonToValue("4e3.1", false, false)); | 182 root.reset(JSONReader().ReadToValue("4e3.1")); |
171 EXPECT_FALSE(root.get()); | 183 EXPECT_FALSE(root.get()); |
172 | 184 |
173 // Test string parser | 185 // Test string parser |
174 root.reset(JSONReader().JsonToValue("\"hello world\"", false, false)); | 186 root.reset(JSONReader().ReadToValue("\"hello world\"")); |
175 ASSERT_TRUE(root.get()); | 187 ASSERT_TRUE(root.get()); |
176 EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); | 188 EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); |
177 std::string str_val; | 189 std::string str_val; |
178 EXPECT_TRUE(root->GetAsString(&str_val)); | 190 EXPECT_TRUE(root->GetAsString(&str_val)); |
179 EXPECT_EQ("hello world", str_val); | 191 EXPECT_EQ("hello world", str_val); |
180 | 192 |
181 // Empty string | 193 // Empty string |
182 root.reset(JSONReader().JsonToValue("\"\"", false, false)); | 194 root.reset(JSONReader().ReadToValue("\"\"")); |
183 ASSERT_TRUE(root.get()); | 195 ASSERT_TRUE(root.get()); |
184 EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); | 196 EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); |
185 str_val.clear(); | 197 str_val.clear(); |
186 EXPECT_TRUE(root->GetAsString(&str_val)); | 198 EXPECT_TRUE(root->GetAsString(&str_val)); |
187 EXPECT_EQ("", str_val); | 199 EXPECT_EQ("", str_val); |
188 | 200 |
189 // Test basic string escapes | 201 // Test basic string escapes |
190 root.reset(JSONReader().JsonToValue("\" \\\"\\\\\\/\\b\\f\\n\\r\\t\\v\"", | 202 root.reset(JSONReader().ReadToValue("\" \\\"\\\\\\/\\b\\f\\n\\r\\t\\v\"")); |
191 false, false)); | |
192 ASSERT_TRUE(root.get()); | 203 ASSERT_TRUE(root.get()); |
193 EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); | 204 EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); |
194 str_val.clear(); | 205 str_val.clear(); |
195 EXPECT_TRUE(root->GetAsString(&str_val)); | 206 EXPECT_TRUE(root->GetAsString(&str_val)); |
196 EXPECT_EQ(" \"\\/\b\f\n\r\t\v", str_val); | 207 EXPECT_EQ(" \"\\/\b\f\n\r\t\v", str_val); |
197 | 208 |
198 // Test hex and unicode escapes including the null character. | 209 // Test hex and unicode escapes including the null character. |
199 root.reset(JSONReader().JsonToValue("\"\\x41\\x00\\u1234\"", false, | 210 root.reset(JSONReader().ReadToValue("\"\\x41\\x00\\u1234\"")); |
200 false)); | |
201 ASSERT_TRUE(root.get()); | 211 ASSERT_TRUE(root.get()); |
202 EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); | 212 EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); |
203 str_val.clear(); | 213 str_val.clear(); |
204 EXPECT_TRUE(root->GetAsString(&str_val)); | 214 EXPECT_TRUE(root->GetAsString(&str_val)); |
205 EXPECT_EQ(std::wstring(L"A\0\x1234", 3), UTF8ToWide(str_val)); | 215 EXPECT_EQ(std::wstring(L"A\0\x1234", 3), UTF8ToWide(str_val)); |
206 | 216 |
207 // Test invalid strings | 217 // Test invalid strings |
208 root.reset(JSONReader().JsonToValue("\"no closing quote", false, false)); | 218 root.reset(JSONReader().ReadToValue("\"no closing quote")); |
209 EXPECT_FALSE(root.get()); | 219 EXPECT_FALSE(root.get()); |
210 root.reset(JSONReader().JsonToValue("\"\\z invalid escape char\"", false, | 220 root.reset(JSONReader().ReadToValue("\"\\z invalid escape char\"")); |
211 false)); | |
212 EXPECT_FALSE(root.get()); | 221 EXPECT_FALSE(root.get()); |
213 root.reset(JSONReader().JsonToValue("\"\\xAQ invalid hex code\"", false, | 222 root.reset(JSONReader().ReadToValue("\"\\xAQ invalid hex code\"")); |
214 false)); | |
215 EXPECT_FALSE(root.get()); | 223 EXPECT_FALSE(root.get()); |
216 root.reset(JSONReader().JsonToValue("not enough hex chars\\x1\"", false, | 224 root.reset(JSONReader().ReadToValue("not enough hex chars\\x1\"")); |
217 false)); | |
218 EXPECT_FALSE(root.get()); | 225 EXPECT_FALSE(root.get()); |
219 root.reset(JSONReader().JsonToValue("\"not enough escape chars\\u123\"", | 226 root.reset(JSONReader().ReadToValue("\"not enough escape chars\\u123\"")); |
220 false, false)); | |
221 EXPECT_FALSE(root.get()); | 227 EXPECT_FALSE(root.get()); |
222 root.reset(JSONReader().JsonToValue("\"extra backslash at end of input\\\"", | 228 root.reset(JSONReader().ReadToValue("\"extra backslash at end of input\\\"")); |
223 false, false)); | |
224 EXPECT_FALSE(root.get()); | 229 EXPECT_FALSE(root.get()); |
225 | 230 |
226 // Basic array | 231 // Basic array |
227 root.reset(JSONReader::Read("[true, false, null]")); | 232 root.reset(JSONReader::Read("[true, false, null]")); |
228 ASSERT_TRUE(root.get()); | 233 ASSERT_TRUE(root.get()); |
229 EXPECT_TRUE(root->IsType(Value::TYPE_LIST)); | 234 EXPECT_TRUE(root->IsType(Value::TYPE_LIST)); |
230 ListValue* list = static_cast<ListValue*>(root.get()); | 235 list = static_cast<ListValue*>(root.get()); |
231 EXPECT_EQ(3U, list->GetSize()); | 236 EXPECT_EQ(3U, list->GetSize()); |
232 | 237 |
233 // Test with trailing comma. Should be parsed the same as above. | 238 // Test with trailing comma. Should be parsed the same as above. |
234 scoped_ptr<Value> root2; | 239 scoped_ptr<Value> root2; |
235 root2.reset(JSONReader::Read("[true, false, null, ]", | 240 root2.reset(JSONReader::Read("[true, false, null, ]", |
236 JSON_ALLOW_TRAILING_COMMAS)); | 241 JSON_ALLOW_TRAILING_COMMAS)); |
237 EXPECT_TRUE(root->Equals(root2.get())); | 242 EXPECT_TRUE(root->Equals(root2.get())); |
238 | 243 |
239 // Empty array | 244 // Empty array |
240 root.reset(JSONReader::Read("[]")); | 245 root.reset(JSONReader::Read("[]")); |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
441 not_evil.append("[],"); | 446 not_evil.append("[],"); |
442 } | 447 } |
443 not_evil.append("[]]"); | 448 not_evil.append("[]]"); |
444 root.reset(JSONReader::Read(not_evil)); | 449 root.reset(JSONReader::Read(not_evil)); |
445 ASSERT_TRUE(root.get()); | 450 ASSERT_TRUE(root.get()); |
446 EXPECT_TRUE(root->IsType(Value::TYPE_LIST)); | 451 EXPECT_TRUE(root->IsType(Value::TYPE_LIST)); |
447 list = static_cast<ListValue*>(root.get()); | 452 list = static_cast<ListValue*>(root.get()); |
448 EXPECT_EQ(5001U, list->GetSize()); | 453 EXPECT_EQ(5001U, list->GetSize()); |
449 | 454 |
450 // Test utf8 encoded input | 455 // Test utf8 encoded input |
451 root.reset(JSONReader().JsonToValue("\"\xe7\xbd\x91\xe9\xa1\xb5\"", | 456 root.reset(JSONReader().ReadToValue("\"\xe7\xbd\x91\xe9\xa1\xb5\"")); |
452 false, false)); | |
453 ASSERT_TRUE(root.get()); | 457 ASSERT_TRUE(root.get()); |
454 EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); | 458 EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); |
455 str_val.clear(); | 459 str_val.clear(); |
456 EXPECT_TRUE(root->GetAsString(&str_val)); | 460 EXPECT_TRUE(root->GetAsString(&str_val)); |
457 EXPECT_EQ(L"\x7f51\x9875", UTF8ToWide(str_val)); | 461 EXPECT_EQ(L"\x7f51\x9875", UTF8ToWide(str_val)); |
458 | 462 |
| 463 root.reset(JSONReader().ReadToValue( |
| 464 "{\"path\": \"/tmp/\xc3\xa0\xc3\xa8\xc3\xb2.png\"}")); |
| 465 ASSERT_TRUE(root.get()); |
| 466 EXPECT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); |
| 467 EXPECT_TRUE(root->GetAsDictionary(&dict_val)); |
| 468 EXPECT_TRUE(dict_val->GetString("path", &str_val)); |
| 469 EXPECT_EQ("/tmp/\xC3\xA0\xC3\xA8\xC3\xB2.png", str_val); |
| 470 |
459 // Test invalid utf8 encoded input | 471 // Test invalid utf8 encoded input |
460 root.reset(JSONReader().JsonToValue("\"345\xb0\xa1\xb0\xa2\"", | 472 root.reset(JSONReader().ReadToValue("\"345\xb0\xa1\xb0\xa2\"")); |
461 false, false)); | |
462 EXPECT_FALSE(root.get()); | 473 EXPECT_FALSE(root.get()); |
463 root.reset(JSONReader().JsonToValue("\"123\xc0\x81\"", | 474 root.reset(JSONReader().ReadToValue("\"123\xc0\x81\"")); |
464 false, false)); | 475 EXPECT_FALSE(root.get()); |
| 476 root.reset(JSONReader().ReadToValue("\"abc\xc0\xae\"")); |
465 EXPECT_FALSE(root.get()); | 477 EXPECT_FALSE(root.get()); |
466 | 478 |
467 // Test utf16 encoded strings. | 479 // Test utf16 encoded strings. |
468 root.reset(JSONReader().JsonToValue("\"\\u20ac3,14\"", false, false)); | 480 root.reset(JSONReader().ReadToValue("\"\\u20ac3,14\"")); |
469 ASSERT_TRUE(root.get()); | 481 ASSERT_TRUE(root.get()); |
470 EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); | 482 EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); |
471 str_val.clear(); | 483 str_val.clear(); |
472 EXPECT_TRUE(root->GetAsString(&str_val)); | 484 EXPECT_TRUE(root->GetAsString(&str_val)); |
473 EXPECT_EQ("\xe2\x82\xac""3,14", str_val); | 485 EXPECT_EQ("\xe2\x82\xac""3,14", str_val); |
474 | 486 |
475 root.reset(JSONReader().JsonToValue("\"\\ud83d\\udca9\\ud83d\\udc6c\"", | 487 root.reset(JSONReader().ReadToValue("\"\\ud83d\\udca9\\ud83d\\udc6c\"")); |
476 false, false)); | |
477 ASSERT_TRUE(root.get()); | 488 ASSERT_TRUE(root.get()); |
478 EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); | 489 EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); |
479 str_val.clear(); | 490 str_val.clear(); |
480 EXPECT_TRUE(root->GetAsString(&str_val)); | 491 EXPECT_TRUE(root->GetAsString(&str_val)); |
481 EXPECT_EQ("\xf0\x9f\x92\xa9\xf0\x9f\x91\xac", str_val); | 492 EXPECT_EQ("\xf0\x9f\x92\xa9\xf0\x9f\x91\xac", str_val); |
482 | 493 |
483 // Test invalid utf16 strings. | 494 // Test invalid utf16 strings. |
484 const char* cases[] = { | 495 const char* cases[] = { |
485 "\"\\u123\"", // Invalid scalar. | 496 "\"\\u123\"", // Invalid scalar. |
486 "\"\\ud83d\"", // Invalid scalar. | 497 "\"\\ud83d\"", // Invalid scalar. |
487 "\"\\u$%@!\"", // Invalid scalar. | 498 "\"\\u$%@!\"", // Invalid scalar. |
488 "\"\\uzz89\"", // Invalid scalar. | 499 "\"\\uzz89\"", // Invalid scalar. |
489 "\"\\ud83d\\udca\"", // Invalid lower surrogate. | 500 "\"\\ud83d\\udca\"", // Invalid lower surrogate. |
490 "\"\\ud83d\\ud83d\"", // Invalid lower surrogate. | 501 "\"\\ud83d\\ud83d\"", // Invalid lower surrogate. |
491 "\"\\ud83foo\"", // No lower surrogate. | 502 "\"\\ud83foo\"", // No lower surrogate. |
492 "\"\\ud83\\foo\"" // No lower surrogate. | 503 "\"\\ud83\\foo\"" // No lower surrogate. |
493 }; | 504 }; |
494 for (size_t i = 0; i < arraysize(cases); ++i) { | 505 for (size_t i = 0; i < arraysize(cases); ++i) { |
495 root.reset(JSONReader().JsonToValue(cases[i], false, false)); | 506 root.reset(JSONReader().ReadToValue(cases[i])); |
496 EXPECT_FALSE(root.get()) << cases[i]; | 507 EXPECT_FALSE(root.get()) << cases[i]; |
497 } | 508 } |
| 509 |
| 510 // Test literal root objects. |
| 511 root.reset(JSONReader::Read("null")); |
| 512 EXPECT_TRUE(root->IsType(Value::TYPE_NULL)); |
| 513 |
| 514 root.reset(JSONReader::Read("true")); |
| 515 ASSERT_TRUE(root.get()); |
| 516 EXPECT_TRUE(root->GetAsBoolean(&bool_value)); |
| 517 EXPECT_TRUE(bool_value); |
| 518 |
| 519 root.reset(JSONReader::Read("10")); |
| 520 ASSERT_TRUE(root.get()); |
| 521 EXPECT_TRUE(root->GetAsInteger(&integer_value)); |
| 522 EXPECT_EQ(10, integer_value); |
| 523 |
| 524 root.reset(JSONReader::Read("\"root\"")); |
| 525 ASSERT_TRUE(root.get()); |
| 526 EXPECT_TRUE(root->GetAsString(&str_val)); |
| 527 EXPECT_EQ("root", str_val); |
498 } | 528 } |
499 | 529 |
500 TEST(JSONReaderTest, ReadFromFile) { | 530 TEST(JSONReaderTest, ReadFromFile) { |
501 FilePath path; | 531 FilePath path; |
502 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &path)); | 532 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &path)); |
503 path = path.Append(FILE_PATH_LITERAL("base")) | 533 path = path.Append(FILE_PATH_LITERAL("base")) |
504 .Append(FILE_PATH_LITERAL("data")) | 534 .Append(FILE_PATH_LITERAL("data")) |
505 .Append(FILE_PATH_LITERAL("json")); | 535 .Append(FILE_PATH_LITERAL("json")); |
506 | 536 |
507 std::string input; | 537 std::string input; |
508 ASSERT_TRUE(file_util::ReadFileToString( | 538 ASSERT_TRUE(file_util::ReadFileToString( |
509 path.Append(FILE_PATH_LITERAL("bom_feff.json")), &input)); | 539 path.Append(FILE_PATH_LITERAL("bom_feff.json")), &input)); |
510 | 540 |
511 JSONReader reader; | 541 JSONReader reader; |
512 std::string error_msg; | 542 scoped_ptr<Value> root(reader.ReadToValue(input)); |
513 scoped_ptr<Value> root( | |
514 JSONReader::ReadAndReturnError(input, JSON_PARSE_RFC, NULL, &error_msg)); | |
515 ASSERT_TRUE(root.get()) << reader.GetErrorMessage(); | 543 ASSERT_TRUE(root.get()) << reader.GetErrorMessage(); |
516 EXPECT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); | 544 EXPECT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); |
517 } | 545 } |
518 | 546 |
519 TEST(JSONReaderTest, ErrorMessages) { | 547 // Tests that the root of a JSON object can be deleted safely while its |
520 // Error strings should not be modified in case of success. | 548 // children outlive it. |
521 std::string error_message; | 549 TEST(JSONReaderTest, StringOptimizations) { |
522 int error_code = 0; | 550 Value* dict_literals[2] = {0}; |
523 scoped_ptr<Value> root; | 551 Value* dict_strings[2] = {0}; |
524 root.reset(JSONReader::ReadAndReturnError("[42]", JSON_PARSE_RFC, | 552 Value* list_values[2] = {0}; |
525 &error_code, &error_message)); | |
526 EXPECT_TRUE(error_message.empty()); | |
527 EXPECT_EQ(0, error_code); | |
528 | 553 |
529 // Test line and column counting | 554 { |
530 const char* big_json = "[\n0,\n1,\n2,\n3,4,5,6 7,\n8,\n9\n]"; | 555 scoped_ptr<Value> root(JSONReader::Read( |
531 // error here --------------------------------^ | 556 "{" |
532 root.reset(JSONReader::ReadAndReturnError(big_json, JSON_PARSE_RFC, | 557 " \"test\": {" |
533 &error_code, &error_message)); | 558 " \"foo\": true," |
534 EXPECT_FALSE(root.get()); | 559 " \"bar\": 3.14," |
535 EXPECT_EQ(JSONReader::FormatErrorMessage(5, 9, JSONReader::kSyntaxError), | 560 " \"baz\": \"bat\"," |
536 error_message); | 561 " \"moo\": \"cow\"" |
537 EXPECT_EQ(JSONReader::JSON_SYNTAX_ERROR, error_code); | 562 " }," |
| 563 " \"list\": [" |
| 564 " \"a\"," |
| 565 " \"b\"" |
| 566 " ]" |
| 567 "}", JSON_DETACHABLE_CHILDREN)); |
| 568 ASSERT_TRUE(root.get()); |
538 | 569 |
539 // Test each of the error conditions | 570 DictionaryValue* root_dict = NULL; |
540 root.reset(JSONReader::ReadAndReturnError("{},{}", JSON_PARSE_RFC, | 571 ASSERT_TRUE(root->GetAsDictionary(&root_dict)); |
541 &error_code, &error_message)); | |
542 EXPECT_FALSE(root.get()); | |
543 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 3, | |
544 JSONReader::kUnexpectedDataAfterRoot), error_message); | |
545 EXPECT_EQ(JSONReader::JSON_UNEXPECTED_DATA_AFTER_ROOT, error_code); | |
546 | 572 |
547 std::string nested_json; | 573 DictionaryValue* dict = NULL; |
548 for (int i = 0; i < 101; ++i) { | 574 ListValue* list = NULL; |
549 nested_json.insert(nested_json.begin(), '['); | 575 |
550 nested_json.append(1, ']'); | 576 ASSERT_TRUE(root_dict->GetDictionary("test", &dict)); |
| 577 ASSERT_TRUE(root_dict->GetList("list", &list)); |
| 578 |
| 579 EXPECT_TRUE(dict->Remove("foo", &dict_literals[0])); |
| 580 EXPECT_TRUE(dict->Remove("bar", &dict_literals[1])); |
| 581 EXPECT_TRUE(dict->Remove("baz", &dict_strings[0])); |
| 582 EXPECT_TRUE(dict->Remove("moo", &dict_strings[1])); |
| 583 |
| 584 ASSERT_EQ(2u, list->GetSize()); |
| 585 EXPECT_TRUE(list->Remove(0, &list_values[0])); |
| 586 EXPECT_TRUE(list->Remove(0, &list_values[1])); |
551 } | 587 } |
552 root.reset(JSONReader::ReadAndReturnError(nested_json, JSON_PARSE_RFC, | |
553 &error_code, &error_message)); | |
554 EXPECT_FALSE(root.get()); | |
555 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 101, JSONReader::kTooMuchNesting), | |
556 error_message); | |
557 EXPECT_EQ(JSONReader::JSON_TOO_MUCH_NESTING, error_code); | |
558 | 588 |
559 root.reset(JSONReader::ReadAndReturnError("[1,]", JSON_PARSE_RFC, | 589 bool b = false; |
560 &error_code, &error_message)); | 590 double d = 0; |
561 EXPECT_FALSE(root.get()); | 591 std::string s; |
562 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 4, JSONReader::kTrailingComma), | |
563 error_message); | |
564 EXPECT_EQ(JSONReader::JSON_TRAILING_COMMA, error_code); | |
565 | 592 |
566 root.reset(JSONReader::ReadAndReturnError("{foo:\"bar\"}", JSON_PARSE_RFC, | 593 EXPECT_TRUE(dict_literals[0]->GetAsBoolean(&b)); |
567 &error_code, &error_message)); | 594 EXPECT_TRUE(b); |
568 EXPECT_FALSE(root.get()); | |
569 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 2, | |
570 JSONReader::kUnquotedDictionaryKey), error_message); | |
571 EXPECT_EQ(JSONReader::JSON_UNQUOTED_DICTIONARY_KEY, error_code); | |
572 | 595 |
573 root.reset(JSONReader::ReadAndReturnError("{\"foo\":\"bar\",}", | 596 EXPECT_TRUE(dict_literals[1]->GetAsDouble(&d)); |
574 JSON_PARSE_RFC, | 597 EXPECT_EQ(3.14, d); |
575 &error_code, | |
576 &error_message)); | |
577 EXPECT_FALSE(root.get()); | |
578 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 14, JSONReader::kTrailingComma), | |
579 error_message); | |
580 | 598 |
581 root.reset(JSONReader::ReadAndReturnError("[nu]", JSON_PARSE_RFC, | 599 EXPECT_TRUE(dict_strings[0]->GetAsString(&s)); |
582 &error_code, &error_message)); | 600 EXPECT_EQ("bat", s); |
583 EXPECT_FALSE(root.get()); | |
584 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 2, JSONReader::kSyntaxError), | |
585 error_message); | |
586 EXPECT_EQ(JSONReader::JSON_SYNTAX_ERROR, error_code); | |
587 | 601 |
588 root.reset(JSONReader::ReadAndReturnError("[\"xxx\\xq\"]", JSON_PARSE_RFC, | 602 EXPECT_TRUE(dict_strings[1]->GetAsString(&s)); |
589 &error_code, &error_message)); | 603 EXPECT_EQ("cow", s); |
590 EXPECT_FALSE(root.get()); | |
591 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape), | |
592 error_message); | |
593 EXPECT_EQ(JSONReader::JSON_INVALID_ESCAPE, error_code); | |
594 | 604 |
595 root.reset(JSONReader::ReadAndReturnError("[\"xxx\\uq\"]", JSON_PARSE_RFC, | 605 EXPECT_TRUE(list_values[0]->GetAsString(&s)); |
596 &error_code, &error_message)); | 606 EXPECT_EQ("a", s); |
597 EXPECT_FALSE(root.get()); | 607 EXPECT_TRUE(list_values[1]->GetAsString(&s)); |
598 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape), | 608 EXPECT_EQ("b", s); |
599 error_message); | |
600 EXPECT_EQ(JSONReader::JSON_INVALID_ESCAPE, error_code); | |
601 | 609 |
602 root.reset(JSONReader::ReadAndReturnError("[\"xxx\\q\"]", JSON_PARSE_RFC, | 610 delete dict_literals[0]; |
603 &error_code, &error_message)); | 611 delete dict_literals[1]; |
604 EXPECT_FALSE(root.get()); | 612 delete dict_strings[0]; |
605 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape), | 613 delete dict_strings[1]; |
606 error_message); | 614 delete list_values[0]; |
607 EXPECT_EQ(JSONReader::JSON_INVALID_ESCAPE, error_code); | 615 delete list_values[1]; |
| 616 } |
| 617 |
| 618 // A smattering of invalid JSON designed to test specific portions of the |
| 619 // parser implementation against buffer overflow. Best run with DCHECKs so |
| 620 // that the one in NextChar fires. |
| 621 TEST(JSONReaderTest, InvalidSanity) { |
| 622 const char* invalid_json[] = { |
| 623 "/* test *", |
| 624 "{\"foo\"", |
| 625 "{\"foo\":", |
| 626 " [", |
| 627 "\"\\u123g\"", |
| 628 "{\n\"eh:\n}", |
| 629 }; |
| 630 |
| 631 for (size_t i = 0; i < arraysize(invalid_json); ++i) { |
| 632 JSONReader reader; |
| 633 LOG(INFO) << "Sanity test " << i << ": <" << invalid_json[i] << ">"; |
| 634 EXPECT_FALSE(reader.ReadToValue(invalid_json[i])); |
| 635 EXPECT_NE(JSONReader::JSON_NO_ERROR, reader.error_code()); |
| 636 EXPECT_NE("", reader.GetErrorMessage()); |
| 637 } |
| 638 } |
| 639 |
| 640 TEST(JSONReaderTest, IllegalTrailingNull) { |
| 641 const char json[] = { '"', 'n', 'u', 'l', 'l', '"', '\0' }; |
| 642 std::string json_string(json, sizeof(json)); |
| 643 JSONReader reader; |
| 644 EXPECT_FALSE(reader.ReadToValue(json_string)); |
| 645 EXPECT_EQ(JSONReader::JSON_UNEXPECTED_DATA_AFTER_ROOT, reader.error_code()); |
608 } | 646 } |
609 | 647 |
610 } // namespace base | 648 } // namespace base |
OLD | NEW |