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