OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 "testing/gtest/include/gtest/gtest.h" | 5 #include "testing/gtest/include/gtest/gtest.h" |
6 #include "base/string_escape.h" | 6 #include "base/string_escape.h" |
7 #include "base/string_util.h" | 7 #include "base/string_util.h" |
8 | 8 |
9 TEST(StringEscapeTest, JavascriptDoubleQuote) { | 9 namespace { |
10 static const char* kToEscape = "\b\001aZ\"\\wee"; | |
11 static const char* kEscaped = "\\b\\x01aZ\\\"\\\\wee"; | |
12 static const char* kEscapedQuoted = "\"\\b\\x01aZ\\\"\\\\wee\""; | |
13 static const wchar_t* kUToEscape = L"\b\x0001" L"a\x123fZ\"\\wee"; | |
14 static const char* kUEscaped = "\\b\\x01a\\u123FZ\\\"\\\\wee"; | |
15 static const char* kUEscapedQuoted = "\"\\b\\x01a\\u123FZ\\\"\\\\wee\""; | |
16 | 10 |
| 11 const struct json_narrow_test_data { |
| 12 const char* to_escape; |
| 13 const char* escaped; |
| 14 } json_narrow_cases[] = { |
| 15 {"\b\001aZ\"\\wee", "\\b\\u0001aZ\\\"\\\\wee"}, |
| 16 {"a\b\f\n\r\t\v\1\\.\"z", |
| 17 "a\\b\\f\\n\\r\\t\\u000B\\u0001\\\\.\\\"z"}, |
| 18 {"b\x0f\x7f\xf0\xff!", "b\\u000F\\u007F\\u00F0\\u00FF!"}, |
| 19 }; |
| 20 |
| 21 } |
| 22 |
| 23 TEST(StringEscapeTest, JsonDoubleQuoteNarrow) { |
| 24 for (size_t i = 0; i < arraysize(json_narrow_cases); ++i) { |
| 25 std::string in = json_narrow_cases[i].to_escape; |
| 26 std::string out; |
| 27 string_escape::JsonDoubleQuote(in, false, &out); |
| 28 EXPECT_EQ(std::string(json_narrow_cases[i].escaped), out); |
| 29 } |
| 30 |
| 31 std::string in = json_narrow_cases[0].to_escape; |
17 std::string out; | 32 std::string out; |
| 33 string_escape::JsonDoubleQuote(in, false, &out); |
18 | 34 |
19 // Test wide unicode escaping | 35 // test quoting |
20 out = "testy: "; | 36 std::string out_quoted; |
21 string_escape::JavascriptDoubleQuote(WideToUTF16(kUToEscape), false, &out); | 37 string_escape::JsonDoubleQuote(in, true, &out_quoted); |
22 ASSERT_EQ(std::string("testy: ") + kUEscaped, out); | 38 EXPECT_EQ(out.length() + 2, out_quoted.length()); |
| 39 EXPECT_EQ(out_quoted.find(out), 1U); |
23 | 40 |
24 out = "testy: "; | 41 // now try with a NULL in the string |
25 string_escape::JavascriptDoubleQuote(WideToUTF16(kUToEscape), true, &out); | 42 std::string null_prepend = "test"; |
26 ASSERT_EQ(std::string("testy: ") + kUEscapedQuoted, out); | 43 null_prepend.push_back(0); |
| 44 in = null_prepend + in; |
| 45 std::string expected = "test\\u0000"; |
| 46 expected += json_narrow_cases[0].escaped; |
| 47 out.clear(); |
| 48 string_escape::JsonDoubleQuote(in, false, &out); |
| 49 EXPECT_EQ(expected, out); |
| 50 } |
27 | 51 |
28 // Test null and high bit / negative unicode values | 52 namespace { |
29 string16 str16 = UTF8ToUTF16("TeSt"); | |
30 str16.push_back(0); | |
31 str16.push_back(0xffb1); | |
32 str16.push_back(0x00ff); | |
33 | 53 |
34 out = "testy: "; | 54 const struct json_wide_test_data { |
35 string_escape::JavascriptDoubleQuote(str16, false, &out); | 55 const wchar_t* to_escape; |
36 ASSERT_EQ("testy: TeSt\\x00\\uFFB1\\xFF", out); | 56 const char* escaped; |
| 57 } json_wide_cases[] = { |
| 58 {L"b\uffb1\u00ff", "b\\uFFB1\\u00FF"}, |
| 59 {L"\b\001aZ\"\\wee", "\\b\\u0001aZ\\\"\\\\wee"}, |
| 60 {L"a\b\f\n\r\t\v\1\\.\"z", |
| 61 "a\\b\\f\\n\\r\\t\\u000B\\u0001\\\\.\\\"z"}, |
| 62 {L"b\x0f\x7f\xf0\xff!", "b\\u000F\\u007F\\u00F0\\u00FF!"}, |
| 63 }; |
37 | 64 |
38 // Test escaping of 7bit ascii | 65 } |
39 out = "testy: "; | |
40 string_escape::JavascriptDoubleQuote(std::string(kToEscape), false, &out); | |
41 ASSERT_EQ(std::string("testy: ") + kEscaped, out); | |
42 | 66 |
43 out = "testy: "; | 67 TEST(StringEscapeTest, JsonDoubleQuoteWide) { |
44 string_escape::JavascriptDoubleQuote(std::string(kToEscape), true, &out); | |
45 ASSERT_EQ(std::string("testy: ") + kEscapedQuoted, out); | |
46 | 68 |
47 // Test null, non-printable, and non-7bit | 69 for (size_t i = 0; i < arraysize(json_wide_cases); ++i) { |
48 std::string str("TeSt"); | 70 std::string out; |
49 str.push_back(0); | 71 string16 in = WideToUTF16(json_wide_cases[i].to_escape); |
50 str.push_back(15); | 72 string_escape::JsonDoubleQuote(in, false, &out); |
51 str.push_back(127); | 73 EXPECT_EQ(std::string(json_wide_cases[i].escaped), out); |
52 str.push_back(-16); | 74 } |
53 str.push_back(-128); | |
54 str.push_back('!'); | |
55 | 75 |
56 out = "testy: "; | 76 string16 in = WideToUTF16(json_wide_cases[0].to_escape); |
57 string_escape::JavascriptDoubleQuote(str, false, &out); | 77 std::string out; |
58 ASSERT_EQ("testy: TeSt\\x00\\x0F\\x7F\xf0\x80!", out); | 78 string_escape::JsonDoubleQuote(in, false, &out); |
59 | 79 |
60 // Test escape sequences | 80 // test quoting |
61 out = "testy: "; | 81 std::string out_quoted; |
62 string_escape::JavascriptDoubleQuote("a\b\f\n\r\t\v\1\\.\"z", false, &out); | 82 string_escape::JsonDoubleQuote(in, true, &out_quoted); |
63 ASSERT_EQ("testy: a\\b\\f\\n\\r\\t\\v\\x01\\\\.\\\"z", out); | 83 EXPECT_EQ(out.length() + 2, out_quoted.length()); |
| 84 EXPECT_EQ(out_quoted.find(out), 1U); |
| 85 |
| 86 // now try with a NULL in the string |
| 87 string16 null_prepend = WideToUTF16(L"test"); |
| 88 null_prepend.push_back(0); |
| 89 in = null_prepend + in; |
| 90 std::string expected = "test\\u0000"; |
| 91 expected += json_wide_cases[0].escaped; |
| 92 out.clear(); |
| 93 string_escape::JsonDoubleQuote(in, false, &out); |
| 94 EXPECT_EQ(expected, out); |
64 } | 95 } |
OLD | NEW |