1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "ecmascript/tests/test_helper.h"
17 #include "tooling/base/pt_base64.h"
18
19 using namespace panda::ecmascript::tooling;
20
21 namespace panda::test {
22 class PtBase64Test : public testing::Test {
23 public:
SetUpTestCase()24 static void SetUpTestCase()
25 {
26 GTEST_LOG_(INFO) << "SetUpTestCase";
27 }
28
TearDownTestCase()29 static void TearDownTestCase()
30 {
31 GTEST_LOG_(INFO) << "TearDownCase";
32 }
33
34 void SetUp() override
35 {
36 }
37
38 void TearDown() override
39 {
40 }
41 };
42
43
HWTEST_F_L0(PtBase64Test, EncodeAndDecodeEmptyString)44 HWTEST_F_L0(PtBase64Test, EncodeAndDecodeEmptyString)
45 {
46 std::string src;
47 std::string dest;
48
49 dest.resize(PtBase64::DecodedSize(src.size()));
50 auto [numOctets, done] = PtBase64::Decode(dest.data(), src.data(), src.size());
51 dest.resize(numOctets);
52 EXPECT_EQ(numOctets, 0u);
53 EXPECT_FALSE(done);
54
55 size_t len = PtBase64::Encode(dest.data(), src.data(), src.size());
56 EXPECT_EQ(len, 0u);
57 EXPECT_EQ(dest, "");
58 }
59
HWTEST_F_L0(PtBase64Test, EncodeAndDecodeShortText001)60 HWTEST_F_L0(PtBase64Test, EncodeAndDecodeShortText001)
61 {
62 std::string src;
63 std::string dest;
64 size_t len = 0;
65
66 {
67 src = "1";
68 dest.resize(PtBase64::EncodedSize(src.size()));
69 len = PtBase64::Encode(dest.data(), src.data(), src.size());
70 EXPECT_EQ(len, 4u);
71 EXPECT_EQ(dest, "MQ==");
72 src = dest;
73 dest.resize(PtBase64::DecodedSize(src.size()));
74 auto [numOctets, done] = PtBase64::Decode(dest.data(), src.data(), src.size());
75 dest.resize(numOctets);
76 EXPECT_EQ(numOctets, 1u);
77 EXPECT_EQ(dest, "1");
78 }
79
80 {
81 src = "12";
82 dest.resize(PtBase64::EncodedSize(src.size()));
83 len = PtBase64::Encode(dest.data(), src.data(), src.size());
84 EXPECT_EQ(len, 4u);
85 EXPECT_EQ(dest, "MTI=");
86 src = dest;
87 dest.resize(PtBase64::DecodedSize(src.size()));
88 auto [numOctets, done] = PtBase64::Decode(dest.data(), src.data(), src.size());
89 dest.resize(numOctets);
90 EXPECT_EQ(numOctets, 2u);
91 EXPECT_EQ(dest, "12");
92 }
93
94 {
95 src = "123";
96 dest.resize(PtBase64::EncodedSize(src.size()));
97 len = PtBase64::Encode(dest.data(), src.data(), src.size());
98 EXPECT_EQ(len, 4u);
99 EXPECT_EQ(dest, "MTIz");
100 src = dest;
101 auto [numOctets, done] = PtBase64::Decode(dest.data(), src.data(), src.size());
102 dest.resize(numOctets);
103 EXPECT_EQ(numOctets, 3u);
104 EXPECT_EQ(dest, "123");
105 }
106 }
107
HWTEST_F_L0(PtBase64Test, EncodeAndDecodeShortText002)108 HWTEST_F_L0(PtBase64Test, EncodeAndDecodeShortText002)
109 {
110 std::string dest;
111 std::string src = "hello";
112 dest.resize(PtBase64::EncodedSize(src.size()));
113 size_t len = PtBase64::Encode(dest.data(), src.data(), src.size());
114 EXPECT_EQ(len, 8u);
115 EXPECT_EQ(dest, "aGVsbG8=");
116 src = dest;
117 dest.resize(PtBase64::DecodedSize(src.size()));
118 auto [numOctets, done] = PtBase64::Decode(dest.data(), src.data(), src.size());
119 dest.resize(numOctets);
120 EXPECT_EQ(numOctets, 5u);
121 EXPECT_TRUE(done);
122 EXPECT_EQ(dest, "hello");
123 }
124
HWTEST_F_L0(PtBase64Test, EncodeAndDecodeLongText)125 HWTEST_F_L0(PtBase64Test, EncodeAndDecodeLongText)
126 {
127 std::string src = "If you can see this message, it means that PtBase64Decode works well";
128 std::string dest;
129 std::string encoded = "SWYgeW91IGNhbiBzZWUgdGhpcyBtZXNzYWdlLCBpdCBtZWFucyB0aGF0IFB0QmFzZ" \
130 "TY0RGVjb2RlIHdvcmtzIHdlbGw=";
131
132 dest.resize(PtBase64::EncodedSize(src.size()));
133 size_t len = PtBase64::Encode(dest.data(), src.data(), src.size());
134 EXPECT_EQ(len, 92u);
135 EXPECT_EQ(dest, encoded);
136
137 std::string decoded;
138 decoded.resize(PtBase64::DecodedSize(encoded.size()));
139 auto [numOctets, done] = PtBase64::Decode(decoded.data(), encoded.data(), encoded.size());
140 decoded.resize(numOctets);
141 EXPECT_EQ(numOctets, 68u);
142 EXPECT_TRUE(done);
143 EXPECT_EQ(decoded, src);
144 }
145
HWTEST_F_L0(PtBase64Test, EncodeUnprintableCharacter)146 HWTEST_F_L0(PtBase64Test, EncodeUnprintableCharacter)
147 {
148 std::string src = {1, 2, 3, 4, 5, 6, 7, 8, 9};
149 std::string dest;
150 dest.resize(PtBase64::EncodedSize(src.size()));
151 size_t len = PtBase64::Encode(dest.data(), src.data(), src.size());
152 EXPECT_EQ(len, 12u);
153 EXPECT_EQ(dest, "AQIDBAUGBwgJ");
154 }
155
HWTEST_F_L0(PtBase64Test, DecodeErrorNumberBase64Text)156 HWTEST_F_L0(PtBase64Test, DecodeErrorNumberBase64Text)
157 {
158 std::string src;
159 std::string dest;
160 {
161 src = "ABC";
162 dest.resize(PtBase64::DecodedSize(src.size()));
163 auto [numOctets, done] = PtBase64::Decode(dest.data(), src.data(), src.size());
164 dest.resize(numOctets);
165 EXPECT_EQ(numOctets, 0u);
166 EXPECT_EQ(dest, "");
167 }
168
169 {
170 src = "ABCDE";
171 dest.resize(PtBase64::DecodedSize(src.size()));
172 auto [numOctets, done] = PtBase64::Decode(dest.data(), src.data(), src.size());
173 dest.resize(numOctets);
174 EXPECT_EQ(numOctets, 0u);
175 EXPECT_EQ(dest, "");
176 }
177
178 {
179 src = "ABCDEF";
180 dest.resize(PtBase64::DecodedSize(src.size()));
181 auto [numOctets, done] = PtBase64::Decode(dest.data(), src.data(), src.size());
182 dest.resize(numOctets);
183 EXPECT_EQ(numOctets, 0u);
184 EXPECT_EQ(dest, "");
185 }
186 }
187
HWTEST_F_L0(PtBase64Test, EncodeAndDecodeBytesArray)188 HWTEST_F_L0(PtBase64Test, EncodeAndDecodeBytesArray)
189 {
190 std::vector<uint8_t> src = {
191 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
192 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
193 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
194 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
195 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
196 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
197 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
198 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
199 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
200 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
201 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
202 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
203 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
204 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
205 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
206 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
207 };
208 std::string dest;
209 std::string encoded = "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4O" \
210 "To7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3Bxcn" \
211 "N0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6y" \
212 "trq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm" \
213 "5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==";
214 dest.resize(PtBase64::EncodedSize(src.size()));
215 size_t len = PtBase64::Encode(dest.data(), src.data(), src.size());
216 EXPECT_EQ(len, 344u);
217 EXPECT_EQ(dest, encoded);
218
219 std::vector<uint8_t> decoded;
220 decoded.resize(PtBase64::DecodedSize(encoded.size()));
221 auto [numOctets, done] = PtBase64::Decode(decoded.data(), encoded.data(), encoded.size());
222 decoded.resize(numOctets);
223 EXPECT_EQ(numOctets, 256u);
224 EXPECT_TRUE(done);
225 EXPECT_EQ(memcmp(decoded.data(), src.data(), numOctets), 0);
226 }
227
HWTEST_F_L0(PtBase64Test, EncodeAndDecodeUnicodeCharacter001)228 HWTEST_F_L0(PtBase64Test, EncodeAndDecodeUnicodeCharacter001)
229 {
230 std::string src = u8"";
231 std::string dest;
232 dest.resize(PtBase64::EncodedSize(src.size()));
233 size_t len = PtBase64::Encode(dest.data(), src.data(), src.size());
234 EXPECT_EQ(len, 8u);
235 EXPECT_EQ(dest, "8J+YgA==");
236 src = dest;
237 dest.resize(PtBase64::DecodedSize(src.size()));
238 auto [numOctets, done] = PtBase64::Decode(dest.data(), src.data(), src.size());
239 dest.resize(numOctets);
240 EXPECT_EQ(numOctets, 4u);
241 EXPECT_TRUE(done);
242 EXPECT_EQ(dest, u8"");
243 }
244
HWTEST_F_L0(PtBase64Test, EncodeAndDecodeUnicodeCharacter002)245 HWTEST_F_L0(PtBase64Test, EncodeAndDecodeUnicodeCharacter002)
246 {
247 std::string src = "测试Base64加密解密";
248 std::string dest;
249 dest.resize(PtBase64::EncodedSize(src.size()));
250 size_t len = PtBase64::Encode(dest.data(), src.data(), src.size());
251 EXPECT_EQ(len, 32u);
252 EXPECT_EQ(dest, "5rWL6K+VQmFzZTY05Yqg5a+G6Kej5a+G");
253 src = dest;
254 dest.resize(PtBase64::DecodedSize(src.size()));
255 auto [numOctets, done] = PtBase64::Decode(dest.data(), src.data(), src.size());
256 dest.resize(numOctets);
257 EXPECT_EQ(numOctets, 24u);
258 EXPECT_TRUE(done);
259 EXPECT_EQ(dest, "测试Base64加密解密");
260 }
261
HWTEST_F_L0(PtBase64Test, EncodeAndDecodeInvalidCharacters)262 HWTEST_F_L0(PtBase64Test, EncodeAndDecodeInvalidCharacters)
263 {
264 std::string src;
265 std::string dest;
266 {
267 src = "AB#=";
268 dest.resize(PtBase64::DecodedSize(src.size()));
269 auto [numOctets, done] = PtBase64::Decode(dest.data(), src.data(), src.size());
270 EXPECT_EQ(numOctets, 1u);
271 EXPECT_FALSE(done);
272 }
273
274 {
275 src = "#AB=";
276 dest.resize(PtBase64::DecodedSize(src.size()));
277 auto [numOctets, done] = PtBase64::Decode(dest.data(), src.data(), src.size());
278 EXPECT_EQ(numOctets, 0u);
279 EXPECT_FALSE(done);
280 }
281
282 {
283 src = "AB=#";
284 dest.resize(PtBase64::DecodedSize(src.size()));
285 auto [numOctets, done] = PtBase64::Decode(dest.data(), src.data(), src.size());
286 EXPECT_EQ(numOctets, 1u);
287 EXPECT_FALSE(done);
288 }
289
290 {
291 src = "Zm9vYmFy \r\n\t";
292 dest.resize(PtBase64::DecodedSize(src.size()));
293 auto [numOctets, done] = PtBase64::Decode(dest.data(), src.data(), src.size());
294 EXPECT_EQ(numOctets, 6u);
295 EXPECT_FALSE(done);
296 }
297
298 {
299 src = "=ABC";
300 dest.resize(PtBase64::DecodedSize(src.size()));
301 auto [numOctets, done] = PtBase64::Decode(dest.data(), src.data(), src.size());
302 EXPECT_EQ(numOctets, 0u);
303 EXPECT_FALSE(done);
304 }
305
306 {
307 src = "==AB";
308 dest.resize(PtBase64::DecodedSize(src.size()));
309 auto [numOctets, done] = PtBase64::Decode(dest.data(), src.data(), src.size());
310 EXPECT_EQ(numOctets, 0u);
311 EXPECT_FALSE(done);
312 }
313 }
314 }