| // Copyright 2013 The Flutter Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "flutter/shell/common/base64.h" | |
| #include "fml/logging.h" | |
| #include "gtest/gtest.h" | |
| #include <string> | |
| namespace flutter { | |
| namespace testing { | |
| TEST(Base64, EncodeStrings) { | |
| auto test = [](const std::string& input, const std::string& output) { | |
| char buffer[256]; | |
| size_t len = Base64::Encode(input.c_str(), input.length(), &buffer); | |
| FML_CHECK(len <= 256); | |
| ASSERT_EQ(len, Base64::EncodedSize(input.length())); | |
| std::string actual(buffer, len); | |
| ASSERT_STREQ(actual.c_str(), output.c_str()); | |
| }; | |
| // Some arbitrary strings | |
| test("apple", "YXBwbGU="); | |
| test("BANANA", "QkFOQU5B"); | |
| test("Cherry Pie", "Q2hlcnJ5IFBpZQ=="); | |
| test("fLoCcInAuCiNiHiLiPiLiFiCaTiOn", | |
| "ZkxvQ2NJbkF1Q2lOaUhpTGlQaUxpRmlDYVRpT24="); | |
| test("", ""); | |
| } | |
| TEST(Base64, EncodeBytes) { | |
| auto test = [](const uint8_t input[], size_t num, const std::string& output) { | |
| char buffer[512]; | |
| size_t len = Base64::Encode(input, num, &buffer); | |
| FML_CHECK(len <= 512); | |
| ASSERT_EQ(len, Base64::EncodedSize(num)); | |
| std::string actual(buffer, len); | |
| ASSERT_STREQ(actual.c_str(), output.c_str()); | |
| }; | |
| // Some arbitrary raw bytes | |
| uint8_t e[] = {0x02, 0x71, 0x82, 0x81, 0x82, 0x84, 0x59}; | |
| test(e, sizeof(e), "AnGCgYKEWQ=="); | |
| uint8_t pi[] = {0x03, 0x24, 0x3F, 0x6A, 0x88, 0x85}; | |
| test(pi, sizeof(pi), "AyQ/aoiF"); | |
| uint8_t bytes[256]; | |
| for (int i = 0; i < 256; i++) { | |
| bytes[i] = i; | |
| } | |
| test(bytes, sizeof(bytes), | |
| "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gIS" | |
| "IjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFV" | |
| "WV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJ" | |
| "iouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8v" | |
| "b6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8P" | |
| "Hy8/T19vf4+fr7/P3+/w=="); | |
| } | |
| TEST(Base64, DecodeStringsSuccess) { | |
| auto test = [](const std::string& input, const std::string& output) { | |
| char buffer[256]; | |
| size_t len = 0; | |
| auto err = Base64::Decode(input.c_str(), input.length(), &buffer, &len); | |
| ASSERT_EQ(err, Base64::Error::kNone); | |
| FML_CHECK(len <= 256); | |
| std::string actual(buffer, len); | |
| ASSERT_STREQ(actual.c_str(), output.c_str()); | |
| }; | |
| // Some arbitrary strings | |
| test("ZGF0ZQ==", "date"); | |
| test("RWdncGxhbnQ=", "Eggplant"); | |
| test("RmlzaCAmIENoaXBz", "Fish & Chips"); | |
| test("U3VQZVJjQWxJZlJhR2lMaVN0SWNFeFBpQWxJZE9jSW9Vcw==", | |
| "SuPeRcAlIfRaGiLiStIcExPiAlIdOcIoUs"); | |
| // Spaces are ignored | |
| test("Y X Bwb GU=", "apple"); | |
| } | |
| TEST(Base64, DecodeStringsHasErrors) { | |
| auto test = [](const std::string& input, Base64::Error expectedError) { | |
| char buffer[256]; | |
| size_t len = 0; | |
| auto err = Base64::Decode(input.c_str(), input.length(), &buffer, &len); | |
| ASSERT_EQ(err, expectedError) << input; | |
| }; | |
| test("Nuts&Bolts", Base64::Error::kBadChar); | |
| test("Error!", Base64::Error::kBadChar); | |
| test(":", Base64::Error::kBadChar); | |
| test("RmlzaCAmIENoaXBz=", Base64::Error::kBadPadding); | |
| // Some cases of bad padding may be ignored due to an internal optimization | |
| // test("ZGF0ZQ=", Base64::Error::kBadPadding); | |
| // test("RWdncGxhbnQ", Base64::Error::kBadPadding); | |
| } | |
| TEST(Base64, DecodeBytes) { | |
| auto test = [](const std::string& input, const uint8_t output[], size_t num) { | |
| char buffer[256]; | |
| size_t len = 0; | |
| auto err = Base64::Decode(input.c_str(), input.length(), &buffer, &len); | |
| ASSERT_EQ(err, Base64::Error::kNone); | |
| FML_CHECK(len <= 256); | |
| ASSERT_EQ(num, len) << input; | |
| for (int i = 0; i < int(len); i++) { | |
| ASSERT_EQ(uint8_t(buffer[i]), output[i]) << input << i; | |
| } | |
| }; | |
| // Some arbitrary raw bytes, same as the byte output above | |
| uint8_t e[] = {0x02, 0x71, 0x82, 0x81, 0x82, 0x84, 0x59}; | |
| test("AnGCgYKEWQ==", e, sizeof(e)); | |
| uint8_t pi[] = {0x03, 0x24, 0x3F, 0x6A, 0x88, 0x85}; | |
| test("AyQ/aoiF", pi, sizeof(pi)); | |
| } | |
| } // namespace testing | |
| } // namespace flutter |