#undef LOG_TAG
#define LOG_TAG "LayerHistoryUnittests"
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <log/log.h>
#include <mutex>
#include <thread>
#include "Scheduler/LayerHistory.h"
using testing::_;
using testing::Return;
namespace android {
namespace scheduler {
class LayerHistoryTest : public testing::Test {
public:
LayerHistoryTest();
~LayerHistoryTest() override;
protected:
std::unique_ptr<LayerHistory> mLayerHistory;
static constexpr float MAX_REFRESH_RATE = 90.f;
};
LayerHistoryTest::LayerHistoryTest() {
mLayerHistory = std::make_unique<LayerHistory>();
}
LayerHistoryTest::~LayerHistoryTest() {}
namespace {
TEST_F(LayerHistoryTest, oneLayer) {
std::unique_ptr<LayerHistory::LayerHandle> testLayer =
mLayerHistory->createLayer("TestLayer", MAX_REFRESH_RATE);
mLayerHistory->setVisibility(testLayer, true);
mLayerHistory->insert(testLayer, 0, false /*isHDR*/);
EXPECT_FLOAT_EQ(0.f, mLayerHistory->getDesiredRefreshRateAndHDR().first);
mLayerHistory->insert(testLayer, 0, false /*isHDR*/);
mLayerHistory->insert(testLayer, 0, false /*isHDR*/);
mLayerHistory->insert(testLayer, 0, false /*isHDR*/);
// This is still 0, because the layer is not considered recently active if it
// has been present in less than 10 frames.
EXPECT_FLOAT_EQ(0.f, mLayerHistory->getDesiredRefreshRateAndHDR().first);
mLayerHistory->insert(testLayer, 0, false /*isHDR*/);
mLayerHistory->insert(testLayer, 0, false /*isHDR*/);
mLayerHistory->insert(testLayer, 0, false /*isHDR*/);
mLayerHistory->insert(testLayer, 0, false /*isHDR*/);
mLayerHistory->insert(testLayer, 0, false /*isHDR*/);
mLayerHistory->insert(testLayer, 0, false /*isHDR*/);
// This should be MAX_REFRESH_RATE as we have more than 10 samples
EXPECT_FLOAT_EQ(MAX_REFRESH_RATE, mLayerHistory->getDesiredRefreshRateAndHDR().first);
}
TEST_F(LayerHistoryTest, oneHDRLayer) {
std::unique_ptr<LayerHistory::LayerHandle> testLayer =
mLayerHistory->createLayer("TestHDRLayer", MAX_REFRESH_RATE);
mLayerHistory->setVisibility(testLayer, true);
mLayerHistory->insert(testLayer, 0, true /*isHDR*/);
EXPECT_FLOAT_EQ(0.0f, mLayerHistory->getDesiredRefreshRateAndHDR().first);
EXPECT_EQ(true, mLayerHistory->getDesiredRefreshRateAndHDR().second);
mLayerHistory->setVisibility(testLayer, false);
EXPECT_FLOAT_EQ(0.0f, mLayerHistory->getDesiredRefreshRateAndHDR().first);
EXPECT_EQ(false, mLayerHistory->getDesiredRefreshRateAndHDR().second);
}
TEST_F(LayerHistoryTest, explicitTimestamp) {
std::unique_ptr<LayerHistory::LayerHandle> test30FpsLayer =
mLayerHistory->createLayer("30FpsLayer", MAX_REFRESH_RATE);
mLayerHistory->setVisibility(test30FpsLayer, true);
nsecs_t startTime = systemTime();
for (int i = 0; i < 31; i++) {
mLayerHistory->insert(test30FpsLayer, startTime + (i * 33333333), false /*isHDR*/);
}
EXPECT_FLOAT_EQ(30.f, mLayerHistory->getDesiredRefreshRateAndHDR().first);
}
TEST_F(LayerHistoryTest, multipleLayers) {
std::unique_ptr<LayerHistory::LayerHandle> testLayer =
mLayerHistory->createLayer("TestLayer", MAX_REFRESH_RATE);
mLayerHistory->setVisibility(testLayer, true);
std::unique_ptr<LayerHistory::LayerHandle> test30FpsLayer =
mLayerHistory->createLayer("30FpsLayer", MAX_REFRESH_RATE);
mLayerHistory->setVisibility(test30FpsLayer, true);
std::unique_ptr<LayerHistory::LayerHandle> testLayer2 =
mLayerHistory->createLayer("TestLayer2", MAX_REFRESH_RATE);
mLayerHistory->setVisibility(testLayer2, true);
nsecs_t startTime = systemTime();
for (int i = 0; i < 10; i++) {
mLayerHistory->insert(testLayer, 0, false /*isHDR*/);
}
EXPECT_FLOAT_EQ(MAX_REFRESH_RATE, mLayerHistory->getDesiredRefreshRateAndHDR().first);
startTime = systemTime();
for (int i = 0; i < 10; i++) {
mLayerHistory->insert(test30FpsLayer, startTime + (i * 33333333), false /*isHDR*/);
}
EXPECT_FLOAT_EQ(MAX_REFRESH_RATE, mLayerHistory->getDesiredRefreshRateAndHDR().first);
for (int i = 10; i < 30; i++) {
mLayerHistory->insert(test30FpsLayer, startTime + (i * 33333333), false /*isHDR*/);
}
EXPECT_FLOAT_EQ(MAX_REFRESH_RATE, mLayerHistory->getDesiredRefreshRateAndHDR().first);
// This frame is only around for 9 occurrences, so it doesn't throw
// anything off.
for (int i = 0; i < 9; i++) {
mLayerHistory->insert(testLayer2, 0, false /*isHDR*/);
}
EXPECT_FLOAT_EQ(MAX_REFRESH_RATE, mLayerHistory->getDesiredRefreshRateAndHDR().first);
// After 100 ms frames become obsolete.
std::this_thread::sleep_for(std::chrono::milliseconds(500));
// Insert the 31st frame.
mLayerHistory->insert(test30FpsLayer, startTime + (30 * 33333333), false /*isHDR*/);
EXPECT_FLOAT_EQ(30.f, mLayerHistory->getDesiredRefreshRateAndHDR().first);
}
} // namespace
} // namespace scheduler
} // namespace android