blob: c040f29fec030f298492e140587bebb76548d45b [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 Abrahamd6d80162023-10-23 12:57:41 -070021#include "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
31using testing::Return;
32
Ady Abrahamc589dc42023-10-26 16:20:53 -070033class TestableFlagManager : public FlagManager {
rnlee81d32602021-07-27 13:24:07 -070034public:
Ady Abrahamc589dc42023-10-26 16:20:53 -070035 TestableFlagManager() : FlagManager(ConstructorTag{}) { markBootCompleted(); }
36 ~TestableFlagManager() = default;
rnlee81d32602021-07-27 13:24:07 -070037
Ady Abrahamc589dc42023-10-26 16:20:53 -070038 MOCK_METHOD(std::optional<bool>, getBoolProperty, (const char*), (const, override));
39 MOCK_METHOD(bool, getServerConfigurableFlag, (const char*), (const, override));
40
41 void markBootIncomplete() { mBootCompleted = false; }
rnlee81d32602021-07-27 13:24:07 -070042};
43
44class FlagManagerTest : public testing::Test {
45public:
Ady Abrahamc589dc42023-10-26 16:20:53 -070046 FlagManagerTest() {
47 const ::testing::TestInfo* const test_info =
48 ::testing::UnitTest::GetInstance()->current_test_info();
49 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
50 }
51 ~FlagManagerTest() override {
52 const ::testing::TestInfo* const test_info =
53 ::testing::UnitTest::GetInstance()->current_test_info();
54 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
55 }
rnlee81d32602021-07-27 13:24:07 -070056
Ady Abrahamc589dc42023-10-26 16:20:53 -070057 TestableFlagManager mFlagManager;
rnlee81d32602021-07-27 13:24:07 -070058};
59
Ady Abrahamc589dc42023-10-26 16:20:53 -070060TEST_F(FlagManagerTest, isSingleton) {
61 EXPECT_EQ(&FlagManager::getInstance(), &FlagManager::getInstance());
rnlee81d32602021-07-27 13:24:07 -070062}
63
Ady Abrahamd6d80162023-10-23 12:57:41 -070064TEST_F(FlagManagerTest, legacyCreashesIfQueriedBeforeBoot) {
Ady Abrahamc589dc42023-10-26 16:20:53 -070065 mFlagManager.markBootIncomplete();
Ady Abrahamd6d80162023-10-23 12:57:41 -070066 EXPECT_DEATH(FlagManager::getInstance().test_flag(), "");
rnlee81d32602021-07-27 13:24:07 -070067}
68
Ady Abrahamd6d80162023-10-23 12:57:41 -070069TEST_F(FlagManagerTest, legacyReturnsOverride) {
Ady Abrahamc589dc42023-10-26 16:20:53 -070070 EXPECT_CALL(mFlagManager, getBoolProperty).WillOnce(Return(true));
71 EXPECT_EQ(true, mFlagManager.test_flag());
72
73 EXPECT_CALL(mFlagManager, getBoolProperty).WillOnce(Return(false));
74 EXPECT_EQ(false, mFlagManager.test_flag());
rnlee81d32602021-07-27 13:24:07 -070075}
76
Ady Abrahamd6d80162023-10-23 12:57:41 -070077TEST_F(FlagManagerTest, legacyReturnsValue) {
Ady Abrahamc589dc42023-10-26 16:20:53 -070078 EXPECT_CALL(mFlagManager, getBoolProperty).WillRepeatedly(Return(std::nullopt));
79
80 EXPECT_CALL(mFlagManager, getServerConfigurableFlag).WillOnce(Return(true));
81 EXPECT_EQ(true, mFlagManager.test_flag());
82
83 EXPECT_CALL(mFlagManager, getServerConfigurableFlag).WillOnce(Return(false));
84 EXPECT_EQ(false, mFlagManager.test_flag());
rnlee81d32602021-07-27 13:24:07 -070085}
86
Ady Abrahamd6d80162023-10-23 12:57:41 -070087TEST_F(FlagManagerTest, creashesIfQueriedBeforeBoot) {
88 mFlagManager.markBootIncomplete();
89 EXPECT_DEATH(FlagManager::getInstance().late_boot_misc2(), "");
90}
91
92TEST_F(FlagManagerTest, returnsOverride) {
93 mFlagManager.setUnitTestMode();
94
95 // Twice, since the first call is to initialize the static variable
96 EXPECT_CALL(mFlagManager, getBoolProperty)
97 .Times((2))
98 .WillOnce(Return(true))
99 .WillOnce(Return(true));
100 EXPECT_EQ(true, mFlagManager.late_boot_misc2());
101
102 EXPECT_CALL(mFlagManager, getBoolProperty).WillOnce(Return(false));
103 EXPECT_EQ(false, mFlagManager.late_boot_misc2());
104}
105
106TEST_F(FlagManagerTest, returnsValue) {
107 mFlagManager.setUnitTestMode();
108
109 EXPECT_CALL(mFlagManager, getBoolProperty).WillRepeatedly(Return(std::nullopt));
110
111 {
112 SET_FLAG_FOR_TEST(com::android::graphics::surfaceflinger::flags::late_boot_misc2, true);
113 EXPECT_EQ(true, mFlagManager.late_boot_misc2());
114 }
115
116 {
117 SET_FLAG_FOR_TEST(com::android::graphics::surfaceflinger::flags::late_boot_misc2, false);
118 EXPECT_EQ(false, mFlagManager.late_boot_misc2());
119 }
120}
121
122TEST_F(FlagManagerTest, readonlyReturnsOverride) {
123 mFlagManager.setUnitTestMode();
124
125 // Twice, since the first call is to initialize the static variable
126 EXPECT_CALL(mFlagManager, getBoolProperty)
127 .Times(2)
128 .WillOnce(Return(true))
129 .WillOnce(Return(true));
130 EXPECT_EQ(true, mFlagManager.misc1());
131
132 EXPECT_CALL(mFlagManager, getBoolProperty).WillOnce(Return(false));
133 EXPECT_EQ(false, mFlagManager.misc1());
134}
135
136TEST_F(FlagManagerTest, readonlyReturnsValue) {
137 mFlagManager.setUnitTestMode();
138
139 EXPECT_CALL(mFlagManager, getBoolProperty).WillRepeatedly(Return(std::nullopt));
140
141 {
142 SET_FLAG_FOR_TEST(com::android::graphics::surfaceflinger::flags::misc1, true);
143 EXPECT_EQ(true, mFlagManager.misc1());
144 }
145
146 {
147 SET_FLAG_FOR_TEST(com::android::graphics::surfaceflinger::flags::misc1, false);
148 EXPECT_EQ(false, mFlagManager.misc1());
149 }
150}
151
152TEST_F(FlagManagerTest, dontSkipOnEarlyIsNotCached) {
153 EXPECT_CALL(mFlagManager, getBoolProperty).WillRepeatedly(Return(std::nullopt));
154
155 const auto initialValue = com::android::graphics::surfaceflinger::flags::dont_skip_on_early();
156
157 com::android::graphics::surfaceflinger::flags::dont_skip_on_early(true);
158 EXPECT_EQ(true, mFlagManager.dont_skip_on_early());
159
160 com::android::graphics::surfaceflinger::flags::dont_skip_on_early(false);
161 EXPECT_EQ(false, mFlagManager.dont_skip_on_early());
162
163 com::android::graphics::surfaceflinger::flags::dont_skip_on_early(initialValue);
164}
165
rnlee81d32602021-07-27 13:24:07 -0700166} // namespace android