blob: cb73da6d69b7683063cb2075751a28d8a5ba0528 [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
Alex Vakulenko9ed0cab2015-10-12 15:21:28 -07005#include <brillo/data_encoding.h>
Alex Vakulenkoad93c042014-08-20 15:47:36 -07006
Steve Fungd06bc932015-02-05 14:50:30 -08007#include <algorithm>
Bertrand SIMONNETb57c2ee2015-07-15 10:14:34 -07008#include <numeric>
Steve Fungd06bc932015-02-05 14:50:30 -08009
Alex Vakulenkoad93c042014-08-20 15:47:36 -070010#include <gtest/gtest.h>
11
Alex Vakulenko9ed0cab2015-10-12 15:21:28 -070012namespace brillo {
Alex Vakulenkoad93c042014-08-20 15:47:36 -070013namespace data_encoding {
14
15TEST(data_encoding, UrlEncoding) {
16 std::string test = "\"http://sample/path/0014.html \"";
17 std::string encoded = UrlEncode(test.c_str());
Alex Vakulenko05d29042015-01-13 09:39:25 -080018 EXPECT_EQ("%22http%3A%2F%2Fsample%2Fpath%2F0014.html+%22", encoded);
Alex Vakulenkoad93c042014-08-20 15:47:36 -070019 EXPECT_EQ(test, UrlDecode(encoded.c_str()));
20
21 test = "\"http://sample/path/0014.html \"";
22 encoded = UrlEncode(test.c_str(), false);
Alex Vakulenko05d29042015-01-13 09:39:25 -080023 EXPECT_EQ("%22http%3A%2F%2Fsample%2Fpath%2F0014.html%20%22", encoded);
Alex Vakulenkoad93c042014-08-20 15:47:36 -070024 EXPECT_EQ(test, UrlDecode(encoded.c_str()));
25}
26
27TEST(data_encoding, WebParamsEncoding) {
Alex Vakulenko05d29042015-01-13 09:39:25 -080028 std::string encoded =
29 WebParamsEncode({{"q", "test"}, {"path", "/usr/bin"}, {"#", "%"}});
Alex Vakulenkoad93c042014-08-20 15:47:36 -070030 EXPECT_EQ("q=test&path=%2Fusr%2Fbin&%23=%25", encoded);
31
32 auto params = WebParamsDecode(encoded);
33 EXPECT_EQ(3, 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
Steve Fungd06bc932015-02-05 14:50:30 -080042TEST(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
Alex Vakulenko9ed0cab2015-10-12 15:21:28 -070056 brillo::Blob data3(256);
Steve Fungd06bc932015-02-05 14:50:30 -080057 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
70TEST(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
Alex Vakulenko9ed0cab2015-10-12 15:21:28 -070084 brillo::Blob data3(256);
Steve Fungd06bc932015-02-05 14:50:30 -080085 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
99TEST(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==";
Alex Vakulenko9ed0cab2015-10-12 15:21:28 -0700119 brillo::Blob decoded3(256);
Steve Fungd06bc932015-02-05 14:50:30 -0800120 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
Alex Vakulenko9ed0cab2015-10-12 15:21:28 -0700129 brillo::Blob decoded_blob;
Steve Fungd06bc932015-02-05 14:50:30 -0800130 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));
Alex Vakulenko9ed0cab2015-10-12 15:21:28 -0700137 EXPECT_EQ((brillo::Blob{0xFF}), decoded_blob);
Steve Fungd06bc932015-02-05 14:50:30 -0800138
139 EXPECT_TRUE(Base64Decode("//8=", &decoded_blob));
Alex Vakulenko9ed0cab2015-10-12 15:21:28 -0700140 EXPECT_EQ((brillo::Blob{0xFF, 0xFF}), decoded_blob);
Steve Fungd06bc932015-02-05 14:50:30 -0800141
142 EXPECT_FALSE(Base64Decode("AAECAwQFB,cI", &decoded_blob));
143 EXPECT_TRUE(decoded_blob.empty());
144}
145
Alex Vakulenkoad93c042014-08-20 15:47:36 -0700146} // namespace data_encoding
Alex Vakulenko9ed0cab2015-10-12 15:21:28 -0700147} // namespace brillo