| /* | 
 |  * 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 |