blob: 7a4289ea21560e0e93fd32c63caa8d6b2f0b54f6 [file] [log] [blame]
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <utils/Log.h>
#include "gtest/gtest.h"
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/AString.h>
#include <media/stagefright/foundation/AStringUtils.h>
#include <media/stagefright/foundation/base64.h>
#include <utils/RefBase.h>
#include <utils/String8.h>
namespace {
const android::String8 kBase64Padding("=");
};
namespace android {
class Base64Test : public ::testing::Test {
};
void verifyDecode(const AString* expected, const AString* in) {
size_t numTests = 0;
while (!expected[numTests].empty())
++numTests;
for (size_t i = 0; i < numTests; ++i) {
// Since android::decodeBase64() requires padding characters,
// add them so length of encoded text is exactly a multiple of 4.
int remainder = in[i].size() % 4;
String8 paddedText(in[i].c_str());
if (remainder > 0) {
for (int i = 0; i < 4 - remainder; ++i) {
paddedText.append(kBase64Padding);
}
}
sp<ABuffer> result = decodeBase64(AString(paddedText.string()));
ASSERT_EQ(AStringUtils::Compare(expected[i].c_str(),
reinterpret_cast<char*>(result->data()),
expected[i].size(), false), 0);
}
}
void verifyEncode(const AString* expected, const AString* in) {
size_t numTests = 0;
while (!expected[numTests].empty())
++numTests;
AString out = AString("");
for (size_t i = 0; i < numTests; ++i) {
encodeBase64Url(in[i].c_str(), in[i].size(), &out);
ASSERT_EQ(AStringUtils::Compare(expected[i].c_str(), out.c_str(),
expected[i].size(), false), 0);
}
}
TEST_F(Base64Test, TestDecodeBase64) {
const AString base64[] = {
AString("SGVsbG8gRnJpZW5kIQ"),
AString("R29vZCBkYXkh"),
AString("") // string to signal end of array
};
const AString clearText[] = {
AString("Hello Friend!"),
AString("Good day!"),
AString("")
};
verifyDecode(clearText, base64);
}
TEST_F(Base64Test, TestDecodeBase64Url) {
const AString base64Url[] = {
AString("SGVsbG8gRnJpZW5kICE-Pw"),
AString("SGVsbG8gRnJpZW5kICE_"),
AString("SGVsbG8gPz4-IEZyaWVuZCA_Pg"),
AString("")
};
const AString clearText[] = {
AString("Hello Friend !>?"),
AString("Hello Friend !?"),
AString("Hello ?>> Friend ?>"),
AString("")
};
verifyDecode(clearText, base64Url);
}
TEST_F(Base64Test, TestDecodeMalformedBase64) {
const AString base64Url[] = {
AString("1?GawgguFyGrWKav7AX4VKUg"), // fail on parsing
AString("GawgguFyGrWKav7AX4V???"), // fail on length not multiple of 4
AString("GawgguFyGrWKav7AX4VKUg"), // ditto
};
for (size_t i = 0; i < 3; ++i) {
sp<ABuffer> result = decodeBase64(AString(base64Url[i]));
EXPECT_TRUE(result == nullptr);
}
}
TEST_F(Base64Test, TestEncodeBase64) {
const AString clearText[] = {
AString("Hello Friend!"),
AString("Good day!"),
AString("")
};
const AString base64[] = {
AString("SGVsbG8gRnJpZW5kIQ=="),
AString("R29vZCBkYXkh"),
AString("")
};
verifyEncode(base64, clearText);
}
TEST_F(Base64Test, TestEncodeBase64Url) {
const AString clearText[] = {
AString("Hello Friend !>?"),
AString("Hello Friend !?"),
AString("Hello ?>> Friend ?>"),
AString("")
};
const AString base64Url[] = {
AString("SGVsbG8gRnJpZW5kICE-Pw=="),
AString("SGVsbG8gRnJpZW5kICE_"),
AString("SGVsbG8gPz4-IEZyaWVuZCA_Pg"),
AString("")
};
verifyEncode(base64Url, clearText);
}
} // namespace android