summaryrefslogtreecommitdiff
path: root/test/base64.cc
blob: 47cdfa456de27a1a9ca3f53eb2fae4edce5e19ec (plain)
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));
}