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