blob: 549c478d83a59546e9066229ea0c550d9a105814 [file] [log] [blame]
Alex Vakulenkoad93c042014-08-20 15:47:36 -07001// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <chromeos/data_encoding.h>
6
Steve Fungd06bc932015-02-05 14:50:30 -08007#include <algorithm>
8
Alex Vakulenkoad93c042014-08-20 15:47:36 -07009#include <gtest/gtest.h>
10
11namespace chromeos {
12namespace data_encoding {
13
14TEST(data_encoding, UrlEncoding) {
15 std::string test = "\"http://sample/path/0014.html \"";
16 std::string encoded = UrlEncode(test.c_str());
Alex Vakulenko05d29042015-01-13 09:39:25 -080017 EXPECT_EQ("%22http%3A%2F%2Fsample%2Fpath%2F0014.html+%22", encoded);
Alex Vakulenkoad93c042014-08-20 15:47:36 -070018 EXPECT_EQ(test, UrlDecode(encoded.c_str()));
19
20 test = "\"http://sample/path/0014.html \"";
21 encoded = UrlEncode(test.c_str(), false);
Alex Vakulenko05d29042015-01-13 09:39:25 -080022 EXPECT_EQ("%22http%3A%2F%2Fsample%2Fpath%2F0014.html%20%22", encoded);
Alex Vakulenkoad93c042014-08-20 15:47:36 -070023 EXPECT_EQ(test, UrlDecode(encoded.c_str()));
24}
25
26TEST(data_encoding, WebParamsEncoding) {
Alex Vakulenko05d29042015-01-13 09:39:25 -080027 std::string encoded =
28 WebParamsEncode({{"q", "test"}, {"path", "/usr/bin"}, {"#", "%"}});
Alex Vakulenkoad93c042014-08-20 15:47:36 -070029 EXPECT_EQ("q=test&path=%2Fusr%2Fbin&%23=%25", encoded);
30
31 auto params = WebParamsDecode(encoded);
32 EXPECT_EQ(3, params.size());
33 EXPECT_EQ("q", params[0].first);
34 EXPECT_EQ("test", params[0].second);
35 EXPECT_EQ("path", params[1].first);
36 EXPECT_EQ("/usr/bin", params[1].second);
37 EXPECT_EQ("#", params[2].first);
38 EXPECT_EQ("%", params[2].second);
39}
40
Steve Fungd06bc932015-02-05 14:50:30 -080041TEST(data_encoding, Base64Encode) {
42 const std::string text1 = "hello world";
43 const std::string encoded1 = "aGVsbG8gd29ybGQ=";
44
45 const std::string text2 =
46 "Lorem ipsum dolor sit amet, facilisis erat nec aliquam, scelerisque "
47 "molestie commodo. Viverra tincidunt integer erat ipsum, integer "
48 "molestie, arcu in, sit mauris ac a sed sit etiam.";
49 const std::string encoded2 =
50 "TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGZhY2lsaXNpcyBlcmF0IG5lYyBhbGlxdWF"
51 "tLCBzY2VsZXJpc3F1ZSBtb2xlc3RpZSBjb21tb2RvLiBWaXZlcnJhIHRpbmNpZHVudCBpbn"
52 "RlZ2VyIGVyYXQgaXBzdW0sIGludGVnZXIgbW9sZXN0aWUsIGFyY3UgaW4sIHNpdCBtYXVya"
53 "XMgYWMgYSBzZWQgc2l0IGV0aWFtLg==";
54
55 chromeos::Blob data3(256);
56 std::iota(data3.begin(), data3.end(), 0); // Fills the buffer with 0x00-0xFF.
57 const std::string encoded3 =
58 "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ"
59 "1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaW"
60 "prbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en"
61 "6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU"
62 "1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==";
63
64 EXPECT_EQ(encoded1, Base64Encode(text1));
65 EXPECT_EQ(encoded2, Base64Encode(text2));
66 EXPECT_EQ(encoded3, Base64Encode(data3));
67}
68
69TEST(data_encoding, Base64EncodeWrapLines) {
70 const std::string text1 = "hello world";
71 const std::string encoded1 = "aGVsbG8gd29ybGQ=\n";
72
73 const std::string text2 =
74 "Lorem ipsum dolor sit amet, facilisis erat nec aliquam, scelerisque "
75 "molestie commodo. Viverra tincidunt integer erat ipsum, integer "
76 "molestie, arcu in, sit mauris ac a sed sit etiam.";
77 const std::string encoded2 =
78 "TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGZhY2lsaXNpcyBlcmF0IG5lYyBh\n"
79 "bGlxdWFtLCBzY2VsZXJpc3F1ZSBtb2xlc3RpZSBjb21tb2RvLiBWaXZlcnJhIHRp\n"
80 "bmNpZHVudCBpbnRlZ2VyIGVyYXQgaXBzdW0sIGludGVnZXIgbW9sZXN0aWUsIGFy\n"
81 "Y3UgaW4sIHNpdCBtYXVyaXMgYWMgYSBzZWQgc2l0IGV0aWFtLg==\n";
82
83 chromeos::Blob data3(256);
84 std::iota(data3.begin(), data3.end(), 0); // Fills the buffer with 0x00-0xFF.
85 const std::string encoded3 =
86 "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4v\n"
87 "MDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5f\n"
88 "YGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6P\n"
89 "kJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/\n"
90 "wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v\n"
91 "8PHy8/T19vf4+fr7/P3+/w==\n";
92
93 EXPECT_EQ(encoded1, Base64EncodeWrapLines(text1));
94 EXPECT_EQ(encoded2, Base64EncodeWrapLines(text2));
95 EXPECT_EQ(encoded3, Base64EncodeWrapLines(data3));
96}
97
98TEST(data_encoding, Base64Decode) {
99 const std::string encoded1 = "dGVzdCBzdHJpbmc=";
100
101 const std::string encoded2 =
102 "TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGZhY2lsaXNpcyBlcmF0IG5lYyBh\n"
103 "bGlxdWFtLCBzY2VsZXJpc3F1ZSBtb2xlc3RpZSBjb21tb2RvLiBWaXZlcnJhIHRp\r\n"
104 "bmNpZHVudCBpbnRlZ2VyIGVyYXQgaXBzdW0sIGludGVnZXIgbW9sZXN0aWUsIGFy\r"
105 "Y3UgaW4sIHNpdCBtYXVyaXMgYWMgYSBzZWQgc2l0IGV0aWFt\n"
106 "Lg==\n\n\n";
107 const std::string decoded2 =
108 "Lorem ipsum dolor sit amet, facilisis erat nec aliquam, scelerisque "
109 "molestie commodo. Viverra tincidunt integer erat ipsum, integer "
110 "molestie, arcu in, sit mauris ac a sed sit etiam.";
111
112 const std::string encoded3 =
113 "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ"
114 "1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaW"
115 "prbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en"
116 "6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU"
117 "1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==";
118 chromeos::Blob decoded3(256);
119 std::iota(decoded3.begin(), decoded3.end(), 0); // Fill with 0x00..0xFF.
120
121 std::string decoded;
122 EXPECT_TRUE(Base64Decode(encoded1, &decoded));
123 EXPECT_EQ("test string", decoded);
124
125 EXPECT_TRUE(Base64Decode(encoded2, &decoded));
126 EXPECT_EQ(decoded2, decoded);
127
128 chromeos::Blob decoded_blob;
129 EXPECT_TRUE(Base64Decode(encoded3, &decoded_blob));
130 EXPECT_EQ(decoded3, decoded_blob);
131
132 EXPECT_FALSE(Base64Decode("A", &decoded_blob));
133 EXPECT_TRUE(decoded_blob.empty());
134
135 EXPECT_TRUE(Base64Decode("/w==", &decoded_blob));
136 EXPECT_EQ((chromeos::Blob{0xFF}), decoded_blob);
137
138 EXPECT_TRUE(Base64Decode("//8=", &decoded_blob));
139 EXPECT_EQ((chromeos::Blob{0xFF, 0xFF}), decoded_blob);
140
141 EXPECT_FALSE(Base64Decode("AAECAwQFB,cI", &decoded_blob));
142 EXPECT_TRUE(decoded_blob.empty());
143}
144
Alex Vakulenkoad93c042014-08-20 15:47:36 -0700145} // namespace data_encoding
146} // namespace chromeos