1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
#include "base64.hh"
#include <algorithm>
#include <cstddef>
#include <cstdint>
#include <gtest/gtest.h>
#include <iterator>
#include <vector>
TEST(Base64, empty) {
auto str = base64::encode({});
EXPECT_EQ("", str);
auto data = base64::decode("");
ASSERT_TRUE(data.has_value());
EXPECT_TRUE(data->empty());
}
TEST(Base64, all_bytes) {
std::vector<uint8_t> in;
in.push_back(0);
for (uint8_t i = 0; i < 255; ++i) {
in.push_back(i + 1);
}
auto str = base64::encode(in);
EXPECT_EQ(
"AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1"
"Njc4"
"OTo7PD0+"
"P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3Bx"
"cnN0dXZ3eHl6e3x9fn+"
"AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmq"
"q6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/"
"g4eLj"
"5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==",
str);
auto data = base64::decode(str);
ASSERT_TRUE(data.has_value());
EXPECT_EQ(in, data.value());
}
TEST(Base64, rfc) {
std::string_view in = "foobar";
std::vector<std::string_view> expected{
"", "Zg==", "Zm8=", "Zm9v", "Zm9vYg==", "Zm9vYmE=", "Zm9vYmFy",
};
for (size_t i = 0; i <= in.size(); ++i) {
auto in_part = in.substr(0, i);
std::vector<uint8_t> in_bytes;
std::ranges::copy(in_part, std::back_inserter(in_bytes));
auto str = base64::encode(in_bytes);
EXPECT_EQ(expected[i], str);
auto data = base64::decode(str);
ASSERT_TRUE(data.has_value());
EXPECT_EQ(in_bytes, data.value());
}
}
TEST(Base64, invalid) {
std::vector<uint8_t> out;
EXPECT_FALSE(base64::decode("=", out));
EXPECT_FALSE(base64::decode("==", out));
EXPECT_FALSE(base64::decode("===", out));
EXPECT_FALSE(base64::decode("====", out));
EXPECT_FALSE(base64::decode("<>", out));
EXPECT_FALSE(base64::decode("Z", out));
EXPECT_FALSE(base64::decode("Zg", out));
EXPECT_FALSE(base64::decode("Zg=", out));
}
|