/* * Copyright 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. */ #undef LOG_TAG #define LOG_TAG "SchedulerUnittests" #include <gmock/gmock.h> #include <log/log.h> #include <thread> #include "DisplayHardware/HWC2.h" #include "Scheduler/RefreshRateConfigs.h" #include "mock/DisplayHardware/MockDisplay.h" using namespace std::chrono_literals; using testing::_; namespace android { namespace scheduler { using RefreshRateType = RefreshRateConfigs::RefreshRateType; using RefreshRate = RefreshRateConfigs::RefreshRate; class RefreshRateConfigsTest : public testing::Test { protected: static constexpr int CONFIG_ID_60 = 0; static constexpr hwc2_config_t HWC2_CONFIG_ID_60 = 0; static constexpr int CONFIG_ID_90 = 1; static constexpr hwc2_config_t HWC2_CONFIG_ID_90 = 1; static constexpr int64_t VSYNC_60 = 16666667; static constexpr int64_t VSYNC_90 = 11111111; RefreshRateConfigsTest(); ~RefreshRateConfigsTest(); void assertRatesEqual(const RefreshRate& left, const RefreshRate& right) { ASSERT_EQ(left.configId, right.configId); ASSERT_EQ(left.name, right.name); ASSERT_EQ(left.fps, right.fps); } RefreshRateConfigs mConfigs; }; RefreshRateConfigsTest::RefreshRateConfigsTest() { const ::testing::TestInfo* const test_info = ::testing::UnitTest::GetInstance()->current_test_info(); ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name()); } RefreshRateConfigsTest::~RefreshRateConfigsTest() { const ::testing::TestInfo* const test_info = ::testing::UnitTest::GetInstance()->current_test_info(); ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name()); } namespace { /* ------------------------------------------------------------------------ * Test cases */ TEST_F(RefreshRateConfigsTest, zeroDeviceConfigs_storesPowerSavingConfig) { std::vector<std::shared_ptr<const HWC2::Display::Config>> displayConfigs; mConfigs.populate(displayConfigs); // We always store a configuration for screen off. const auto& rates = mConfigs.getRefreshRates(); ASSERT_EQ(1, rates.size()); const auto& powerSavingRate = rates.find(RefreshRateType::POWER_SAVING); ASSERT_NE(rates.end(), powerSavingRate); ASSERT_EQ(rates.end(), rates.find(RefreshRateType::PERFORMANCE)); ASSERT_EQ(rates.end(), rates.find(RefreshRateType::DEFAULT)); RefreshRate expectedConfig = RefreshRate{SCREEN_OFF_CONFIG_ID, "ScreenOff", 0, HWC2_SCREEN_OFF_CONFIG_ID}; assertRatesEqual(expectedConfig, *powerSavingRate->second); ASSERT_TRUE(mConfigs.getRefreshRate(RefreshRateType::POWER_SAVING)); assertRatesEqual(expectedConfig, *mConfigs.getRefreshRate(RefreshRateType::POWER_SAVING)); ASSERT_FALSE(mConfigs.getRefreshRate(RefreshRateType::PERFORMANCE)); ASSERT_FALSE(mConfigs.getRefreshRate(RefreshRateType::DEFAULT)); // Sanity check that getRefreshRate() does not modify the underlying configs. ASSERT_EQ(1, mConfigs.getRefreshRates().size()); } TEST_F(RefreshRateConfigsTest, oneDeviceConfig_storesDefaultConfig) { auto display = new Hwc2::mock::Display(); std::vector<std::shared_ptr<const HWC2::Display::Config>> displayConfigs; auto config60 = HWC2::Display::Config::Builder(*display, CONFIG_ID_60); config60.setVsyncPeriod(VSYNC_60); displayConfigs.push_back(config60.build()); mConfigs.populate(displayConfigs); const auto& rates = mConfigs.getRefreshRates(); ASSERT_EQ(2, rates.size()); const auto& powerSavingRate = rates.find(RefreshRateType::POWER_SAVING); const auto& defaultRate = rates.find(RefreshRateType::DEFAULT); ASSERT_NE(rates.end(), powerSavingRate); ASSERT_NE(rates.end(), defaultRate); ASSERT_EQ(rates.end(), rates.find(RefreshRateType::PERFORMANCE)); RefreshRate expectedPowerSavingConfig = RefreshRate{SCREEN_OFF_CONFIG_ID, "ScreenOff", 0, HWC2_SCREEN_OFF_CONFIG_ID}; assertRatesEqual(expectedPowerSavingConfig, *powerSavingRate->second); RefreshRate expectedDefaultConfig = RefreshRate{CONFIG_ID_60, "60fps", 60, HWC2_CONFIG_ID_60}; assertRatesEqual(expectedDefaultConfig, *defaultRate->second); ASSERT_TRUE(mConfigs.getRefreshRate(RefreshRateType::POWER_SAVING)); assertRatesEqual(expectedPowerSavingConfig, *mConfigs.getRefreshRate(RefreshRateType::POWER_SAVING)); ASSERT_TRUE(mConfigs.getRefreshRate(RefreshRateType::DEFAULT)); assertRatesEqual(expectedDefaultConfig, *mConfigs.getRefreshRate(RefreshRateType::DEFAULT)); ASSERT_FALSE(mConfigs.getRefreshRate(RefreshRateType::PERFORMANCE)); // Sanity check that getRefreshRate() does not modify the underlying configs. ASSERT_EQ(2, mConfigs.getRefreshRates().size()); } TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_storesPerformanceConfig) { auto display = new Hwc2::mock::Display(); std::vector<std::shared_ptr<const HWC2::Display::Config>> displayConfigs; auto config60 = HWC2::Display::Config::Builder(*display, CONFIG_ID_60); config60.setVsyncPeriod(VSYNC_60); displayConfigs.push_back(config60.build()); auto config90 = HWC2::Display::Config::Builder(*display, CONFIG_ID_90); config90.setVsyncPeriod(VSYNC_90); displayConfigs.push_back(config90.build()); mConfigs.populate(displayConfigs); const auto& rates = mConfigs.getRefreshRates(); ASSERT_EQ(3, rates.size()); const auto& powerSavingRate = rates.find(RefreshRateType::POWER_SAVING); const auto& defaultRate = rates.find(RefreshRateType::DEFAULT); const auto& performanceRate = rates.find(RefreshRateType::PERFORMANCE); ASSERT_NE(rates.end(), powerSavingRate); ASSERT_NE(rates.end(), defaultRate); ASSERT_NE(rates.end(), performanceRate); RefreshRate expectedPowerSavingConfig = RefreshRate{SCREEN_OFF_CONFIG_ID, "ScreenOff", 0, HWC2_SCREEN_OFF_CONFIG_ID}; assertRatesEqual(expectedPowerSavingConfig, *powerSavingRate->second); RefreshRate expectedDefaultConfig = RefreshRate{CONFIG_ID_60, "60fps", 60, HWC2_CONFIG_ID_60}; assertRatesEqual(expectedDefaultConfig, *defaultRate->second); RefreshRate expectedPerformanceConfig = RefreshRate{CONFIG_ID_90, "90fps", 90, HWC2_CONFIG_ID_90}; assertRatesEqual(expectedPerformanceConfig, *performanceRate->second); ASSERT_TRUE(mConfigs.getRefreshRate(RefreshRateType::POWER_SAVING)); assertRatesEqual(expectedPowerSavingConfig, *mConfigs.getRefreshRate(RefreshRateType::POWER_SAVING)); ASSERT_TRUE(mConfigs.getRefreshRate(RefreshRateType::DEFAULT)); assertRatesEqual(expectedDefaultConfig, *mConfigs.getRefreshRate(RefreshRateType::DEFAULT)); ASSERT_TRUE(mConfigs.getRefreshRate(RefreshRateType::PERFORMANCE)); assertRatesEqual(expectedPerformanceConfig, *mConfigs.getRefreshRate(RefreshRateType::PERFORMANCE)); } } // namespace } // namespace scheduler } // namespace android