1 #include "base64-inl.h"
2
3 #include <cstddef>
4 #include <cstring>
5
6 #include "gtest/gtest.h"
7
8 using node::base64_decode;
9 using node::base64_encode;
10
TEST(Base64Test,Encode)11 TEST(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
TEST(Base64Test,EncodeURL)47 TEST(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
TEST(Base64Test,Decode)61 TEST(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