xref: /third_party/node/test/cctest/test_base64.cc (revision 1cb0ef41)
1#include "base64-inl.h"
2
3#include <cstddef>
4#include <cstring>
5
6#include "gtest/gtest.h"
7
8using node::base64_decode;
9using node::base64_encode;
10
11TEST(Base64Test, Encode) {
12  auto test = [](const char* string, const char* base64_string) {
13    const size_t len = strlen(base64_string);
14    char* const buffer = new char[len + 1];
15    buffer[len] = 0;
16    base64_encode(string, strlen(string), buffer, len);
17    EXPECT_STREQ(base64_string, buffer);
18    delete[] buffer;
19  };
20
21  test("a", "YQ==");
22  test("ab", "YWI=");
23  test("abc", "YWJj");
24  test("abcd", "YWJjZA==");
25  test("abcde", "YWJjZGU=");
26  test("abcdef", "YWJjZGVm");
27
28  test("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do "
29       "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut "
30       "enim ad minim veniam, quis nostrud exercitation ullamco laboris "
31       "nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in "
32       "reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla "
33       "pariatur. Excepteur sint occaecat cupidatat non proident, sunt in "
34       "culpa qui officia deserunt mollit anim id est laborum.",
35
36       "TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2Npbmcg"
37       "ZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0"
38       "IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlz"
39       "IG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1"
40       "aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBp"
41       "biByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xv"
42       "cmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNh"
43       "dCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lh"
44       "IGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLg==");
45}
46
47TEST(Base64Test, EncodeURL) {
48  auto test = [](const char* string, const char* base64_string) {
49    const size_t len = strlen(base64_string);
50    char* const buffer = new char[len + 1];
51    buffer[len] = 0;
52    base64_encode(string, strlen(string), buffer, len, node::Base64Mode::URL);
53    EXPECT_STREQ(base64_string, buffer);
54    delete[] buffer;
55  };
56
57  test("\x68\xd9\x16\x25\x5c\x1e\x40\x92\x2d\xfb", "aNkWJVweQJIt-w");
58  test("\xac\xc7\x93\xaa\x83\x6f\xc3\xe3\x3f\x75", "rMeTqoNvw-M_dQ");
59}
60
61TEST(Base64Test, Decode) {
62  auto test = [](const char* base64_string, const char* string) {
63    const size_t len = strlen(string);
64    char* const buffer = new char[len + 1];
65    buffer[len] = 0;
66    base64_decode(buffer, len, base64_string, strlen(base64_string));
67    EXPECT_STREQ(string, buffer);
68    delete[] buffer;
69  };
70
71  test("YQ", "a");
72  test("Y Q", "a");
73  test("Y Q ", "a");
74  test(" Y Q", "a");
75  test("Y Q==", "a");
76  test("YQ ==", "a");
77  test("YQ == junk", "a");
78  test("YWI", "ab");
79  test("YWI=", "ab");
80  test("YWJj", "abc");
81  test("YWJjZA", "abcd");
82  test("YWJjZA==", "abcd");
83  test("YW Jj ZA ==", "abcd");
84  test("YWJjZGU=", "abcde");
85  test("YWJjZGVm", "abcdef");
86  test("Y WJjZGVm", "abcdef");
87  test("YW JjZGVm", "abcdef");
88  test("YWJ jZGVm", "abcdef");
89  test("YWJj ZGVm", "abcdef");
90  test("Y W J j Z G V m", "abcdef");
91  test("Y   W\n JjZ \nG Vm", "abcdef");
92  test("rMeTqoNvw-M_dQ", "\xac\xc7\x93\xaa\x83\x6f\xc3\xe3\x3f\x75");
93
94  const char* text =
95      "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do "
96      "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut "
97      "enim ad minim veniam, quis nostrud exercitation ullamco laboris "
98      "nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in "
99      "reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla "
100      "pariatur. Excepteur sint occaecat cupidatat non proident, sunt in "
101      "culpa qui officia deserunt mollit anim id est laborum.";
102
103  test("TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2Npbmcg"
104       "ZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0"
105       "IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlz"
106       "IG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1"
107       "aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBp"
108       "biByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xv"
109       "cmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNh"
110       "dCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lh"
111       "IGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLg==", text);
112
113  test("TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2Npbmcg"
114       "ZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0"
115       "IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlz"
116       "IG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1"
117       "aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBp"
118       "biByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xv"
119       "cmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNh"
120       "dCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lh"
121       "IGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLg", text);
122
123  test("TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2Npbmcg\n"
124       "ZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0\n"
125       "IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlz\n"
126       "IG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1\n"
127       "aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBp\n"
128       "biByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xv\n"
129       "cmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNh\n"
130       "dCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lh\n"
131       "IGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLg==", text);
132
133  test("TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2Npbmcg\n"
134       "ZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0\n"
135       "IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlz\n"
136       "IG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1\n"
137       "aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBp\n"
138       "biByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xv\n"
139       "cmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNh\n"
140       "dCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lh\n"
141       "IGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLg", text);
142}
143