#include "base64.hh" #include #include #include #include #include #include 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 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 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 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 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)); }