blob: eddebe92993871b4a096695142d606e574b45058 [file] [log] [blame]
rnlee81d32602021-07-27 13:24:07 -07001/*
2 * Copyright 2021 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
rnlee81d32602021-07-27 13:24:07 -070017#undef LOG_TAG
18#define LOG_TAG "FlagManagerTest"
19
Alec Mouri9b133ca2023-11-14 19:00:01 +000020#include <common/FlagManager.h>
Ady Abraham3db8a3c2023-11-20 17:53:47 -080021#include <common/test/FlagUtils.h>
rnlee81d32602021-07-27 13:24:07 -070022
rnlee81d32602021-07-27 13:24:07 -070023#include <gmock/gmock.h>
24#include <gtest/gtest.h>
25#include <log/log.h>
rnlee81d32602021-07-27 13:24:07 -070026
Ady Abrahamd6d80162023-10-23 12:57:41 -070027#include <com_android_graphics_surfaceflinger_flags.h>
28
rnlee81d32602021-07-27 13:24:07 -070029namespace android {
30
Ady Abraham370bae92024-02-07 23:42:50 +000031using namespace com::android::graphics::surfaceflinger;
rnlee81d32602021-07-27 13:24:07 -070032using testing::Return;
33
Ady Abrahamc589dc42023-10-26 16:20:53 -070034class TestableFlagManager : public FlagManager {
rnlee81d32602021-07-27 13:24:07 -070035public:
Ady Abrahamc589dc42023-10-26 16:20:53 -070036 TestableFlagManager() : FlagManager(ConstructorTag{}) { markBootCompleted(); }
37 ~TestableFlagManager() = default;
rnlee81d32602021-07-27 13:24:07 -070038
Ady Abrahamc589dc42023-10-26 16:20:53 -070039 MOCK_METHOD(std::optional<bool>, getBoolProperty, (const char*), (const, override));
40 MOCK_METHOD(bool, getServerConfigurableFlag, (const char*), (const, override));
41
42 void markBootIncomplete() { mBootCompleted = false; }
rnlee81d32602021-07-27 13:24:07 -070043};
44
45class FlagManagerTest : public testing::Test {
46public:
Ady Abrahamc589dc42023-10-26 16:20:53 -070047 FlagManagerTest() {
48 const ::testing::TestInfo* const test_info =
49 ::testing::UnitTest::GetInstance()->current_test_info();
50 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
51 }
52 ~FlagManagerTest() override {
53 const ::testing::TestInfo* const test_info =
54 ::testing::UnitTest::GetInstance()->current_test_info();
55 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
56 }
rnlee81d32602021-07-27 13:24:07 -070057
Ady Abrahamc589dc42023-10-26 16:20:53 -070058 TestableFlagManager mFlagManager;
rnlee81d32602021-07-27 13:24:07 -070059};
60
Ady Abrahamc589dc42023-10-26 16:20:53 -070061TEST_F(FlagManagerTest, isSingleton) {
62 EXPECT_EQ(&FlagManager::getInstance(), &FlagManager::getInstance());
rnlee81d32602021-07-27 13:24:07 -070063}
64
Ady Abrahamd6d80162023-10-23 12:57:41 -070065TEST_F(FlagManagerTest, legacyCreashesIfQueriedBeforeBoot) {
Ady Abrahamc589dc42023-10-26 16:20:53 -070066 mFlagManager.markBootIncomplete();
Ady Abrahamd6d80162023-10-23 12:57:41 -070067 EXPECT_DEATH(FlagManager::getInstance().test_flag(), "");
rnlee81d32602021-07-27 13:24:07 -070068}
69
Ady Abrahamd6d80162023-10-23 12:57:41 -070070TEST_F(FlagManagerTest, legacyReturnsOverride) {
Ady Abrahamc589dc42023-10-26 16:20:53 -070071 EXPECT_CALL(mFlagManager, getBoolProperty).WillOnce(Return(true));
72 EXPECT_EQ(true, mFlagManager.test_flag());
73
74 EXPECT_CALL(mFlagManager, getBoolProperty).WillOnce(Return(false));
75 EXPECT_EQ(false, mFlagManager.test_flag());
rnlee81d32602021-07-27 13:24:07 -070076}
77
Ady Abrahamd6d80162023-10-23 12:57:41 -070078TEST_F(FlagManagerTest, legacyReturnsValue) {
Ady Abrahamc589dc42023-10-26 16:20:53 -070079 EXPECT_CALL(mFlagManager, getBoolProperty).WillRepeatedly(Return(std::nullopt));
80
81 EXPECT_CALL(mFlagManager, getServerConfigurableFlag).WillOnce(Return(true));
82 EXPECT_EQ(true, mFlagManager.test_flag());
83
84 EXPECT_CALL(mFlagManager, getServerConfigurableFlag).WillOnce(Return(false));
85 EXPECT_EQ(false, mFlagManager.test_flag());
rnlee81d32602021-07-27 13:24:07 -070086}
87
Ady Abrahamd6d80162023-10-23 12:57:41 -070088TEST_F(FlagManagerTest, creashesIfQueriedBeforeBoot) {
89 mFlagManager.markBootIncomplete();
Ady Abraham370bae92024-02-07 23:42:50 +000090 EXPECT_DEATH(FlagManager::getInstance()
91 .refresh_rate_overlay_on_external_display(), "");
Ady Abrahamd6d80162023-10-23 12:57:41 -070092}
93
Leon Scroggins IIId8e36f32023-11-22 14:40:36 -050094TEST_F(FlagManagerTest, returnsOverrideTrue) {
95 mFlagManager.markBootCompleted();
96
Ady Abraham370bae92024-02-07 23:42:50 +000097 SET_FLAG_FOR_TEST(flags::refresh_rate_overlay_on_external_display, false);
Leon Scroggins IIId8e36f32023-11-22 14:40:36 -050098
99 // This is stored in a static variable, so this test depends on the fact
100 // that this flag has not been read in this process.
101 EXPECT_CALL(mFlagManager, getBoolProperty).WillOnce(Return(true));
Ady Abraham370bae92024-02-07 23:42:50 +0000102 EXPECT_TRUE(mFlagManager.refresh_rate_overlay_on_external_display());
Leon Scroggins IIId8e36f32023-11-22 14:40:36 -0500103
104 // Further calls will not result in further calls to getBoolProperty.
Ady Abraham370bae92024-02-07 23:42:50 +0000105 EXPECT_TRUE(mFlagManager.refresh_rate_overlay_on_external_display());
Leon Scroggins IIId8e36f32023-11-22 14:40:36 -0500106}
107
108TEST_F(FlagManagerTest, returnsOverrideReadonly) {
Ady Abraham370bae92024-02-07 23:42:50 +0000109 SET_FLAG_FOR_TEST(flags::add_sf_skipped_frames_to_trace, false);
Leon Scroggins IIId8e36f32023-11-22 14:40:36 -0500110
111 // This is stored in a static variable, so this test depends on the fact
112 // that this flag has not been read in this process.
113 EXPECT_CALL(mFlagManager, getBoolProperty).WillOnce(Return(true));
114 EXPECT_TRUE(mFlagManager.add_sf_skipped_frames_to_trace());
115}
116
117TEST_F(FlagManagerTest, returnsOverrideFalse) {
118 mFlagManager.markBootCompleted();
119
Ady Abraham370bae92024-02-07 23:42:50 +0000120 SET_FLAG_FOR_TEST(flags::refresh_rate_overlay_on_external_display, true);
Leon Scroggins IIId8e36f32023-11-22 14:40:36 -0500121
122 // This is stored in a static variable, so this test depends on the fact
123 // that this flag has not been read in this process.
124 EXPECT_CALL(mFlagManager, getBoolProperty).WillOnce(Return(false));
125 EXPECT_FALSE(mFlagManager.refresh_rate_overlay_on_external_display());
126}
127
128TEST_F(FlagManagerTest, ignoresOverrideInUnitTestMode) {
Ady Abrahamd6d80162023-10-23 12:57:41 -0700129 mFlagManager.setUnitTestMode();
130
Ady Abraham370bae92024-02-07 23:42:50 +0000131 SET_FLAG_FOR_TEST(flags::multithreaded_present, true);
Ady Abrahamd6d80162023-10-23 12:57:41 -0700132
Leon Scroggins IIId8e36f32023-11-22 14:40:36 -0500133 // If this has not been called in this process, it will be called.
134 // Regardless, the result is ignored.
135 EXPECT_CALL(mFlagManager, getBoolProperty).WillRepeatedly(Return(false));
136
137 EXPECT_EQ(true, mFlagManager.multithreaded_present());
Ady Abrahamd6d80162023-10-23 12:57:41 -0700138}
139
140TEST_F(FlagManagerTest, returnsValue) {
141 mFlagManager.setUnitTestMode();
142
143 EXPECT_CALL(mFlagManager, getBoolProperty).WillRepeatedly(Return(std::nullopt));
144
145 {
Ady Abraham370bae92024-02-07 23:42:50 +0000146 SET_FLAG_FOR_TEST(flags::refresh_rate_overlay_on_external_display, true);
147 EXPECT_EQ(true, mFlagManager.refresh_rate_overlay_on_external_display());
Ady Abrahamd6d80162023-10-23 12:57:41 -0700148 }
149
150 {
Ady Abraham370bae92024-02-07 23:42:50 +0000151 SET_FLAG_FOR_TEST(flags::refresh_rate_overlay_on_external_display, false);
152 EXPECT_EQ(false, mFlagManager.refresh_rate_overlay_on_external_display());
Ady Abrahamd6d80162023-10-23 12:57:41 -0700153 }
154}
155
Ady Abrahamd6d80162023-10-23 12:57:41 -0700156TEST_F(FlagManagerTest, readonlyReturnsValue) {
157 mFlagManager.setUnitTestMode();
158
159 EXPECT_CALL(mFlagManager, getBoolProperty).WillRepeatedly(Return(std::nullopt));
160
161 {
Ady Abraham370bae92024-02-07 23:42:50 +0000162 SET_FLAG_FOR_TEST(flags::misc1, true);
Ady Abrahamd6d80162023-10-23 12:57:41 -0700163 EXPECT_EQ(true, mFlagManager.misc1());
164 }
165
166 {
Ady Abraham370bae92024-02-07 23:42:50 +0000167 SET_FLAG_FOR_TEST(flags::misc1, false);
Ady Abrahamd6d80162023-10-23 12:57:41 -0700168 EXPECT_EQ(false, mFlagManager.misc1());
169 }
170}
171
172TEST_F(FlagManagerTest, dontSkipOnEarlyIsNotCached) {
173 EXPECT_CALL(mFlagManager, getBoolProperty).WillRepeatedly(Return(std::nullopt));
174
Ady Abraham370bae92024-02-07 23:42:50 +0000175 const auto initialValue = flags::dont_skip_on_early();
Ady Abrahamd6d80162023-10-23 12:57:41 -0700176
Ady Abraham370bae92024-02-07 23:42:50 +0000177 flags::dont_skip_on_early(true);
Ady Abrahamd6d80162023-10-23 12:57:41 -0700178 EXPECT_EQ(true, mFlagManager.dont_skip_on_early());
179
Ady Abraham370bae92024-02-07 23:42:50 +0000180 flags::dont_skip_on_early(false);
Ady Abrahamd6d80162023-10-23 12:57:41 -0700181 EXPECT_EQ(false, mFlagManager.dont_skip_on_early());
182
Ady Abraham370bae92024-02-07 23:42:50 +0000183 flags::dont_skip_on_early(initialValue);
Ady Abrahamd6d80162023-10-23 12:57:41 -0700184}
185
rnlee81d32602021-07-27 13:24:07 -0700186} // namespace android