You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

367 lines
14 KiB

/*
* Copyright (C) 2019 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.
*/
// Unit Test for EcoData.
//#define LOG_NDEBUG 0
#define LOG_TAG "ECODataTest"
#include <android-base/unique_fd.h>
#include <binder/Parcel.h>
#include <binder/Parcelable.h>
#include <cutils/ashmem.h>
#include <gtest/gtest.h>
#include <math.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <utils/Log.h>
#include "eco/ECOData.h"
#include "eco/ECODataKey.h"
namespace android {
namespace media {
namespace eco {
TEST(EcoDataTest, TestConstructor1) {
std::unique_ptr<ECOData> data = std::make_unique<ECOData>();
EXPECT_EQ(data->getDataType(), ECOData::DATA_TYPE_UNKNOWN);
EXPECT_EQ(data->getDataTimeUs(), -1);
}
TEST(EcoDataTest, TestConstructor2) {
std::unique_ptr<ECOData> data = std::make_unique<ECOData>(ECOData::DATA_TYPE_STATS);
EXPECT_EQ(data->getDataType(), ECOData::DATA_TYPE_STATS);
EXPECT_EQ(data->getDataTimeUs(), -1);
}
TEST(EcoDataTest, TestConstructor3) {
std::unique_ptr<ECOData> data = std::make_unique<ECOData>(ECOData::DATA_TYPE_STATS, 1000);
EXPECT_EQ(data->getDataType(), ECOData::DATA_TYPE_STATS);
EXPECT_EQ(data->getDataTimeUs(), 1000);
}
TEST(EcoDataTest, TestNormalSetAndFindString) {
std::unique_ptr<ECOData> data = std::make_unique<ECOData>(ECOData::DATA_TYPE_STATS, 1000);
data->setString(ENCODER_TYPE, "avc");
std::string testValue;
EXPECT_TRUE(data->findString(ENCODER_TYPE, &testValue) == ECODataStatus::OK);
EXPECT_EQ(testValue, "avc");
// Override existing key.
data->setString(ENCODER_TYPE, "hevc");
EXPECT_EQ(data->findString(ENCODER_TYPE, &testValue), ECODataStatus::OK);
EXPECT_EQ(testValue, "hevc");
}
TEST(EcoDataTest, TestSetAndFindMultipleString) {
std::unique_ptr<ECOData> data = std::make_unique<ECOData>(ECOData::DATA_TYPE_STATS, 1000);
std::unordered_map<std::string, std::string> inputEntries = {
{"name1", "avc"}, {"name2", "avc2"}, {"name3", "avc3"}, {"name4", "avc4"},
{"name5", "avc5"}, {"name6", "avc6"}, {"name7", "avc7"}, {"name8", "avc8"},
{"name9", "avc9"}, {"name10", "avc10"}, {"name11", "avc11"}, {"name12", "avc12"}};
for (auto it = inputEntries.begin(); it != inputEntries.end(); ++it) {
data->setString(it->first, it->second);
}
// Checks if the string exist in the ECOData.
for (auto it = inputEntries.begin(); it != inputEntries.end(); ++it) {
std::string testValue;
EXPECT_TRUE(data->findString(it->first, &testValue) == ECODataStatus::OK);
EXPECT_EQ(testValue, it->second);
}
}
TEST(EcoDataTest, TestSetAndFindInvalidString) {
std::unique_ptr<ECOData> data = std::make_unique<ECOData>(ECOData::DATA_TYPE_STATS, 1000);
// Test read to null ptr and expect failure
EXPECT_TRUE(data->findString("encoder-name", nullptr) != ECODataStatus::OK);
// Test find non-existing key and expect failure.
std::string testValue;
EXPECT_TRUE(data->findString("encoder-name", &testValue) != ECODataStatus::OK);
// Test set empty key and expect failure
EXPECT_TRUE(data->setString("", "avc") != ECODataStatus::OK);
// Test read empty key and expect failure
EXPECT_TRUE(data->findString("", &testValue) != ECODataStatus::OK);
}
TEST(EcoDataTest, TestNormalSetAndFindInt32) {
std::unique_ptr<ECOData> data = std::make_unique<ECOData>(ECOData::DATA_TYPE_STATS, 1000);
data->setInt32(ENCODER_TARGET_BITRATE_BPS, 2000000);
int32_t testValue;
EXPECT_TRUE(data->findInt32(ENCODER_TARGET_BITRATE_BPS, &testValue) == ECODataStatus::OK);
EXPECT_EQ(testValue, 2000000);
// Override existing key.
data->setInt32(ENCODER_TARGET_BITRATE_BPS, 2200000);
EXPECT_EQ(data->findInt32(ENCODER_TARGET_BITRATE_BPS, &testValue), ECODataStatus::OK);
EXPECT_EQ(testValue, 2200000);
}
TEST(EcoDataTest, TestSetAndFindMultipleInt32) {
std::unique_ptr<ECOData> data = std::make_unique<ECOData>(ECOData::DATA_TYPE_STATS, 1000);
std::unordered_map<std::string, int32_t> inputEntries = {
{"name1", 100}, {"name2", 200}, {"name3", 300}, {"name4", 400},
{"name5", 500}, {"name6", 600}, {"name7", 700}, {"name8", 800},
{"name9", 900}, {"name10", 10000}, {"name11", 110000}, {"name12", 120000}};
for (auto it = inputEntries.begin(); it != inputEntries.end(); ++it) {
data->setInt32(it->first, it->second);
}
// Checks if the string exist in the ECOData.
for (auto it = inputEntries.begin(); it != inputEntries.end(); ++it) {
int32_t testValue;
EXPECT_TRUE(data->findInt32(it->first, &testValue) == ECODataStatus::OK);
EXPECT_EQ(testValue, it->second);
}
}
TEST(EcoDataTest, TestSetAndFindInvalidInt32) {
std::unique_ptr<ECOData> data = std::make_unique<ECOData>(ECOData::DATA_TYPE_STATS, 1000);
// Test read to null ptr and expect failure
EXPECT_TRUE(data->findInt32("encoder-name", nullptr) != ECODataStatus::OK);
// Test find non-existing key and expect failure.
int32_t testValue;
EXPECT_TRUE(data->findInt32("encoder-name", &testValue) != ECODataStatus::OK);
// Test set empty key and expect failure
EXPECT_TRUE(data->setInt32("", 1000) != ECODataStatus::OK);
// Test read empty key and expect failure
EXPECT_TRUE(data->findInt32("", &testValue) != ECODataStatus::OK);
}
TEST(EcoDataTest, TestNormalSetAndFindInt64) {
std::unique_ptr<ECOData> data = std::make_unique<ECOData>(ECOData::DATA_TYPE_STATS, 1000);
data->setInt64(ENCODER_TARGET_BITRATE_BPS, 2000000);
int64_t testValue;
EXPECT_TRUE(data->findInt64(ENCODER_TARGET_BITRATE_BPS, &testValue) == ECODataStatus::OK);
EXPECT_EQ(testValue, 2000000);
// Override existing key.
data->setInt64(ENCODER_TARGET_BITRATE_BPS, 2200000);
EXPECT_EQ(data->findInt64(ENCODER_TARGET_BITRATE_BPS, &testValue), ECODataStatus::OK);
EXPECT_EQ(testValue, 2200000);
}
TEST(EcoDataTest, TestNormalSetAndFindMultipleInt64) {
std::unique_ptr<ECOData> data = std::make_unique<ECOData>(ECOData::DATA_TYPE_STATS, 1000);
std::unordered_map<std::string, int64_t> inputEntries = {
{"name1", 100}, {"name2", 200}, {"name3", 300}, {"name4", 400},
{"name5", 500}, {"name6", 600}, {"name7", 700}, {"name8", 800},
{"name9", 900}, {"name10", 10000}, {"name11", 110000}, {"name12", 120000}};
for (auto it = inputEntries.begin(); it != inputEntries.end(); ++it) {
data->setInt64(it->first, it->second);
}
// Checks if the string exist in the ECOData.
for (auto it = inputEntries.begin(); it != inputEntries.end(); ++it) {
int64_t testValue;
EXPECT_TRUE(data->findInt64(it->first, &testValue) == ECODataStatus::OK);
EXPECT_EQ(testValue, it->second);
}
}
TEST(EcoDataTest, TestSetAndFindInvalidInt64) {
std::unique_ptr<ECOData> data = std::make_unique<ECOData>(ECOData::DATA_TYPE_STATS, 1000);
// Test read to null ptr and expect failure
EXPECT_TRUE(data->findInt64("encoder-name", nullptr) != ECODataStatus::OK);
// Test find non-existing key and expect failure.
int64_t testValue;
EXPECT_TRUE(data->findInt64("encoder-name", &testValue) != ECODataStatus::OK);
// Test set empty key and expect failure
EXPECT_TRUE(data->setInt64("", 1000) != ECODataStatus::OK);
// Test read empty key and expect failure
EXPECT_TRUE(data->findInt64("", &testValue) != ECODataStatus::OK);
}
TEST(EcoDataTest, TestNormalSetAndFindFloat) {
std::unique_ptr<ECOData> data = std::make_unique<ECOData>(ECOData::DATA_TYPE_STATS, 1000);
data->setFloat(ENCODER_TARGET_BITRATE_BPS, 2000000.0);
float testValue;
EXPECT_TRUE(data->findFloat(ENCODER_TARGET_BITRATE_BPS, &testValue) == ECODataStatus::OK);
EXPECT_FLOAT_EQ(testValue, 2000000.0);
// Override existing key.
data->setFloat(ENCODER_TARGET_BITRATE_BPS, 2200000.0);
EXPECT_TRUE(data->findFloat(ENCODER_TARGET_BITRATE_BPS, &testValue) == ECODataStatus::OK);
EXPECT_FLOAT_EQ(testValue, 2200000.0);
}
TEST(EcoDataTest, TestNormalSetAndFindMultipleFloat) {
std::unique_ptr<ECOData> data = std::make_unique<ECOData>(ECOData::DATA_TYPE_STATS, 1000);
std::unordered_map<std::string, float> inputEntries = {
{"name1", 100.0}, {"name2", 200.0}, {"name3", 300.0}, {"name4", 400.0},
{"name5", 500.0}, {"name6", 600.0}, {"name7", 700.0}, {"name8", 800.0},
{"name9", 900.0}, {"name10", 10000.0}, {"name11", 110000.0}, {"name12", 120000.0}};
for (auto it = inputEntries.begin(); it != inputEntries.end(); ++it) {
data->setFloat(it->first, it->second);
}
// Checks if the string exist in the ECOData.
for (auto it = inputEntries.begin(); it != inputEntries.end(); ++it) {
float testValue;
EXPECT_TRUE(data->findFloat(it->first, &testValue) == ECODataStatus::OK);
EXPECT_FLOAT_EQ(testValue, it->second);
}
}
TEST(EcoDataTest, TestSetAndFindInvalidFloat) {
std::unique_ptr<ECOData> data = std::make_unique<ECOData>(ECOData::DATA_TYPE_STATS, 1000);
// Test read to null ptr and expect failure
EXPECT_TRUE(data->findFloat("encoder-name", nullptr) != ECODataStatus::OK);
// Test find non-existing key and expect failure.
float testValue;
EXPECT_TRUE(data->findFloat("encoder-name", &testValue) != ECODataStatus::OK);
// Test set empty key and expect failure
EXPECT_TRUE(data->setFloat("", 1000.0) != ECODataStatus::OK);
// Test read empty key and expect failure
EXPECT_TRUE(data->findFloat("", &testValue) != ECODataStatus::OK);
}
TEST(EcoDataTest, TestNormalSetAndFindMixedDataType) {
std::unique_ptr<ECOData> data = std::make_unique<ECOData>(ECOData::DATA_TYPE_STATS, 1000);
std::unordered_map<std::string, ECOData::ECODataValueType> inputEntries = {
{"name1", "google-encoder"}, {"name2", "avc"}, {"profile", 1}, {"level", 2},
{"framerate", 4.1}, {"kfi", 30}};
for (auto it = inputEntries.begin(); it != inputEntries.end(); ++it) {
data->set(it->first, it->second);
}
// Checks if the string exist in the ECOData.
for (auto it = inputEntries.begin(); it != inputEntries.end(); ++it) {
ECOData::ECODataValueType testValue;
EXPECT_TRUE(data->find(it->first, &testValue) == ECODataStatus::OK);
EXPECT_EQ(testValue, it->second);
}
}
TEST(EcoDataTest, TestSetAndFindInvalidDataType) {
std::unique_ptr<ECOData> data = std::make_unique<ECOData>(ECOData::DATA_TYPE_STATS, 1000);
// Test read to null ptr and expect failure
EXPECT_TRUE(data->find("encoder-name", nullptr) != ECODataStatus::OK);
// Test find non-existing key and expect failure.
ECOData::ECODataValueType testValue;
EXPECT_TRUE(data->find("encoder-name2", &testValue) != ECODataStatus::OK);
// Test set empty key and expect failure
EXPECT_TRUE(data->set("", 1000) != ECODataStatus::OK);
// Test read empty key and expect failure
EXPECT_TRUE(data->find("", &testValue) != ECODataStatus::OK);
}
TEST(EcoDataTest, TestNormalWriteReadParcel) {
constexpr int32_t kDataType = ECOData::DATA_TYPE_STATS;
constexpr int64_t kDataTimeUs = 1000;
std::unique_ptr<ECOData> sourceData = std::make_unique<ECOData>(kDataType, kDataTimeUs);
std::unordered_map<std::string, ECOData::ECODataValueType> inputEntries = {
{"name1", "google-encoder"}, {"name2", "avc"}, {"profile", 1}, {"level", 2},
{"framerate", 4.1}, {"kfi", 30}};
for (auto it = inputEntries.begin(); it != inputEntries.end(); ++it) {
sourceData->set(it->first, it->second);
}
std::unique_ptr<Parcel> parcel = std::make_unique<Parcel>();
EXPECT_TRUE(sourceData->writeToParcel(parcel.get()) == NO_ERROR);
// Rewind the data position of the parcel for this test. Otherwise, the following read will not
// start from the beginning.
parcel->setDataPosition(0);
// Reads the parcel back into a new ECOData
std::unique_ptr<ECOData> dstData = std::make_unique<ECOData>();
EXPECT_TRUE(dstData->readFromParcel(parcel.get()) == NO_ERROR);
// Checks the data type, time and number of entries.
EXPECT_EQ(sourceData->getNumOfEntries(), dstData->getNumOfEntries());
EXPECT_EQ(dstData->getDataType(), kDataType);
EXPECT_EQ(dstData->getDataTimeUs(), kDataTimeUs);
for (auto it = inputEntries.begin(); it != inputEntries.end(); ++it) {
ECOData::ECODataValueType testValue;
EXPECT_TRUE(dstData->find(it->first, &testValue) == ECODataStatus::OK);
EXPECT_EQ(testValue, it->second);
}
}
TEST(EcoDataTest, TestWriteInvalidParcel) {
constexpr int32_t kDataType = ECOData::DATA_TYPE_STATS;
constexpr int64_t kDataTimeUs = 1000;
std::unique_ptr<ECOData> sourceData = std::make_unique<ECOData>(kDataType, kDataTimeUs);
std::unique_ptr<Parcel> parcel = std::make_unique<Parcel>();
EXPECT_TRUE(sourceData->writeToParcel(nullptr) != NO_ERROR);
}
TEST(EcoDataTest, TestReadInvalidParcel) {
constexpr int32_t kDataType = ECOData::DATA_TYPE_STATS;
constexpr int64_t kDataTimeUs = 1000;
std::unique_ptr<ECOData> sourceData = std::make_unique<ECOData>(kDataType, kDataTimeUs);
std::unordered_map<std::string, ECOData::ECODataValueType> inputEntries = {
{"name1", "google-encoder"}, {"name2", "avc"}, {"profile", 1}, {"level", 2},
{"framerate", 4.1}, {"kfi", 30}};
for (auto it = inputEntries.begin(); it != inputEntries.end(); ++it) {
sourceData->set(it->first, it->second);
}
std::unique_ptr<Parcel> parcel = std::make_unique<Parcel>();
EXPECT_TRUE(sourceData->writeToParcel(parcel.get()) == NO_ERROR);
// Corrupt the parcel by write random data to the beginning.
parcel->setDataPosition(4);
parcel->writeCString("invalid-data");
parcel->setDataPosition(0);
// Reads the parcel back into a new ECOData
std::unique_ptr<ECOData> dstData = std::make_unique<ECOData>();
EXPECT_TRUE(dstData->readFromParcel(parcel.get()) != NO_ERROR);
}
} // namespace eco
} // namespace media
} // namespace android