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