| 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/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/path_service.h" | 10 #include "base/path_service.h" |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 217 false)); | 217 false)); |
| 218 EXPECT_FALSE(root.get()); | 218 EXPECT_FALSE(root.get()); |
| 219 root.reset(JSONReader().JsonToValue("\"not enough escape chars\\u123\"", | 219 root.reset(JSONReader().JsonToValue("\"not enough escape chars\\u123\"", |
| 220 false, false)); | 220 false, false)); |
| 221 EXPECT_FALSE(root.get()); | 221 EXPECT_FALSE(root.get()); |
| 222 root.reset(JSONReader().JsonToValue("\"extra backslash at end of input\\\"", | 222 root.reset(JSONReader().JsonToValue("\"extra backslash at end of input\\\"", |
| 223 false, false)); | 223 false, false)); |
| 224 EXPECT_FALSE(root.get()); | 224 EXPECT_FALSE(root.get()); |
| 225 | 225 |
| 226 // Basic array | 226 // Basic array |
| 227 root.reset(JSONReader::Read("[true, false, null]", false)); | 227 root.reset(JSONReader::Read("[true, false, null]")); |
| 228 ASSERT_TRUE(root.get()); | 228 ASSERT_TRUE(root.get()); |
| 229 EXPECT_TRUE(root->IsType(Value::TYPE_LIST)); | 229 EXPECT_TRUE(root->IsType(Value::TYPE_LIST)); |
| 230 ListValue* list = static_cast<ListValue*>(root.get()); | 230 ListValue* list = static_cast<ListValue*>(root.get()); |
| 231 EXPECT_EQ(3U, list->GetSize()); | 231 EXPECT_EQ(3U, list->GetSize()); |
| 232 | 232 |
| 233 // Test with trailing comma. Should be parsed the same as above. | 233 // Test with trailing comma. Should be parsed the same as above. |
| 234 scoped_ptr<Value> root2; | 234 scoped_ptr<Value> root2; |
| 235 root2.reset(JSONReader::Read("[true, false, null, ]", true)); | 235 root2.reset(JSONReader::Read("[true, false, null, ]", |
| 236 JSON_ALLOW_TRAILING_COMMAS)); |
| 236 EXPECT_TRUE(root->Equals(root2.get())); | 237 EXPECT_TRUE(root->Equals(root2.get())); |
| 237 | 238 |
| 238 // Empty array | 239 // Empty array |
| 239 root.reset(JSONReader::Read("[]", false)); | 240 root.reset(JSONReader::Read("[]")); |
| 240 ASSERT_TRUE(root.get()); | 241 ASSERT_TRUE(root.get()); |
| 241 EXPECT_TRUE(root->IsType(Value::TYPE_LIST)); | 242 EXPECT_TRUE(root->IsType(Value::TYPE_LIST)); |
| 242 list = static_cast<ListValue*>(root.get()); | 243 list = static_cast<ListValue*>(root.get()); |
| 243 EXPECT_EQ(0U, list->GetSize()); | 244 EXPECT_EQ(0U, list->GetSize()); |
| 244 | 245 |
| 245 // Nested arrays | 246 // Nested arrays |
| 246 root.reset(JSONReader::Read("[[true], [], [false, [], [null]], null]", | 247 root.reset(JSONReader::Read("[[true], [], [false, [], [null]], null]")); |
| 247 false)); | |
| 248 ASSERT_TRUE(root.get()); | 248 ASSERT_TRUE(root.get()); |
| 249 EXPECT_TRUE(root->IsType(Value::TYPE_LIST)); | 249 EXPECT_TRUE(root->IsType(Value::TYPE_LIST)); |
| 250 list = static_cast<ListValue*>(root.get()); | 250 list = static_cast<ListValue*>(root.get()); |
| 251 EXPECT_EQ(4U, list->GetSize()); | 251 EXPECT_EQ(4U, list->GetSize()); |
| 252 | 252 |
| 253 // Lots of trailing commas. | 253 // Lots of trailing commas. |
| 254 root2.reset(JSONReader::Read("[[true], [], [false, [], [null, ] , ], null,]", | 254 root2.reset(JSONReader::Read("[[true], [], [false, [], [null, ] , ], null,]", |
| 255 true)); | 255 JSON_ALLOW_TRAILING_COMMAS)); |
| 256 EXPECT_TRUE(root->Equals(root2.get())); | 256 EXPECT_TRUE(root->Equals(root2.get())); |
| 257 | 257 |
| 258 // Invalid, missing close brace. | 258 // Invalid, missing close brace. |
| 259 root.reset(JSONReader::Read("[[true], [], [false, [], [null]], null", false)); | 259 root.reset(JSONReader::Read("[[true], [], [false, [], [null]], null")); |
| 260 EXPECT_FALSE(root.get()); | 260 EXPECT_FALSE(root.get()); |
| 261 | 261 |
| 262 // Invalid, too many commas | 262 // Invalid, too many commas |
| 263 root.reset(JSONReader::Read("[true,, null]", false)); | 263 root.reset(JSONReader::Read("[true,, null]")); |
| 264 EXPECT_FALSE(root.get()); | 264 EXPECT_FALSE(root.get()); |
| 265 root.reset(JSONReader::Read("[true,, null]", true)); | 265 root.reset(JSONReader::Read("[true,, null]", JSON_ALLOW_TRAILING_COMMAS)); |
| 266 EXPECT_FALSE(root.get()); | 266 EXPECT_FALSE(root.get()); |
| 267 | 267 |
| 268 // Invalid, no commas | 268 // Invalid, no commas |
| 269 root.reset(JSONReader::Read("[true null]", false)); | 269 root.reset(JSONReader::Read("[true null]")); |
| 270 EXPECT_FALSE(root.get()); | 270 EXPECT_FALSE(root.get()); |
| 271 | 271 |
| 272 // Invalid, trailing comma | 272 // Invalid, trailing comma |
| 273 root.reset(JSONReader::Read("[true,]", false)); | 273 root.reset(JSONReader::Read("[true,]")); |
| 274 EXPECT_FALSE(root.get()); | 274 EXPECT_FALSE(root.get()); |
| 275 | 275 |
| 276 // Valid if we set |allow_trailing_comma| to true. | 276 // Valid if we set |allow_trailing_comma| to true. |
| 277 root.reset(JSONReader::Read("[true,]", true)); | 277 root.reset(JSONReader::Read("[true,]", JSON_ALLOW_TRAILING_COMMAS)); |
| 278 ASSERT_TRUE(root.get()); | 278 ASSERT_TRUE(root.get()); |
| 279 EXPECT_TRUE(root->IsType(Value::TYPE_LIST)); | 279 EXPECT_TRUE(root->IsType(Value::TYPE_LIST)); |
| 280 list = static_cast<ListValue*>(root.get()); | 280 list = static_cast<ListValue*>(root.get()); |
| 281 EXPECT_EQ(1U, list->GetSize()); | 281 EXPECT_EQ(1U, list->GetSize()); |
| 282 Value* tmp_value = NULL; | 282 Value* tmp_value = NULL; |
| 283 ASSERT_TRUE(list->Get(0, &tmp_value)); | 283 ASSERT_TRUE(list->Get(0, &tmp_value)); |
| 284 EXPECT_TRUE(tmp_value->IsType(Value::TYPE_BOOLEAN)); | 284 EXPECT_TRUE(tmp_value->IsType(Value::TYPE_BOOLEAN)); |
| 285 bool bool_value = false; | 285 bool bool_value = false; |
| 286 EXPECT_TRUE(tmp_value->GetAsBoolean(&bool_value)); | 286 EXPECT_TRUE(tmp_value->GetAsBoolean(&bool_value)); |
| 287 EXPECT_TRUE(bool_value); | 287 EXPECT_TRUE(bool_value); |
| 288 | 288 |
| 289 // Don't allow empty elements, even if |allow_trailing_comma| is | 289 // Don't allow empty elements, even if |allow_trailing_comma| is |
| 290 // true. | 290 // true. |
| 291 root.reset(JSONReader::Read("[,]", true)); | 291 root.reset(JSONReader::Read("[,]", JSON_ALLOW_TRAILING_COMMAS)); |
| 292 EXPECT_FALSE(root.get()); | 292 EXPECT_FALSE(root.get()); |
| 293 root.reset(JSONReader::Read("[true,,]", true)); | 293 root.reset(JSONReader::Read("[true,,]", JSON_ALLOW_TRAILING_COMMAS)); |
| 294 EXPECT_FALSE(root.get()); | 294 EXPECT_FALSE(root.get()); |
| 295 root.reset(JSONReader::Read("[,true,]", true)); | 295 root.reset(JSONReader::Read("[,true,]", JSON_ALLOW_TRAILING_COMMAS)); |
| 296 EXPECT_FALSE(root.get()); | 296 EXPECT_FALSE(root.get()); |
| 297 root.reset(JSONReader::Read("[true,,false]", true)); | 297 root.reset(JSONReader::Read("[true,,false]", JSON_ALLOW_TRAILING_COMMAS)); |
| 298 EXPECT_FALSE(root.get()); | 298 EXPECT_FALSE(root.get()); |
| 299 | 299 |
| 300 // Test objects | 300 // Test objects |
| 301 root.reset(JSONReader::Read("{}", false)); | 301 root.reset(JSONReader::Read("{}")); |
| 302 ASSERT_TRUE(root.get()); | 302 ASSERT_TRUE(root.get()); |
| 303 EXPECT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); | 303 EXPECT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); |
| 304 | 304 |
| 305 root.reset(JSONReader::Read( | 305 root.reset(JSONReader::Read( |
| 306 "{\"number\":9.87654321, \"null\":null , \"\\x53\" : \"str\" }", false)); | 306 "{\"number\":9.87654321, \"null\":null , \"\\x53\" : \"str\" }")); |
| 307 ASSERT_TRUE(root.get()); | 307 ASSERT_TRUE(root.get()); |
| 308 EXPECT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); | 308 EXPECT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); |
| 309 DictionaryValue* dict_val = static_cast<DictionaryValue*>(root.get()); | 309 DictionaryValue* dict_val = static_cast<DictionaryValue*>(root.get()); |
| 310 double_val = 0.0; | 310 double_val = 0.0; |
| 311 EXPECT_TRUE(dict_val->GetDouble("number", &double_val)); | 311 EXPECT_TRUE(dict_val->GetDouble("number", &double_val)); |
| 312 EXPECT_DOUBLE_EQ(9.87654321, double_val); | 312 EXPECT_DOUBLE_EQ(9.87654321, double_val); |
| 313 Value* null_val = NULL; | 313 Value* null_val = NULL; |
| 314 ASSERT_TRUE(dict_val->Get("null", &null_val)); | 314 ASSERT_TRUE(dict_val->Get("null", &null_val)); |
| 315 EXPECT_TRUE(null_val->IsType(Value::TYPE_NULL)); | 315 EXPECT_TRUE(null_val->IsType(Value::TYPE_NULL)); |
| 316 str_val.clear(); | 316 str_val.clear(); |
| 317 EXPECT_TRUE(dict_val->GetString("S", &str_val)); | 317 EXPECT_TRUE(dict_val->GetString("S", &str_val)); |
| 318 EXPECT_EQ("str", str_val); | 318 EXPECT_EQ("str", str_val); |
| 319 | 319 |
| 320 root2.reset(JSONReader::Read( | 320 root2.reset(JSONReader::Read( |
| 321 "{\"number\":9.87654321, \"null\":null , \"\\x53\" : \"str\", }", true)); | 321 "{\"number\":9.87654321, \"null\":null , \"\\x53\" : \"str\", }", |
| 322 JSON_ALLOW_TRAILING_COMMAS)); |
| 322 ASSERT_TRUE(root2.get()); | 323 ASSERT_TRUE(root2.get()); |
| 323 EXPECT_TRUE(root->Equals(root2.get())); | 324 EXPECT_TRUE(root->Equals(root2.get())); |
| 324 | 325 |
| 325 // Test newline equivalence. | 326 // Test newline equivalence. |
| 326 root2.reset(JSONReader::Read( | 327 root2.reset(JSONReader::Read( |
| 327 "{\n" | 328 "{\n" |
| 328 " \"number\":9.87654321,\n" | 329 " \"number\":9.87654321,\n" |
| 329 " \"null\":null,\n" | 330 " \"null\":null,\n" |
| 330 " \"\\x53\":\"str\",\n" | 331 " \"\\x53\":\"str\",\n" |
| 331 "}\n", true)); | 332 "}\n", JSON_ALLOW_TRAILING_COMMAS)); |
| 332 ASSERT_TRUE(root2.get()); | 333 ASSERT_TRUE(root2.get()); |
| 333 EXPECT_TRUE(root->Equals(root2.get())); | 334 EXPECT_TRUE(root->Equals(root2.get())); |
| 334 | 335 |
| 335 root2.reset(JSONReader::Read( | 336 root2.reset(JSONReader::Read( |
| 336 "{\r\n" | 337 "{\r\n" |
| 337 " \"number\":9.87654321,\r\n" | 338 " \"number\":9.87654321,\r\n" |
| 338 " \"null\":null,\r\n" | 339 " \"null\":null,\r\n" |
| 339 " \"\\x53\":\"str\",\r\n" | 340 " \"\\x53\":\"str\",\r\n" |
| 340 "}\r\n", true)); | 341 "}\r\n", JSON_ALLOW_TRAILING_COMMAS)); |
| 341 ASSERT_TRUE(root2.get()); | 342 ASSERT_TRUE(root2.get()); |
| 342 EXPECT_TRUE(root->Equals(root2.get())); | 343 EXPECT_TRUE(root->Equals(root2.get())); |
| 343 | 344 |
| 344 // Test nesting | 345 // Test nesting |
| 345 root.reset(JSONReader::Read( | 346 root.reset(JSONReader::Read( |
| 346 "{\"inner\":{\"array\":[true]},\"false\":false,\"d\":{}}", false)); | 347 "{\"inner\":{\"array\":[true]},\"false\":false,\"d\":{}}")); |
| 347 ASSERT_TRUE(root.get()); | 348 ASSERT_TRUE(root.get()); |
| 348 EXPECT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); | 349 EXPECT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); |
| 349 dict_val = static_cast<DictionaryValue*>(root.get()); | 350 dict_val = static_cast<DictionaryValue*>(root.get()); |
| 350 DictionaryValue* inner_dict = NULL; | 351 DictionaryValue* inner_dict = NULL; |
| 351 ASSERT_TRUE(dict_val->GetDictionary("inner", &inner_dict)); | 352 ASSERT_TRUE(dict_val->GetDictionary("inner", &inner_dict)); |
| 352 ListValue* inner_array = NULL; | 353 ListValue* inner_array = NULL; |
| 353 ASSERT_TRUE(inner_dict->GetList("array", &inner_array)); | 354 ASSERT_TRUE(inner_dict->GetList("array", &inner_array)); |
| 354 EXPECT_EQ(1U, inner_array->GetSize()); | 355 EXPECT_EQ(1U, inner_array->GetSize()); |
| 355 bool_value = true; | 356 bool_value = true; |
| 356 EXPECT_TRUE(dict_val->GetBoolean("false", &bool_value)); | 357 EXPECT_TRUE(dict_val->GetBoolean("false", &bool_value)); |
| 357 EXPECT_FALSE(bool_value); | 358 EXPECT_FALSE(bool_value); |
| 358 inner_dict = NULL; | 359 inner_dict = NULL; |
| 359 EXPECT_TRUE(dict_val->GetDictionary("d", &inner_dict)); | 360 EXPECT_TRUE(dict_val->GetDictionary("d", &inner_dict)); |
| 360 | 361 |
| 361 root2.reset(JSONReader::Read( | 362 root2.reset(JSONReader::Read( |
| 362 "{\"inner\": {\"array\":[true] , },\"false\":false,\"d\":{},}", true)); | 363 "{\"inner\": {\"array\":[true] , },\"false\":false,\"d\":{},}", |
| 364 JSON_ALLOW_TRAILING_COMMAS)); |
| 363 EXPECT_TRUE(root->Equals(root2.get())); | 365 EXPECT_TRUE(root->Equals(root2.get())); |
| 364 | 366 |
| 365 // Test keys with periods | 367 // Test keys with periods |
| 366 root.reset(JSONReader::Read( | 368 root.reset(JSONReader::Read( |
| 367 "{\"a.b\":3,\"c\":2,\"d.e.f\":{\"g.h.i.j\":1}}", false)); | 369 "{\"a.b\":3,\"c\":2,\"d.e.f\":{\"g.h.i.j\":1}}")); |
| 368 ASSERT_TRUE(root.get()); | 370 ASSERT_TRUE(root.get()); |
| 369 EXPECT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); | 371 EXPECT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); |
| 370 dict_val = static_cast<DictionaryValue*>(root.get()); | 372 dict_val = static_cast<DictionaryValue*>(root.get()); |
| 371 int integer_value = 0; | 373 int integer_value = 0; |
| 372 EXPECT_TRUE(dict_val->GetIntegerWithoutPathExpansion("a.b", &integer_value)); | 374 EXPECT_TRUE(dict_val->GetIntegerWithoutPathExpansion("a.b", &integer_value)); |
| 373 EXPECT_EQ(3, integer_value); | 375 EXPECT_EQ(3, integer_value); |
| 374 EXPECT_TRUE(dict_val->GetIntegerWithoutPathExpansion("c", &integer_value)); | 376 EXPECT_TRUE(dict_val->GetIntegerWithoutPathExpansion("c", &integer_value)); |
| 375 EXPECT_EQ(2, integer_value); | 377 EXPECT_EQ(2, integer_value); |
| 376 inner_dict = NULL; | 378 inner_dict = NULL; |
| 377 ASSERT_TRUE(dict_val->GetDictionaryWithoutPathExpansion("d.e.f", | 379 ASSERT_TRUE(dict_val->GetDictionaryWithoutPathExpansion("d.e.f", |
| 378 &inner_dict)); | 380 &inner_dict)); |
| 379 EXPECT_EQ(1U, inner_dict->size()); | 381 EXPECT_EQ(1U, inner_dict->size()); |
| 380 EXPECT_TRUE(inner_dict->GetIntegerWithoutPathExpansion("g.h.i.j", | 382 EXPECT_TRUE(inner_dict->GetIntegerWithoutPathExpansion("g.h.i.j", |
| 381 &integer_value)); | 383 &integer_value)); |
| 382 EXPECT_EQ(1, integer_value); | 384 EXPECT_EQ(1, integer_value); |
| 383 | 385 |
| 384 root.reset(JSONReader::Read("{\"a\":{\"b\":2},\"a.b\":1}", false)); | 386 root.reset(JSONReader::Read("{\"a\":{\"b\":2},\"a.b\":1}")); |
| 385 ASSERT_TRUE(root.get()); | 387 ASSERT_TRUE(root.get()); |
| 386 EXPECT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); | 388 EXPECT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); |
| 387 dict_val = static_cast<DictionaryValue*>(root.get()); | 389 dict_val = static_cast<DictionaryValue*>(root.get()); |
| 388 EXPECT_TRUE(dict_val->GetInteger("a.b", &integer_value)); | 390 EXPECT_TRUE(dict_val->GetInteger("a.b", &integer_value)); |
| 389 EXPECT_EQ(2, integer_value); | 391 EXPECT_EQ(2, integer_value); |
| 390 EXPECT_TRUE(dict_val->GetIntegerWithoutPathExpansion("a.b", &integer_value)); | 392 EXPECT_TRUE(dict_val->GetIntegerWithoutPathExpansion("a.b", &integer_value)); |
| 391 EXPECT_EQ(1, integer_value); | 393 EXPECT_EQ(1, integer_value); |
| 392 | 394 |
| 393 // Invalid, no closing brace | 395 // Invalid, no closing brace |
| 394 root.reset(JSONReader::Read("{\"a\": true", false)); | 396 root.reset(JSONReader::Read("{\"a\": true")); |
| 395 EXPECT_FALSE(root.get()); | 397 EXPECT_FALSE(root.get()); |
| 396 | 398 |
| 397 // Invalid, keys must be quoted | 399 // Invalid, keys must be quoted |
| 398 root.reset(JSONReader::Read("{foo:true}", false)); | 400 root.reset(JSONReader::Read("{foo:true}")); |
| 399 EXPECT_FALSE(root.get()); | 401 EXPECT_FALSE(root.get()); |
| 400 | 402 |
| 401 // Invalid, trailing comma | 403 // Invalid, trailing comma |
| 402 root.reset(JSONReader::Read("{\"a\":true,}", false)); | 404 root.reset(JSONReader::Read("{\"a\":true,}")); |
| 403 EXPECT_FALSE(root.get()); | 405 EXPECT_FALSE(root.get()); |
| 404 | 406 |
| 405 // Invalid, too many commas | 407 // Invalid, too many commas |
| 406 root.reset(JSONReader::Read("{\"a\":true,,\"b\":false}", false)); | 408 root.reset(JSONReader::Read("{\"a\":true,,\"b\":false}")); |
| 407 EXPECT_FALSE(root.get()); | 409 EXPECT_FALSE(root.get()); |
| 408 root.reset(JSONReader::Read("{\"a\":true,,\"b\":false}", true)); | 410 root.reset(JSONReader::Read("{\"a\":true,,\"b\":false}", |
| 411 JSON_ALLOW_TRAILING_COMMAS)); |
| 409 EXPECT_FALSE(root.get()); | 412 EXPECT_FALSE(root.get()); |
| 410 | 413 |
| 411 // Invalid, no separator | 414 // Invalid, no separator |
| 412 root.reset(JSONReader::Read("{\"a\" \"b\"}", false)); | 415 root.reset(JSONReader::Read("{\"a\" \"b\"}")); |
| 413 EXPECT_FALSE(root.get()); | 416 EXPECT_FALSE(root.get()); |
| 414 | 417 |
| 415 // Invalid, lone comma. | 418 // Invalid, lone comma. |
| 416 root.reset(JSONReader::Read("{,}", false)); | 419 root.reset(JSONReader::Read("{,}")); |
| 417 EXPECT_FALSE(root.get()); | 420 EXPECT_FALSE(root.get()); |
| 418 root.reset(JSONReader::Read("{,}", true)); | 421 root.reset(JSONReader::Read("{,}", JSON_ALLOW_TRAILING_COMMAS)); |
| 419 EXPECT_FALSE(root.get()); | 422 EXPECT_FALSE(root.get()); |
| 420 root.reset(JSONReader::Read("{\"a\":true,,}", true)); | 423 root.reset(JSONReader::Read("{\"a\":true,,}", JSON_ALLOW_TRAILING_COMMAS)); |
| 421 EXPECT_FALSE(root.get()); | 424 EXPECT_FALSE(root.get()); |
| 422 root.reset(JSONReader::Read("{,\"a\":true}", true)); | 425 root.reset(JSONReader::Read("{,\"a\":true}", JSON_ALLOW_TRAILING_COMMAS)); |
| 423 EXPECT_FALSE(root.get()); | 426 EXPECT_FALSE(root.get()); |
| 424 root.reset(JSONReader::Read("{\"a\":true,,\"b\":false}", true)); | 427 root.reset(JSONReader::Read("{\"a\":true,,\"b\":false}", |
| 428 JSON_ALLOW_TRAILING_COMMAS)); |
| 425 EXPECT_FALSE(root.get()); | 429 EXPECT_FALSE(root.get()); |
| 426 | 430 |
| 427 // Test stack overflow | 431 // Test stack overflow |
| 428 std::string evil(1000000, '['); | 432 std::string evil(1000000, '['); |
| 429 evil.append(std::string(1000000, ']')); | 433 evil.append(std::string(1000000, ']')); |
| 430 root.reset(JSONReader::Read(evil, false)); | 434 root.reset(JSONReader::Read(evil)); |
| 431 EXPECT_FALSE(root.get()); | 435 EXPECT_FALSE(root.get()); |
| 432 | 436 |
| 433 // A few thousand adjacent lists is fine. | 437 // A few thousand adjacent lists is fine. |
| 434 std::string not_evil("["); | 438 std::string not_evil("["); |
| 435 not_evil.reserve(15010); | 439 not_evil.reserve(15010); |
| 436 for (int i = 0; i < 5000; ++i) { | 440 for (int i = 0; i < 5000; ++i) { |
| 437 not_evil.append("[],"); | 441 not_evil.append("[],"); |
| 438 } | 442 } |
| 439 not_evil.append("[]]"); | 443 not_evil.append("[]]"); |
| 440 root.reset(JSONReader::Read(not_evil, false)); | 444 root.reset(JSONReader::Read(not_evil)); |
| 441 ASSERT_TRUE(root.get()); | 445 ASSERT_TRUE(root.get()); |
| 442 EXPECT_TRUE(root->IsType(Value::TYPE_LIST)); | 446 EXPECT_TRUE(root->IsType(Value::TYPE_LIST)); |
| 443 list = static_cast<ListValue*>(root.get()); | 447 list = static_cast<ListValue*>(root.get()); |
| 444 EXPECT_EQ(5001U, list->GetSize()); | 448 EXPECT_EQ(5001U, list->GetSize()); |
| 445 | 449 |
| 446 // Test utf8 encoded input | 450 // Test utf8 encoded input |
| 447 root.reset(JSONReader().JsonToValue("\"\xe7\xbd\x91\xe9\xa1\xb5\"", | 451 root.reset(JSONReader().JsonToValue("\"\xe7\xbd\x91\xe9\xa1\xb5\"", |
| 448 false, false)); | 452 false, false)); |
| 449 ASSERT_TRUE(root.get()); | 453 ASSERT_TRUE(root.get()); |
| 450 EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); | 454 EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 484 "\"\\uzz89\"", // Invalid scalar. | 488 "\"\\uzz89\"", // Invalid scalar. |
| 485 "\"\\ud83d\\udca\"", // Invalid lower surrogate. | 489 "\"\\ud83d\\udca\"", // Invalid lower surrogate. |
| 486 "\"\\ud83d\\ud83d\"", // Invalid lower surrogate. | 490 "\"\\ud83d\\ud83d\"", // Invalid lower surrogate. |
| 487 "\"\\ud83foo\"", // No lower surrogate. | 491 "\"\\ud83foo\"", // No lower surrogate. |
| 488 "\"\\ud83\\foo\"" // No lower surrogate. | 492 "\"\\ud83\\foo\"" // No lower surrogate. |
| 489 }; | 493 }; |
| 490 for (size_t i = 0; i < arraysize(cases); ++i) { | 494 for (size_t i = 0; i < arraysize(cases); ++i) { |
| 491 root.reset(JSONReader().JsonToValue(cases[i], false, false)); | 495 root.reset(JSONReader().JsonToValue(cases[i], false, false)); |
| 492 EXPECT_FALSE(root.get()) << cases[i]; | 496 EXPECT_FALSE(root.get()) << cases[i]; |
| 493 } | 497 } |
| 494 | |
| 495 // Test invalid root objects. | |
| 496 root.reset(JSONReader::Read("null", false)); | |
| 497 EXPECT_FALSE(root.get()); | |
| 498 root.reset(JSONReader::Read("true", false)); | |
| 499 EXPECT_FALSE(root.get()); | |
| 500 root.reset(JSONReader::Read("10", false)); | |
| 501 EXPECT_FALSE(root.get()); | |
| 502 root.reset(JSONReader::Read("\"root\"", false)); | |
| 503 EXPECT_FALSE(root.get()); | |
| 504 } | 498 } |
| 505 | 499 |
| 506 TEST(JSONReaderTest, ReadFromFile) { | 500 TEST(JSONReaderTest, ReadFromFile) { |
| 507 FilePath path; | 501 FilePath path; |
| 508 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &path)); | 502 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &path)); |
| 509 path = path.Append(FILE_PATH_LITERAL("base")) | 503 path = path.Append(FILE_PATH_LITERAL("base")) |
| 510 .Append(FILE_PATH_LITERAL("data")) | 504 .Append(FILE_PATH_LITERAL("data")) |
| 511 .Append(FILE_PATH_LITERAL("json")); | 505 .Append(FILE_PATH_LITERAL("json")); |
| 512 | 506 |
| 513 std::string input; | 507 std::string input; |
| 514 ASSERT_TRUE(file_util::ReadFileToString( | 508 ASSERT_TRUE(file_util::ReadFileToString( |
| 515 path.Append(FILE_PATH_LITERAL("bom_feff.json")), &input)); | 509 path.Append(FILE_PATH_LITERAL("bom_feff.json")), &input)); |
| 516 | 510 |
| 517 JSONReader reader; | 511 JSONReader reader; |
| 518 scoped_ptr<Value> root(reader.JsonToValue(input, false, false)); | 512 std::string error_msg; |
| 513 scoped_ptr<Value> root( |
| 514 JSONReader::ReadAndReturnError(input, JSON_PARSE_RFC, NULL, &error_msg)); |
| 519 ASSERT_TRUE(root.get()) << reader.GetErrorMessage(); | 515 ASSERT_TRUE(root.get()) << reader.GetErrorMessage(); |
| 520 EXPECT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); | 516 EXPECT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); |
| 521 } | 517 } |
| 522 | 518 |
| 523 TEST(JSONReaderTest, ErrorMessages) { | 519 TEST(JSONReaderTest, ErrorMessages) { |
| 524 // Error strings should not be modified in case of success. | 520 // Error strings should not be modified in case of success. |
| 525 std::string error_message; | 521 std::string error_message; |
| 526 int error_code = 0; | 522 int error_code = 0; |
| 527 scoped_ptr<Value> root; | 523 scoped_ptr<Value> root; |
| 528 root.reset(JSONReader::ReadAndReturnError("[42]", false, | 524 root.reset(JSONReader::ReadAndReturnError("[42]", JSON_PARSE_RFC, |
| 529 &error_code, &error_message)); | 525 &error_code, &error_message)); |
| 530 EXPECT_TRUE(error_message.empty()); | 526 EXPECT_TRUE(error_message.empty()); |
| 531 EXPECT_EQ(0, error_code); | 527 EXPECT_EQ(0, error_code); |
| 532 | 528 |
| 533 // Test line and column counting | 529 // Test line and column counting |
| 534 const char* big_json = "[\n0,\n1,\n2,\n3,4,5,6 7,\n8,\n9\n]"; | 530 const char* big_json = "[\n0,\n1,\n2,\n3,4,5,6 7,\n8,\n9\n]"; |
| 535 // error here --------------------------------^ | 531 // error here --------------------------------^ |
| 536 root.reset(JSONReader::ReadAndReturnError(big_json, false, | 532 root.reset(JSONReader::ReadAndReturnError(big_json, JSON_PARSE_RFC, |
| 537 &error_code, &error_message)); | 533 &error_code, &error_message)); |
| 538 EXPECT_FALSE(root.get()); | 534 EXPECT_FALSE(root.get()); |
| 539 EXPECT_EQ(JSONReader::FormatErrorMessage(5, 9, JSONReader::kSyntaxError), | 535 EXPECT_EQ(JSONReader::FormatErrorMessage(5, 9, JSONReader::kSyntaxError), |
| 540 error_message); | 536 error_message); |
| 541 EXPECT_EQ(JSONReader::JSON_SYNTAX_ERROR, error_code); | 537 EXPECT_EQ(JSONReader::JSON_SYNTAX_ERROR, error_code); |
| 542 | 538 |
| 543 // Test each of the error conditions | 539 // Test each of the error conditions |
| 544 root.reset(JSONReader::ReadAndReturnError("{},{}", false, | 540 root.reset(JSONReader::ReadAndReturnError("{},{}", JSON_PARSE_RFC, |
| 545 &error_code, &error_message)); | 541 &error_code, &error_message)); |
| 546 EXPECT_FALSE(root.get()); | 542 EXPECT_FALSE(root.get()); |
| 547 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 3, | 543 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 3, |
| 548 JSONReader::kUnexpectedDataAfterRoot), error_message); | 544 JSONReader::kUnexpectedDataAfterRoot), error_message); |
| 549 EXPECT_EQ(JSONReader::JSON_UNEXPECTED_DATA_AFTER_ROOT, error_code); | 545 EXPECT_EQ(JSONReader::JSON_UNEXPECTED_DATA_AFTER_ROOT, error_code); |
| 550 | 546 |
| 551 std::string nested_json; | 547 std::string nested_json; |
| 552 for (int i = 0; i < 101; ++i) { | 548 for (int i = 0; i < 101; ++i) { |
| 553 nested_json.insert(nested_json.begin(), '['); | 549 nested_json.insert(nested_json.begin(), '['); |
| 554 nested_json.append(1, ']'); | 550 nested_json.append(1, ']'); |
| 555 } | 551 } |
| 556 root.reset(JSONReader::ReadAndReturnError(nested_json, false, | 552 root.reset(JSONReader::ReadAndReturnError(nested_json, JSON_PARSE_RFC, |
| 557 &error_code, &error_message)); | 553 &error_code, &error_message)); |
| 558 EXPECT_FALSE(root.get()); | 554 EXPECT_FALSE(root.get()); |
| 559 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 101, JSONReader::kTooMuchNesting), | 555 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 101, JSONReader::kTooMuchNesting), |
| 560 error_message); | 556 error_message); |
| 561 EXPECT_EQ(JSONReader::JSON_TOO_MUCH_NESTING, error_code); | 557 EXPECT_EQ(JSONReader::JSON_TOO_MUCH_NESTING, error_code); |
| 562 | 558 |
| 563 root.reset(JSONReader::ReadAndReturnError("42", false, | 559 root.reset(JSONReader::ReadAndReturnError("[1,]", JSON_PARSE_RFC, |
| 564 &error_code, &error_message)); | |
| 565 EXPECT_FALSE(root.get()); | |
| 566 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 1, | |
| 567 JSONReader::kBadRootElementType), error_message); | |
| 568 EXPECT_EQ(JSONReader::JSON_BAD_ROOT_ELEMENT_TYPE, error_code); | |
| 569 | |
| 570 root.reset(JSONReader::ReadAndReturnError("[1,]", false, | |
| 571 &error_code, &error_message)); | 560 &error_code, &error_message)); |
| 572 EXPECT_FALSE(root.get()); | 561 EXPECT_FALSE(root.get()); |
| 573 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 4, JSONReader::kTrailingComma), | 562 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 4, JSONReader::kTrailingComma), |
| 574 error_message); | 563 error_message); |
| 575 EXPECT_EQ(JSONReader::JSON_TRAILING_COMMA, error_code); | 564 EXPECT_EQ(JSONReader::JSON_TRAILING_COMMA, error_code); |
| 576 | 565 |
| 577 root.reset(JSONReader::ReadAndReturnError("{foo:\"bar\"}", false, | 566 root.reset(JSONReader::ReadAndReturnError("{foo:\"bar\"}", JSON_PARSE_RFC, |
| 578 &error_code, &error_message)); | 567 &error_code, &error_message)); |
| 579 EXPECT_FALSE(root.get()); | 568 EXPECT_FALSE(root.get()); |
| 580 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 2, | 569 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 2, |
| 581 JSONReader::kUnquotedDictionaryKey), error_message); | 570 JSONReader::kUnquotedDictionaryKey), error_message); |
| 582 EXPECT_EQ(JSONReader::JSON_UNQUOTED_DICTIONARY_KEY, error_code); | 571 EXPECT_EQ(JSONReader::JSON_UNQUOTED_DICTIONARY_KEY, error_code); |
| 583 | 572 |
| 584 root.reset(JSONReader::ReadAndReturnError("{\"foo\":\"bar\",}", false, | 573 root.reset(JSONReader::ReadAndReturnError("{\"foo\":\"bar\",}", |
| 585 &error_code, &error_message)); | 574 JSON_PARSE_RFC, |
| 575 &error_code, |
| 576 &error_message)); |
| 586 EXPECT_FALSE(root.get()); | 577 EXPECT_FALSE(root.get()); |
| 587 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 14, JSONReader::kTrailingComma), | 578 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 14, JSONReader::kTrailingComma), |
| 588 error_message); | 579 error_message); |
| 589 | 580 |
| 590 root.reset(JSONReader::ReadAndReturnError("[nu]", false, | 581 root.reset(JSONReader::ReadAndReturnError("[nu]", JSON_PARSE_RFC, |
| 591 &error_code, &error_message)); | 582 &error_code, &error_message)); |
| 592 EXPECT_FALSE(root.get()); | 583 EXPECT_FALSE(root.get()); |
| 593 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 2, JSONReader::kSyntaxError), | 584 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 2, JSONReader::kSyntaxError), |
| 594 error_message); | 585 error_message); |
| 595 EXPECT_EQ(JSONReader::JSON_SYNTAX_ERROR, error_code); | 586 EXPECT_EQ(JSONReader::JSON_SYNTAX_ERROR, error_code); |
| 596 | 587 |
| 597 root.reset(JSONReader::ReadAndReturnError("[\"xxx\\xq\"]", false, | 588 root.reset(JSONReader::ReadAndReturnError("[\"xxx\\xq\"]", JSON_PARSE_RFC, |
| 598 &error_code, &error_message)); | 589 &error_code, &error_message)); |
| 599 EXPECT_FALSE(root.get()); | 590 EXPECT_FALSE(root.get()); |
| 600 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape), | 591 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape), |
| 601 error_message); | 592 error_message); |
| 602 EXPECT_EQ(JSONReader::JSON_INVALID_ESCAPE, error_code); | 593 EXPECT_EQ(JSONReader::JSON_INVALID_ESCAPE, error_code); |
| 603 | 594 |
| 604 root.reset(JSONReader::ReadAndReturnError("[\"xxx\\uq\"]", false, | 595 root.reset(JSONReader::ReadAndReturnError("[\"xxx\\uq\"]", JSON_PARSE_RFC, |
| 605 &error_code, &error_message)); | 596 &error_code, &error_message)); |
| 606 EXPECT_FALSE(root.get()); | 597 EXPECT_FALSE(root.get()); |
| 607 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape), | 598 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape), |
| 608 error_message); | 599 error_message); |
| 609 EXPECT_EQ(JSONReader::JSON_INVALID_ESCAPE, error_code); | 600 EXPECT_EQ(JSONReader::JSON_INVALID_ESCAPE, error_code); |
| 610 | 601 |
| 611 root.reset(JSONReader::ReadAndReturnError("[\"xxx\\q\"]", false, | 602 root.reset(JSONReader::ReadAndReturnError("[\"xxx\\q\"]", JSON_PARSE_RFC, |
| 612 &error_code, &error_message)); | 603 &error_code, &error_message)); |
| 613 EXPECT_FALSE(root.get()); | 604 EXPECT_FALSE(root.get()); |
| 614 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape), | 605 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape), |
| 615 error_message); | 606 error_message); |
| 616 EXPECT_EQ(JSONReader::JSON_INVALID_ESCAPE, error_code); | 607 EXPECT_EQ(JSONReader::JSON_INVALID_ESCAPE, error_code); |
| 617 } | 608 } |
| 618 | 609 |
| 619 } // namespace base | 610 } // namespace base |
| OLD | NEW |