| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 | 10 |
| 11 #include "base/base_paths.h" | 11 #include "base/base_paths.h" |
| 12 #include "base/files/file_util.h" | 12 #include "base/files/file_util.h" |
| 13 #include "base/logging.h" | 13 #include "base/logging.h" |
| 14 #include "base/macros.h" | 14 #include "base/macros.h" |
| 15 #include "base/path_service.h" | 15 #include "base/path_service.h" |
| 16 #include "base/strings/string_piece.h" | 16 #include "base/strings/string_piece.h" |
| 17 #include "base/strings/utf_string_conversions.h" | 17 #include "base/strings/utf_string_conversions.h" |
| 18 #include "base/values.h" | 18 #include "base/values.h" |
| 19 #include "build/build_config.h" | 19 #include "build/build_config.h" |
| 20 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
| 21 | 21 |
| 22 namespace base { | 22 namespace base { |
| 23 | 23 |
| 24 TEST(JSONReaderTest, Reading) { | 24 TEST(JSONReaderTest, Reading) { |
| 25 { | 25 { |
| 26 // some whitespace checking | 26 // some whitespace checking |
| 27 std::unique_ptr<Value> root = JSONReader().ReadToValue(" null "); | 27 std::unique_ptr<Value> root = JSONReader().ReadToValue(" null "); |
| 28 ASSERT_TRUE(root); | 28 ASSERT_TRUE(root); |
| 29 EXPECT_TRUE(root->IsType(Value::TYPE_NULL)); | 29 EXPECT_TRUE(root->IsType(Value::Type::NONE)); |
| 30 } | 30 } |
| 31 | 31 |
| 32 { | 32 { |
| 33 // Invalid JSON string | 33 // Invalid JSON string |
| 34 EXPECT_FALSE(JSONReader().ReadToValue("nu")); | 34 EXPECT_FALSE(JSONReader().ReadToValue("nu")); |
| 35 } | 35 } |
| 36 | 36 |
| 37 { | 37 { |
| 38 // Simple bool | 38 // Simple bool |
| 39 std::unique_ptr<Value> root = JSONReader().ReadToValue("true "); | 39 std::unique_ptr<Value> root = JSONReader().ReadToValue("true "); |
| 40 ASSERT_TRUE(root); | 40 ASSERT_TRUE(root); |
| 41 EXPECT_TRUE(root->IsType(Value::TYPE_BOOLEAN)); | 41 EXPECT_TRUE(root->IsType(Value::Type::BOOLEAN)); |
| 42 } | 42 } |
| 43 | 43 |
| 44 { | 44 { |
| 45 // Embedded comment | 45 // Embedded comment |
| 46 std::unique_ptr<Value> root = JSONReader().ReadToValue("/* comment */null"); | 46 std::unique_ptr<Value> root = JSONReader().ReadToValue("/* comment */null"); |
| 47 ASSERT_TRUE(root); | 47 ASSERT_TRUE(root); |
| 48 EXPECT_TRUE(root->IsType(Value::TYPE_NULL)); | 48 EXPECT_TRUE(root->IsType(Value::Type::NONE)); |
| 49 root = JSONReader().ReadToValue("40 /* comment */"); | 49 root = JSONReader().ReadToValue("40 /* comment */"); |
| 50 ASSERT_TRUE(root); | 50 ASSERT_TRUE(root); |
| 51 EXPECT_TRUE(root->IsType(Value::TYPE_INTEGER)); | 51 EXPECT_TRUE(root->IsType(Value::Type::INTEGER)); |
| 52 root = JSONReader().ReadToValue("true // comment"); | 52 root = JSONReader().ReadToValue("true // comment"); |
| 53 ASSERT_TRUE(root); | 53 ASSERT_TRUE(root); |
| 54 EXPECT_TRUE(root->IsType(Value::TYPE_BOOLEAN)); | 54 EXPECT_TRUE(root->IsType(Value::Type::BOOLEAN)); |
| 55 root = JSONReader().ReadToValue("/* comment */\"sample string\""); | 55 root = JSONReader().ReadToValue("/* comment */\"sample string\""); |
| 56 ASSERT_TRUE(root); | 56 ASSERT_TRUE(root); |
| 57 EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); | 57 EXPECT_TRUE(root->IsType(Value::Type::STRING)); |
| 58 std::string value; | 58 std::string value; |
| 59 EXPECT_TRUE(root->GetAsString(&value)); | 59 EXPECT_TRUE(root->GetAsString(&value)); |
| 60 EXPECT_EQ("sample string", value); | 60 EXPECT_EQ("sample string", value); |
| 61 std::unique_ptr<ListValue> list = ListValue::From( | 61 std::unique_ptr<ListValue> list = ListValue::From( |
| 62 JSONReader().ReadToValue("[1, /* comment, 2 ] */ \n 3]")); | 62 JSONReader().ReadToValue("[1, /* comment, 2 ] */ \n 3]")); |
| 63 ASSERT_TRUE(list); | 63 ASSERT_TRUE(list); |
| 64 EXPECT_EQ(2u, list->GetSize()); | 64 EXPECT_EQ(2u, list->GetSize()); |
| 65 int int_val = 0; | 65 int int_val = 0; |
| 66 EXPECT_TRUE(list->GetInteger(0, &int_val)); | 66 EXPECT_TRUE(list->GetInteger(0, &int_val)); |
| 67 EXPECT_EQ(1, int_val); | 67 EXPECT_EQ(1, int_val); |
| 68 EXPECT_TRUE(list->GetInteger(1, &int_val)); | 68 EXPECT_TRUE(list->GetInteger(1, &int_val)); |
| 69 EXPECT_EQ(3, int_val); | 69 EXPECT_EQ(3, int_val); |
| 70 list = ListValue::From(JSONReader().ReadToValue("[1, /*a*/2, 3]")); | 70 list = ListValue::From(JSONReader().ReadToValue("[1, /*a*/2, 3]")); |
| 71 ASSERT_TRUE(list); | 71 ASSERT_TRUE(list); |
| 72 EXPECT_EQ(3u, list->GetSize()); | 72 EXPECT_EQ(3u, list->GetSize()); |
| 73 root = JSONReader().ReadToValue("/* comment **/42"); | 73 root = JSONReader().ReadToValue("/* comment **/42"); |
| 74 ASSERT_TRUE(root); | 74 ASSERT_TRUE(root); |
| 75 EXPECT_TRUE(root->IsType(Value::TYPE_INTEGER)); | 75 EXPECT_TRUE(root->IsType(Value::Type::INTEGER)); |
| 76 EXPECT_TRUE(root->GetAsInteger(&int_val)); | 76 EXPECT_TRUE(root->GetAsInteger(&int_val)); |
| 77 EXPECT_EQ(42, int_val); | 77 EXPECT_EQ(42, int_val); |
| 78 root = JSONReader().ReadToValue( | 78 root = JSONReader().ReadToValue( |
| 79 "/* comment **/\n" | 79 "/* comment **/\n" |
| 80 "// */ 43\n" | 80 "// */ 43\n" |
| 81 "44"); | 81 "44"); |
| 82 ASSERT_TRUE(root); | 82 ASSERT_TRUE(root); |
| 83 EXPECT_TRUE(root->IsType(Value::TYPE_INTEGER)); | 83 EXPECT_TRUE(root->IsType(Value::Type::INTEGER)); |
| 84 EXPECT_TRUE(root->GetAsInteger(&int_val)); | 84 EXPECT_TRUE(root->GetAsInteger(&int_val)); |
| 85 EXPECT_EQ(44, int_val); | 85 EXPECT_EQ(44, int_val); |
| 86 } | 86 } |
| 87 | 87 |
| 88 { | 88 { |
| 89 // Test number formats | 89 // Test number formats |
| 90 std::unique_ptr<Value> root = JSONReader().ReadToValue("43"); | 90 std::unique_ptr<Value> root = JSONReader().ReadToValue("43"); |
| 91 ASSERT_TRUE(root); | 91 ASSERT_TRUE(root); |
| 92 EXPECT_TRUE(root->IsType(Value::TYPE_INTEGER)); | 92 EXPECT_TRUE(root->IsType(Value::Type::INTEGER)); |
| 93 int int_val = 0; | 93 int int_val = 0; |
| 94 EXPECT_TRUE(root->GetAsInteger(&int_val)); | 94 EXPECT_TRUE(root->GetAsInteger(&int_val)); |
| 95 EXPECT_EQ(43, int_val); | 95 EXPECT_EQ(43, int_val); |
| 96 } | 96 } |
| 97 | 97 |
| 98 { | 98 { |
| 99 // According to RFC4627, oct, hex, and leading zeros are invalid JSON. | 99 // According to RFC4627, oct, hex, and leading zeros are invalid JSON. |
| 100 EXPECT_FALSE(JSONReader().ReadToValue("043")); | 100 EXPECT_FALSE(JSONReader().ReadToValue("043")); |
| 101 EXPECT_FALSE(JSONReader().ReadToValue("0x43")); | 101 EXPECT_FALSE(JSONReader().ReadToValue("0x43")); |
| 102 EXPECT_FALSE(JSONReader().ReadToValue("00")); | 102 EXPECT_FALSE(JSONReader().ReadToValue("00")); |
| 103 } | 103 } |
| 104 | 104 |
| 105 { | 105 { |
| 106 // Test 0 (which needs to be special cased because of the leading zero | 106 // Test 0 (which needs to be special cased because of the leading zero |
| 107 // clause). | 107 // clause). |
| 108 std::unique_ptr<Value> root = JSONReader().ReadToValue("0"); | 108 std::unique_ptr<Value> root = JSONReader().ReadToValue("0"); |
| 109 ASSERT_TRUE(root); | 109 ASSERT_TRUE(root); |
| 110 EXPECT_TRUE(root->IsType(Value::TYPE_INTEGER)); | 110 EXPECT_TRUE(root->IsType(Value::Type::INTEGER)); |
| 111 int int_val = 1; | 111 int int_val = 1; |
| 112 EXPECT_TRUE(root->GetAsInteger(&int_val)); | 112 EXPECT_TRUE(root->GetAsInteger(&int_val)); |
| 113 EXPECT_EQ(0, int_val); | 113 EXPECT_EQ(0, int_val); |
| 114 } | 114 } |
| 115 | 115 |
| 116 { | 116 { |
| 117 // Numbers that overflow ints should succeed, being internally promoted to | 117 // Numbers that overflow ints should succeed, being internally promoted to |
| 118 // storage as doubles | 118 // storage as doubles |
| 119 std::unique_ptr<Value> root = JSONReader().ReadToValue("2147483648"); | 119 std::unique_ptr<Value> root = JSONReader().ReadToValue("2147483648"); |
| 120 ASSERT_TRUE(root); | 120 ASSERT_TRUE(root); |
| 121 double double_val; | 121 double double_val; |
| 122 EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); | 122 EXPECT_TRUE(root->IsType(Value::Type::DOUBLE)); |
| 123 double_val = 0.0; | 123 double_val = 0.0; |
| 124 EXPECT_TRUE(root->GetAsDouble(&double_val)); | 124 EXPECT_TRUE(root->GetAsDouble(&double_val)); |
| 125 EXPECT_DOUBLE_EQ(2147483648.0, double_val); | 125 EXPECT_DOUBLE_EQ(2147483648.0, double_val); |
| 126 root = JSONReader().ReadToValue("-2147483649"); | 126 root = JSONReader().ReadToValue("-2147483649"); |
| 127 ASSERT_TRUE(root); | 127 ASSERT_TRUE(root); |
| 128 EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); | 128 EXPECT_TRUE(root->IsType(Value::Type::DOUBLE)); |
| 129 double_val = 0.0; | 129 double_val = 0.0; |
| 130 EXPECT_TRUE(root->GetAsDouble(&double_val)); | 130 EXPECT_TRUE(root->GetAsDouble(&double_val)); |
| 131 EXPECT_DOUBLE_EQ(-2147483649.0, double_val); | 131 EXPECT_DOUBLE_EQ(-2147483649.0, double_val); |
| 132 } | 132 } |
| 133 | 133 |
| 134 { | 134 { |
| 135 // Parse a double | 135 // Parse a double |
| 136 std::unique_ptr<Value> root = JSONReader().ReadToValue("43.1"); | 136 std::unique_ptr<Value> root = JSONReader().ReadToValue("43.1"); |
| 137 ASSERT_TRUE(root); | 137 ASSERT_TRUE(root); |
| 138 EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); | 138 EXPECT_TRUE(root->IsType(Value::Type::DOUBLE)); |
| 139 double double_val = 0.0; | 139 double double_val = 0.0; |
| 140 EXPECT_TRUE(root->GetAsDouble(&double_val)); | 140 EXPECT_TRUE(root->GetAsDouble(&double_val)); |
| 141 EXPECT_DOUBLE_EQ(43.1, double_val); | 141 EXPECT_DOUBLE_EQ(43.1, double_val); |
| 142 | 142 |
| 143 root = JSONReader().ReadToValue("4.3e-1"); | 143 root = JSONReader().ReadToValue("4.3e-1"); |
| 144 ASSERT_TRUE(root); | 144 ASSERT_TRUE(root); |
| 145 EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); | 145 EXPECT_TRUE(root->IsType(Value::Type::DOUBLE)); |
| 146 double_val = 0.0; | 146 double_val = 0.0; |
| 147 EXPECT_TRUE(root->GetAsDouble(&double_val)); | 147 EXPECT_TRUE(root->GetAsDouble(&double_val)); |
| 148 EXPECT_DOUBLE_EQ(.43, double_val); | 148 EXPECT_DOUBLE_EQ(.43, double_val); |
| 149 | 149 |
| 150 root = JSONReader().ReadToValue("2.1e0"); | 150 root = JSONReader().ReadToValue("2.1e0"); |
| 151 ASSERT_TRUE(root); | 151 ASSERT_TRUE(root); |
| 152 EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); | 152 EXPECT_TRUE(root->IsType(Value::Type::DOUBLE)); |
| 153 double_val = 0.0; | 153 double_val = 0.0; |
| 154 EXPECT_TRUE(root->GetAsDouble(&double_val)); | 154 EXPECT_TRUE(root->GetAsDouble(&double_val)); |
| 155 EXPECT_DOUBLE_EQ(2.1, double_val); | 155 EXPECT_DOUBLE_EQ(2.1, double_val); |
| 156 | 156 |
| 157 root = JSONReader().ReadToValue("2.1e+0001"); | 157 root = JSONReader().ReadToValue("2.1e+0001"); |
| 158 ASSERT_TRUE(root); | 158 ASSERT_TRUE(root); |
| 159 EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); | 159 EXPECT_TRUE(root->IsType(Value::Type::DOUBLE)); |
| 160 double_val = 0.0; | 160 double_val = 0.0; |
| 161 EXPECT_TRUE(root->GetAsDouble(&double_val)); | 161 EXPECT_TRUE(root->GetAsDouble(&double_val)); |
| 162 EXPECT_DOUBLE_EQ(21.0, double_val); | 162 EXPECT_DOUBLE_EQ(21.0, double_val); |
| 163 | 163 |
| 164 root = JSONReader().ReadToValue("0.01"); | 164 root = JSONReader().ReadToValue("0.01"); |
| 165 ASSERT_TRUE(root); | 165 ASSERT_TRUE(root); |
| 166 EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); | 166 EXPECT_TRUE(root->IsType(Value::Type::DOUBLE)); |
| 167 double_val = 0.0; | 167 double_val = 0.0; |
| 168 EXPECT_TRUE(root->GetAsDouble(&double_val)); | 168 EXPECT_TRUE(root->GetAsDouble(&double_val)); |
| 169 EXPECT_DOUBLE_EQ(0.01, double_val); | 169 EXPECT_DOUBLE_EQ(0.01, double_val); |
| 170 | 170 |
| 171 root = JSONReader().ReadToValue("1.00"); | 171 root = JSONReader().ReadToValue("1.00"); |
| 172 ASSERT_TRUE(root); | 172 ASSERT_TRUE(root); |
| 173 EXPECT_TRUE(root->IsType(Value::TYPE_DOUBLE)); | 173 EXPECT_TRUE(root->IsType(Value::Type::DOUBLE)); |
| 174 double_val = 0.0; | 174 double_val = 0.0; |
| 175 EXPECT_TRUE(root->GetAsDouble(&double_val)); | 175 EXPECT_TRUE(root->GetAsDouble(&double_val)); |
| 176 EXPECT_DOUBLE_EQ(1.0, double_val); | 176 EXPECT_DOUBLE_EQ(1.0, double_val); |
| 177 } | 177 } |
| 178 | 178 |
| 179 { | 179 { |
| 180 // Fractional parts must have a digit before and after the decimal point. | 180 // Fractional parts must have a digit before and after the decimal point. |
| 181 EXPECT_FALSE(JSONReader().ReadToValue("1.")); | 181 EXPECT_FALSE(JSONReader().ReadToValue("1.")); |
| 182 EXPECT_FALSE(JSONReader().ReadToValue(".1")); | 182 EXPECT_FALSE(JSONReader().ReadToValue(".1")); |
| 183 EXPECT_FALSE(JSONReader().ReadToValue("1.e10")); | 183 EXPECT_FALSE(JSONReader().ReadToValue("1.e10")); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 203 { | 203 { |
| 204 // Invalid number formats | 204 // Invalid number formats |
| 205 EXPECT_FALSE(JSONReader().ReadToValue("4.3.1")); | 205 EXPECT_FALSE(JSONReader().ReadToValue("4.3.1")); |
| 206 EXPECT_FALSE(JSONReader().ReadToValue("4e3.1")); | 206 EXPECT_FALSE(JSONReader().ReadToValue("4e3.1")); |
| 207 } | 207 } |
| 208 | 208 |
| 209 { | 209 { |
| 210 // Test string parser | 210 // Test string parser |
| 211 std::unique_ptr<Value> root = JSONReader().ReadToValue("\"hello world\""); | 211 std::unique_ptr<Value> root = JSONReader().ReadToValue("\"hello world\""); |
| 212 ASSERT_TRUE(root); | 212 ASSERT_TRUE(root); |
| 213 EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); | 213 EXPECT_TRUE(root->IsType(Value::Type::STRING)); |
| 214 std::string str_val; | 214 std::string str_val; |
| 215 EXPECT_TRUE(root->GetAsString(&str_val)); | 215 EXPECT_TRUE(root->GetAsString(&str_val)); |
| 216 EXPECT_EQ("hello world", str_val); | 216 EXPECT_EQ("hello world", str_val); |
| 217 } | 217 } |
| 218 | 218 |
| 219 { | 219 { |
| 220 // Empty string | 220 // Empty string |
| 221 std::unique_ptr<Value> root = JSONReader().ReadToValue("\"\""); | 221 std::unique_ptr<Value> root = JSONReader().ReadToValue("\"\""); |
| 222 ASSERT_TRUE(root); | 222 ASSERT_TRUE(root); |
| 223 EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); | 223 EXPECT_TRUE(root->IsType(Value::Type::STRING)); |
| 224 std::string str_val; | 224 std::string str_val; |
| 225 EXPECT_TRUE(root->GetAsString(&str_val)); | 225 EXPECT_TRUE(root->GetAsString(&str_val)); |
| 226 EXPECT_EQ("", str_val); | 226 EXPECT_EQ("", str_val); |
| 227 } | 227 } |
| 228 | 228 |
| 229 { | 229 { |
| 230 // Test basic string escapes | 230 // Test basic string escapes |
| 231 std::unique_ptr<Value> root = | 231 std::unique_ptr<Value> root = |
| 232 JSONReader().ReadToValue("\" \\\"\\\\\\/\\b\\f\\n\\r\\t\\v\""); | 232 JSONReader().ReadToValue("\" \\\"\\\\\\/\\b\\f\\n\\r\\t\\v\""); |
| 233 ASSERT_TRUE(root); | 233 ASSERT_TRUE(root); |
| 234 EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); | 234 EXPECT_TRUE(root->IsType(Value::Type::STRING)); |
| 235 std::string str_val; | 235 std::string str_val; |
| 236 EXPECT_TRUE(root->GetAsString(&str_val)); | 236 EXPECT_TRUE(root->GetAsString(&str_val)); |
| 237 EXPECT_EQ(" \"\\/\b\f\n\r\t\v", str_val); | 237 EXPECT_EQ(" \"\\/\b\f\n\r\t\v", str_val); |
| 238 } | 238 } |
| 239 | 239 |
| 240 { | 240 { |
| 241 // Test hex and unicode escapes including the null character. | 241 // Test hex and unicode escapes including the null character. |
| 242 std::unique_ptr<Value> root = | 242 std::unique_ptr<Value> root = |
| 243 JSONReader().ReadToValue("\"\\x41\\x00\\u1234\""); | 243 JSONReader().ReadToValue("\"\\x41\\x00\\u1234\""); |
| 244 ASSERT_TRUE(root); | 244 ASSERT_TRUE(root); |
| 245 EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); | 245 EXPECT_TRUE(root->IsType(Value::Type::STRING)); |
| 246 std::string str_val; | 246 std::string str_val; |
| 247 EXPECT_TRUE(root->GetAsString(&str_val)); | 247 EXPECT_TRUE(root->GetAsString(&str_val)); |
| 248 EXPECT_EQ(std::wstring(L"A\0\x1234", 3), UTF8ToWide(str_val)); | 248 EXPECT_EQ(std::wstring(L"A\0\x1234", 3), UTF8ToWide(str_val)); |
| 249 } | 249 } |
| 250 | 250 |
| 251 { | 251 { |
| 252 // Test invalid strings | 252 // Test invalid strings |
| 253 EXPECT_FALSE(JSONReader().ReadToValue("\"no closing quote")); | 253 EXPECT_FALSE(JSONReader().ReadToValue("\"no closing quote")); |
| 254 EXPECT_FALSE(JSONReader().ReadToValue("\"\\z invalid escape char\"")); | 254 EXPECT_FALSE(JSONReader().ReadToValue("\"\\z invalid escape char\"")); |
| 255 EXPECT_FALSE(JSONReader().ReadToValue("\"\\xAQ invalid hex code\"")); | 255 EXPECT_FALSE(JSONReader().ReadToValue("\"\\xAQ invalid hex code\"")); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 309 } | 309 } |
| 310 | 310 |
| 311 { | 311 { |
| 312 // Valid if we set |allow_trailing_comma| to true. | 312 // Valid if we set |allow_trailing_comma| to true. |
| 313 std::unique_ptr<ListValue> list = ListValue::From( | 313 std::unique_ptr<ListValue> list = ListValue::From( |
| 314 JSONReader::Read("[true,]", JSON_ALLOW_TRAILING_COMMAS)); | 314 JSONReader::Read("[true,]", JSON_ALLOW_TRAILING_COMMAS)); |
| 315 ASSERT_TRUE(list); | 315 ASSERT_TRUE(list); |
| 316 EXPECT_EQ(1U, list->GetSize()); | 316 EXPECT_EQ(1U, list->GetSize()); |
| 317 Value* tmp_value = nullptr; | 317 Value* tmp_value = nullptr; |
| 318 ASSERT_TRUE(list->Get(0, &tmp_value)); | 318 ASSERT_TRUE(list->Get(0, &tmp_value)); |
| 319 EXPECT_TRUE(tmp_value->IsType(Value::TYPE_BOOLEAN)); | 319 EXPECT_TRUE(tmp_value->IsType(Value::Type::BOOLEAN)); |
| 320 bool bool_value = false; | 320 bool bool_value = false; |
| 321 EXPECT_TRUE(tmp_value->GetAsBoolean(&bool_value)); | 321 EXPECT_TRUE(tmp_value->GetAsBoolean(&bool_value)); |
| 322 EXPECT_TRUE(bool_value); | 322 EXPECT_TRUE(bool_value); |
| 323 } | 323 } |
| 324 | 324 |
| 325 { | 325 { |
| 326 // Don't allow empty elements, even if |allow_trailing_comma| is | 326 // Don't allow empty elements, even if |allow_trailing_comma| is |
| 327 // true. | 327 // true. |
| 328 EXPECT_FALSE(JSONReader::Read("[,]", JSON_ALLOW_TRAILING_COMMAS)); | 328 EXPECT_FALSE(JSONReader::Read("[,]", JSON_ALLOW_TRAILING_COMMAS)); |
| 329 EXPECT_FALSE(JSONReader::Read("[true,,]", JSON_ALLOW_TRAILING_COMMAS)); | 329 EXPECT_FALSE(JSONReader::Read("[true,,]", JSON_ALLOW_TRAILING_COMMAS)); |
| 330 EXPECT_FALSE(JSONReader::Read("[,true,]", JSON_ALLOW_TRAILING_COMMAS)); | 330 EXPECT_FALSE(JSONReader::Read("[,true,]", JSON_ALLOW_TRAILING_COMMAS)); |
| 331 EXPECT_FALSE(JSONReader::Read("[true,,false]", JSON_ALLOW_TRAILING_COMMAS)); | 331 EXPECT_FALSE(JSONReader::Read("[true,,false]", JSON_ALLOW_TRAILING_COMMAS)); |
| 332 } | 332 } |
| 333 | 333 |
| 334 { | 334 { |
| 335 // Test objects | 335 // Test objects |
| 336 std::unique_ptr<DictionaryValue> dict_val = | 336 std::unique_ptr<DictionaryValue> dict_val = |
| 337 DictionaryValue::From(JSONReader::Read("{}")); | 337 DictionaryValue::From(JSONReader::Read("{}")); |
| 338 ASSERT_TRUE(dict_val); | 338 ASSERT_TRUE(dict_val); |
| 339 | 339 |
| 340 dict_val = DictionaryValue::From(JSONReader::Read( | 340 dict_val = DictionaryValue::From(JSONReader::Read( |
| 341 "{\"number\":9.87654321, \"null\":null , \"\\x53\" : \"str\" }")); | 341 "{\"number\":9.87654321, \"null\":null , \"\\x53\" : \"str\" }")); |
| 342 ASSERT_TRUE(dict_val); | 342 ASSERT_TRUE(dict_val); |
| 343 double double_val = 0.0; | 343 double double_val = 0.0; |
| 344 EXPECT_TRUE(dict_val->GetDouble("number", &double_val)); | 344 EXPECT_TRUE(dict_val->GetDouble("number", &double_val)); |
| 345 EXPECT_DOUBLE_EQ(9.87654321, double_val); | 345 EXPECT_DOUBLE_EQ(9.87654321, double_val); |
| 346 Value* null_val = nullptr; | 346 Value* null_val = nullptr; |
| 347 ASSERT_TRUE(dict_val->Get("null", &null_val)); | 347 ASSERT_TRUE(dict_val->Get("null", &null_val)); |
| 348 EXPECT_TRUE(null_val->IsType(Value::TYPE_NULL)); | 348 EXPECT_TRUE(null_val->IsType(Value::Type::NONE)); |
| 349 std::string str_val; | 349 std::string str_val; |
| 350 EXPECT_TRUE(dict_val->GetString("S", &str_val)); | 350 EXPECT_TRUE(dict_val->GetString("S", &str_val)); |
| 351 EXPECT_EQ("str", str_val); | 351 EXPECT_EQ("str", str_val); |
| 352 | 352 |
| 353 std::unique_ptr<Value> root2 = JSONReader::Read( | 353 std::unique_ptr<Value> root2 = JSONReader::Read( |
| 354 "{\"number\":9.87654321, \"null\":null , \"\\x53\" : \"str\", }", | 354 "{\"number\":9.87654321, \"null\":null , \"\\x53\" : \"str\", }", |
| 355 JSON_ALLOW_TRAILING_COMMAS); | 355 JSON_ALLOW_TRAILING_COMMAS); |
| 356 ASSERT_TRUE(root2); | 356 ASSERT_TRUE(root2); |
| 357 EXPECT_TRUE(dict_val->Equals(root2.get())); | 357 EXPECT_TRUE(dict_val->Equals(root2.get())); |
| 358 | 358 |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 476 ListValue::From(JSONReader::Read(not_evil)); | 476 ListValue::From(JSONReader::Read(not_evil)); |
| 477 ASSERT_TRUE(list); | 477 ASSERT_TRUE(list); |
| 478 EXPECT_EQ(5001U, list->GetSize()); | 478 EXPECT_EQ(5001U, list->GetSize()); |
| 479 } | 479 } |
| 480 | 480 |
| 481 { | 481 { |
| 482 // Test utf8 encoded input | 482 // Test utf8 encoded input |
| 483 std::unique_ptr<Value> root = | 483 std::unique_ptr<Value> root = |
| 484 JSONReader().ReadToValue("\"\xe7\xbd\x91\xe9\xa1\xb5\""); | 484 JSONReader().ReadToValue("\"\xe7\xbd\x91\xe9\xa1\xb5\""); |
| 485 ASSERT_TRUE(root); | 485 ASSERT_TRUE(root); |
| 486 EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); | 486 EXPECT_TRUE(root->IsType(Value::Type::STRING)); |
| 487 std::string str_val; | 487 std::string str_val; |
| 488 EXPECT_TRUE(root->GetAsString(&str_val)); | 488 EXPECT_TRUE(root->GetAsString(&str_val)); |
| 489 EXPECT_EQ(L"\x7f51\x9875", UTF8ToWide(str_val)); | 489 EXPECT_EQ(L"\x7f51\x9875", UTF8ToWide(str_val)); |
| 490 | 490 |
| 491 std::unique_ptr<DictionaryValue> dict_val = | 491 std::unique_ptr<DictionaryValue> dict_val = |
| 492 DictionaryValue::From(JSONReader().ReadToValue( | 492 DictionaryValue::From(JSONReader().ReadToValue( |
| 493 "{\"path\": \"/tmp/\xc3\xa0\xc3\xa8\xc3\xb2.png\"}")); | 493 "{\"path\": \"/tmp/\xc3\xa0\xc3\xa8\xc3\xb2.png\"}")); |
| 494 ASSERT_TRUE(dict_val); | 494 ASSERT_TRUE(dict_val); |
| 495 EXPECT_TRUE(dict_val->GetString("path", &str_val)); | 495 EXPECT_TRUE(dict_val->GetString("path", &str_val)); |
| 496 EXPECT_EQ("/tmp/\xC3\xA0\xC3\xA8\xC3\xB2.png", str_val); | 496 EXPECT_EQ("/tmp/\xC3\xA0\xC3\xA8\xC3\xB2.png", str_val); |
| 497 } | 497 } |
| 498 | 498 |
| 499 { | 499 { |
| 500 // Test invalid utf8 encoded input | 500 // Test invalid utf8 encoded input |
| 501 EXPECT_FALSE(JSONReader().ReadToValue("\"345\xb0\xa1\xb0\xa2\"")); | 501 EXPECT_FALSE(JSONReader().ReadToValue("\"345\xb0\xa1\xb0\xa2\"")); |
| 502 EXPECT_FALSE(JSONReader().ReadToValue("\"123\xc0\x81\"")); | 502 EXPECT_FALSE(JSONReader().ReadToValue("\"123\xc0\x81\"")); |
| 503 EXPECT_FALSE(JSONReader().ReadToValue("\"abc\xc0\xae\"")); | 503 EXPECT_FALSE(JSONReader().ReadToValue("\"abc\xc0\xae\"")); |
| 504 } | 504 } |
| 505 | 505 |
| 506 { | 506 { |
| 507 // Test utf16 encoded strings. | 507 // Test utf16 encoded strings. |
| 508 std::unique_ptr<Value> root = JSONReader().ReadToValue("\"\\u20ac3,14\""); | 508 std::unique_ptr<Value> root = JSONReader().ReadToValue("\"\\u20ac3,14\""); |
| 509 ASSERT_TRUE(root); | 509 ASSERT_TRUE(root); |
| 510 EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); | 510 EXPECT_TRUE(root->IsType(Value::Type::STRING)); |
| 511 std::string str_val; | 511 std::string str_val; |
| 512 EXPECT_TRUE(root->GetAsString(&str_val)); | 512 EXPECT_TRUE(root->GetAsString(&str_val)); |
| 513 EXPECT_EQ( | 513 EXPECT_EQ( |
| 514 "\xe2\x82\xac" | 514 "\xe2\x82\xac" |
| 515 "3,14", | 515 "3,14", |
| 516 str_val); | 516 str_val); |
| 517 | 517 |
| 518 root = JSONReader().ReadToValue("\"\\ud83d\\udca9\\ud83d\\udc6c\""); | 518 root = JSONReader().ReadToValue("\"\\ud83d\\udca9\\ud83d\\udc6c\""); |
| 519 ASSERT_TRUE(root); | 519 ASSERT_TRUE(root); |
| 520 EXPECT_TRUE(root->IsType(Value::TYPE_STRING)); | 520 EXPECT_TRUE(root->IsType(Value::Type::STRING)); |
| 521 str_val.clear(); | 521 str_val.clear(); |
| 522 EXPECT_TRUE(root->GetAsString(&str_val)); | 522 EXPECT_TRUE(root->GetAsString(&str_val)); |
| 523 EXPECT_EQ("\xf0\x9f\x92\xa9\xf0\x9f\x91\xac", str_val); | 523 EXPECT_EQ("\xf0\x9f\x92\xa9\xf0\x9f\x91\xac", str_val); |
| 524 } | 524 } |
| 525 | 525 |
| 526 { | 526 { |
| 527 // Test invalid utf16 strings. | 527 // Test invalid utf16 strings. |
| 528 const char* const cases[] = { | 528 const char* const cases[] = { |
| 529 "\"\\u123\"", // Invalid scalar. | 529 "\"\\u123\"", // Invalid scalar. |
| 530 "\"\\ud83d\"", // Invalid scalar. | 530 "\"\\ud83d\"", // Invalid scalar. |
| 531 "\"\\u$%@!\"", // Invalid scalar. | 531 "\"\\u$%@!\"", // Invalid scalar. |
| 532 "\"\\uzz89\"", // Invalid scalar. | 532 "\"\\uzz89\"", // Invalid scalar. |
| 533 "\"\\ud83d\\udca\"", // Invalid lower surrogate. | 533 "\"\\ud83d\\udca\"", // Invalid lower surrogate. |
| 534 "\"\\ud83d\\ud83d\"", // Invalid lower surrogate. | 534 "\"\\ud83d\\ud83d\"", // Invalid lower surrogate. |
| 535 "\"\\ud83foo\"", // No lower surrogate. | 535 "\"\\ud83foo\"", // No lower surrogate. |
| 536 "\"\\ud83\\foo\"" // No lower surrogate. | 536 "\"\\ud83\\foo\"" // No lower surrogate. |
| 537 }; | 537 }; |
| 538 std::unique_ptr<Value> root; | 538 std::unique_ptr<Value> root; |
| 539 for (size_t i = 0; i < arraysize(cases); ++i) { | 539 for (size_t i = 0; i < arraysize(cases); ++i) { |
| 540 root = JSONReader().ReadToValue(cases[i]); | 540 root = JSONReader().ReadToValue(cases[i]); |
| 541 EXPECT_FALSE(root) << cases[i]; | 541 EXPECT_FALSE(root) << cases[i]; |
| 542 } | 542 } |
| 543 } | 543 } |
| 544 | 544 |
| 545 { | 545 { |
| 546 // Test literal root objects. | 546 // Test literal root objects. |
| 547 std::unique_ptr<Value> root = JSONReader::Read("null"); | 547 std::unique_ptr<Value> root = JSONReader::Read("null"); |
| 548 EXPECT_TRUE(root->IsType(Value::TYPE_NULL)); | 548 EXPECT_TRUE(root->IsType(Value::Type::NONE)); |
| 549 | 549 |
| 550 root = JSONReader::Read("true"); | 550 root = JSONReader::Read("true"); |
| 551 ASSERT_TRUE(root); | 551 ASSERT_TRUE(root); |
| 552 bool bool_value; | 552 bool bool_value; |
| 553 EXPECT_TRUE(root->GetAsBoolean(&bool_value)); | 553 EXPECT_TRUE(root->GetAsBoolean(&bool_value)); |
| 554 EXPECT_TRUE(bool_value); | 554 EXPECT_TRUE(bool_value); |
| 555 | 555 |
| 556 root = JSONReader::Read("10"); | 556 root = JSONReader::Read("10"); |
| 557 ASSERT_TRUE(root); | 557 ASSERT_TRUE(root); |
| 558 int integer_value; | 558 int integer_value; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 572 ASSERT_TRUE(PathService::Get(base::DIR_TEST_DATA, &path)); | 572 ASSERT_TRUE(PathService::Get(base::DIR_TEST_DATA, &path)); |
| 573 path = path.AppendASCII("json"); | 573 path = path.AppendASCII("json"); |
| 574 ASSERT_TRUE(base::PathExists(path)); | 574 ASSERT_TRUE(base::PathExists(path)); |
| 575 | 575 |
| 576 std::string input; | 576 std::string input; |
| 577 ASSERT_TRUE(ReadFileToString(path.AppendASCII("bom_feff.json"), &input)); | 577 ASSERT_TRUE(ReadFileToString(path.AppendASCII("bom_feff.json"), &input)); |
| 578 | 578 |
| 579 JSONReader reader; | 579 JSONReader reader; |
| 580 std::unique_ptr<Value> root(reader.ReadToValue(input)); | 580 std::unique_ptr<Value> root(reader.ReadToValue(input)); |
| 581 ASSERT_TRUE(root) << reader.GetErrorMessage(); | 581 ASSERT_TRUE(root) << reader.GetErrorMessage(); |
| 582 EXPECT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); | 582 EXPECT_TRUE(root->IsType(Value::Type::DICTIONARY)); |
| 583 } | 583 } |
| 584 | 584 |
| 585 // Tests that the root of a JSON object can be deleted safely while its | 585 // Tests that the root of a JSON object can be deleted safely while its |
| 586 // children outlive it. | 586 // children outlive it. |
| 587 TEST(JSONReaderTest, StringOptimizations) { | 587 TEST(JSONReaderTest, StringOptimizations) { |
| 588 std::unique_ptr<Value> dict_literal_0; | 588 std::unique_ptr<Value> dict_literal_0; |
| 589 std::unique_ptr<Value> dict_literal_1; | 589 std::unique_ptr<Value> dict_literal_1; |
| 590 std::unique_ptr<Value> dict_string_0; | 590 std::unique_ptr<Value> dict_string_0; |
| 591 std::unique_ptr<Value> dict_string_1; | 591 std::unique_ptr<Value> dict_string_1; |
| 592 std::unique_ptr<Value> list_value_0; | 592 std::unique_ptr<Value> list_value_0; |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 669 | 669 |
| 670 TEST(JSONReaderTest, IllegalTrailingNull) { | 670 TEST(JSONReaderTest, IllegalTrailingNull) { |
| 671 const char json[] = { '"', 'n', 'u', 'l', 'l', '"', '\0' }; | 671 const char json[] = { '"', 'n', 'u', 'l', 'l', '"', '\0' }; |
| 672 std::string json_string(json, sizeof(json)); | 672 std::string json_string(json, sizeof(json)); |
| 673 JSONReader reader; | 673 JSONReader reader; |
| 674 EXPECT_FALSE(reader.ReadToValue(json_string)); | 674 EXPECT_FALSE(reader.ReadToValue(json_string)); |
| 675 EXPECT_EQ(JSONReader::JSON_UNEXPECTED_DATA_AFTER_ROOT, reader.error_code()); | 675 EXPECT_EQ(JSONReader::JSON_UNEXPECTED_DATA_AFTER_ROOT, reader.error_code()); |
| 676 } | 676 } |
| 677 | 677 |
| 678 } // namespace base | 678 } // namespace base |
| OLD | NEW |