• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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