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_parser.h" | 5 #include "base/json/json_parser.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 | 10 |
11 #include "base/json/json_reader.h" | 11 #include "base/json/json_reader.h" |
| 12 #include "base/memory/ptr_util.h" |
| 13 #include "base/strings/stringprintf.h" |
12 #include "base/values.h" | 14 #include "base/values.h" |
13 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
14 | 16 |
15 namespace base { | 17 namespace base { |
16 namespace internal { | 18 namespace internal { |
17 | 19 |
18 class JSONParserTest : public testing::Test { | 20 class JSONParserTest : public testing::Test { |
19 public: | 21 public: |
20 JSONParser* NewTestParser(const std::string& input, | 22 JSONParser* NewTestParser(const std::string& input, |
21 int options = JSON_PARSE_RFC) { | 23 int options = JSON_PARSE_RFC) { |
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
335 const std::string quoted_bogus_char = "\"" + bogus_char + "\""; | 337 const std::string quoted_bogus_char = "\"" + bogus_char + "\""; |
336 std::unique_ptr<JSONParser> parser( | 338 std::unique_ptr<JSONParser> parser( |
337 NewTestParser(quoted_bogus_char, JSON_REPLACE_INVALID_CHARACTERS)); | 339 NewTestParser(quoted_bogus_char, JSON_REPLACE_INVALID_CHARACTERS)); |
338 std::unique_ptr<Value> value(parser->ConsumeString()); | 340 std::unique_ptr<Value> value(parser->ConsumeString()); |
339 ASSERT_TRUE(value.get()); | 341 ASSERT_TRUE(value.get()); |
340 std::string str; | 342 std::string str; |
341 EXPECT_TRUE(value->GetAsString(&str)); | 343 EXPECT_TRUE(value->GetAsString(&str)); |
342 EXPECT_EQ(kUnicodeReplacementString, str); | 344 EXPECT_EQ(kUnicodeReplacementString, str); |
343 } | 345 } |
344 | 346 |
| 347 TEST_F(JSONParserTest, ParseNumberErrors) { |
| 348 const struct { |
| 349 const char* input; |
| 350 bool parse_success; |
| 351 double value; |
| 352 } kCases[] = { |
| 353 // clang-format off |
| 354 {"1", true, 1}, |
| 355 {"2.", false, 0}, |
| 356 {"42", true, 42}, |
| 357 {"6e", false, 0}, |
| 358 {"43e2", true, 4300}, |
| 359 {"43e-", false, 0}, |
| 360 {"9e-3", true, 0.009}, |
| 361 {"2e+", false, 0}, |
| 362 {"2e+2", true, 200}, |
| 363 // clang-format on |
| 364 }; |
| 365 |
| 366 for (unsigned int i = 0; i < arraysize(kCases); ++i) { |
| 367 auto test_case = kCases[i]; |
| 368 SCOPED_TRACE(StringPrintf("case %u: \"%s\"", i, test_case.input)); |
| 369 |
| 370 // MSan will do a better job detecting over-read errors if the input is |
| 371 // not nul-terminated on the heap. |
| 372 size_t str_len = strlen(test_case.input); |
| 373 auto non_nul_termianted = MakeUnique<char[]>(str_len); |
| 374 memcpy(non_nul_termianted.get(), test_case.input, str_len); |
| 375 |
| 376 StringPiece string_piece(non_nul_termianted.get(), str_len); |
| 377 std::unique_ptr<Value> result = JSONReader::Read(string_piece); |
| 378 if (test_case.parse_success) { |
| 379 EXPECT_TRUE(result); |
| 380 } else { |
| 381 EXPECT_FALSE(result); |
| 382 } |
| 383 |
| 384 if (!result) |
| 385 continue; |
| 386 |
| 387 double double_value = 0; |
| 388 EXPECT_TRUE(result->GetAsDouble(&double_value)); |
| 389 EXPECT_EQ(test_case.value, double_value); |
| 390 } |
| 391 } |
| 392 |
345 } // namespace internal | 393 } // namespace internal |
346 } // namespace base | 394 } // namespace base |
OLD | NEW |