1 // Copyright (C) 2021 The Android Open Source Project
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "src/flags/FlagProvider.h"
16
17 #include <android-modules-utils/sdk_level.h>
18 #include <gtest/gtest.h>
19
20 #include "tests/statsd_test_util.h"
21
22 namespace android {
23 namespace os {
24 namespace statsd {
25
26 #ifdef __ANDROID__
27
28 using android::modules::sdklevel::IsAtLeastS;
29 using namespace std;
30
31 const string TEST_FLAG = "MyFlagTest";
32
33 struct FlagParam {
34 string flagValue;
35 string label;
36 };
37
38 class FlagProviderTest_SPlus : public testing::TestWithParam<FlagParam> {
TearDown()39 void TearDown() override {
40 FlagProvider::getInstance().resetOverrides();
41 }
42 };
43
44 INSTANTIATE_TEST_SUITE_P(DefaultValues, FlagProviderTest_SPlus,
45 testing::ValuesIn<FlagParam>({
46 // Default values.
47 {FLAG_FALSE, "DefaultFalse"},
48 {FLAG_TRUE, "DefaultTrue"},
49 }),
__anona2be88380102(const testing::TestParamInfo<FlagProviderTest_SPlus::ParamType>& info) 50 [](const testing::TestParamInfo<FlagProviderTest_SPlus::ParamType>& info) {
51 return info.param.label;
52 });
53
TEST_P(FlagProviderTest_SPlus,TestGetFlagBoolServerFlagTrue)54 TEST_P(FlagProviderTest_SPlus, TestGetFlagBoolServerFlagTrue) {
55 FlagProvider::getInstance().overrideFuncs(&isAtLeastSFuncTrue, &getServerFlagFuncTrue);
56 EXPECT_TRUE(FlagProvider::getInstance().getFlagBool(TEST_FLAG, GetParam().flagValue));
57 }
58
TEST_P(FlagProviderTest_SPlus,TestGetFlagBoolServerFlagFalse)59 TEST_P(FlagProviderTest_SPlus, TestGetFlagBoolServerFlagFalse) {
60 FlagProvider::getInstance().overrideFuncs(&isAtLeastSFuncTrue, &getServerFlagFuncFalse);
61 EXPECT_FALSE(FlagProvider::getInstance().getFlagBool(TEST_FLAG, GetParam().flagValue));
62 }
63
TEST_P(FlagProviderTest_SPlus,TestOverrideLocalFlags)64 TEST_P(FlagProviderTest_SPlus, TestOverrideLocalFlags) {
65 FlagProvider::getInstance().overrideFuncs(&isAtLeastSFuncTrue);
66
67 FlagProvider::getInstance().overrideFlag(TEST_FLAG, FLAG_FALSE, /*isBootFlag=*/false);
68 FlagProvider::getInstance().overrideFlag(TEST_FLAG, FLAG_FALSE, /*isBootFlag=*/true);
69 EXPECT_FALSE(FlagProvider::getInstance().getFlagBool(TEST_FLAG, GetParam().flagValue));
70 EXPECT_FALSE(FlagProvider::getInstance().getBootFlagBool(TEST_FLAG, GetParam().flagValue));
71
72 FlagProvider::getInstance().overrideFlag(TEST_FLAG, FLAG_TRUE, /*isBootFlag=*/false);
73 FlagProvider::getInstance().overrideFlag(TEST_FLAG, FLAG_TRUE, /*isBootFlag=*/true);
74 EXPECT_TRUE(FlagProvider::getInstance().getFlagBool(TEST_FLAG, GetParam().flagValue));
75 EXPECT_TRUE(FlagProvider::getInstance().getBootFlagBool(TEST_FLAG, GetParam().flagValue));
76 }
77
78 class FlagProviderTest_SPlus_RealValues : public testing::TestWithParam<FlagParam> {
SetUp()79 void SetUp() override {
80 if (!IsAtLeastS()) {
81 GTEST_SKIP() << "Cannot query flags from system property on R-.";
82 }
83 }
84
TearDown()85 void TearDown() override {
86 writeFlag(TEST_FLAG, FLAG_EMPTY);
87 writeBootFlag(TEST_FLAG, FLAG_EMPTY);
88 FlagProvider::getInstance().initBootFlags({TEST_FLAG});
89 }
90 };
91
92 INSTANTIATE_TEST_SUITE_P(DefaultValues, FlagProviderTest_SPlus_RealValues,
93 testing::ValuesIn<FlagParam>({
94 // Default values.
95 {FLAG_FALSE, "DefaultFalse"},
96 {FLAG_TRUE, "DefaultTrue"},
97 }),
__anona2be88380202(const testing::TestParamInfo<FlagProviderTest_SPlus::ParamType>& info) 98 [](const testing::TestParamInfo<FlagProviderTest_SPlus::ParamType>& info) {
99 return info.param.label;
100 });
101
TEST_P(FlagProviderTest_SPlus_RealValues,TestGetFlagBoolServerFlagTrue)102 TEST_P(FlagProviderTest_SPlus_RealValues, TestGetFlagBoolServerFlagTrue) {
103 writeFlag(TEST_FLAG, FLAG_TRUE);
104 EXPECT_TRUE(FlagProvider::getInstance().getFlagBool(TEST_FLAG, GetParam().flagValue));
105 }
106
TEST_P(FlagProviderTest_SPlus_RealValues,TestGetFlagBoolServerFlagFalse)107 TEST_P(FlagProviderTest_SPlus_RealValues, TestGetFlagBoolServerFlagFalse) {
108 writeFlag(TEST_FLAG, FLAG_FALSE);
109 EXPECT_FALSE(FlagProvider::getInstance().getFlagBool(TEST_FLAG, GetParam().flagValue));
110 }
111
TEST_F(FlagProviderTest_SPlus_RealValues,TestGetFlagBoolServerFlagEmptyDefaultFalse)112 TEST_F(FlagProviderTest_SPlus_RealValues, TestGetFlagBoolServerFlagEmptyDefaultFalse) {
113 writeFlag(TEST_FLAG, FLAG_EMPTY);
114 EXPECT_FALSE(FlagProvider::getInstance().getFlagBool(TEST_FLAG, FLAG_FALSE));
115 }
116
TEST_F(FlagProviderTest_SPlus_RealValues,TestGetFlagBoolServerFlagEmptyDefaultTrue)117 TEST_F(FlagProviderTest_SPlus_RealValues, TestGetFlagBoolServerFlagEmptyDefaultTrue) {
118 writeFlag(TEST_FLAG, FLAG_EMPTY);
119 EXPECT_TRUE(FlagProvider::getInstance().getFlagBool(TEST_FLAG, FLAG_TRUE));
120 }
121
TEST_P(FlagProviderTest_SPlus_RealValues,TestGetBootFlagBoolServerFlagTrue)122 TEST_P(FlagProviderTest_SPlus_RealValues, TestGetBootFlagBoolServerFlagTrue) {
123 writeBootFlag(TEST_FLAG, FLAG_TRUE);
124 FlagProvider::getInstance().initBootFlags({TEST_FLAG});
125 EXPECT_TRUE(FlagProvider::getInstance().getBootFlagBool(TEST_FLAG, GetParam().flagValue));
126 }
127
TEST_P(FlagProviderTest_SPlus_RealValues,TestGetBootFlagBoolServerFlagFalse)128 TEST_P(FlagProviderTest_SPlus_RealValues, TestGetBootFlagBoolServerFlagFalse) {
129 writeBootFlag(TEST_FLAG, FLAG_FALSE);
130 FlagProvider::getInstance().initBootFlags({TEST_FLAG});
131 EXPECT_FALSE(FlagProvider::getInstance().getBootFlagBool(TEST_FLAG, GetParam().flagValue));
132 }
133
TEST_P(FlagProviderTest_SPlus_RealValues,TestGetBootFlagBoolServerFlagUpdated)134 TEST_P(FlagProviderTest_SPlus_RealValues, TestGetBootFlagBoolServerFlagUpdated) {
135 writeBootFlag(TEST_FLAG, FLAG_FALSE);
136 FlagProvider::getInstance().initBootFlags({TEST_FLAG});
137 writeBootFlag(TEST_FLAG, FLAG_TRUE);
138 EXPECT_FALSE(FlagProvider::getInstance().getBootFlagBool(TEST_FLAG, GetParam().flagValue));
139 }
140
TEST_F(FlagProviderTest_SPlus_RealValues,TestGetFlagBoolNoInitServerFlagEmptyDefaultFalse)141 TEST_F(FlagProviderTest_SPlus_RealValues, TestGetFlagBoolNoInitServerFlagEmptyDefaultFalse) {
142 writeBootFlag(TEST_FLAG, FLAG_EMPTY);
143 EXPECT_FALSE(FlagProvider::getInstance().getFlagBool(TEST_FLAG, FLAG_FALSE));
144 }
145
TEST_F(FlagProviderTest_SPlus_RealValues,TestGetFlagBoolNoInitServerFlagEmptyDefaultTrue)146 TEST_F(FlagProviderTest_SPlus_RealValues, TestGetFlagBoolNoInitServerFlagEmptyDefaultTrue) {
147 writeBootFlag(TEST_FLAG, FLAG_EMPTY);
148 EXPECT_TRUE(FlagProvider::getInstance().getFlagBool(TEST_FLAG, FLAG_TRUE));
149 }
150
151 class FlagProviderTest_RMinus : public testing::TestWithParam<FlagParam> {
SetUp()152 void SetUp() override {
153 writeFlag(TEST_FLAG, GetParam().flagValue);
154 FlagProvider::getInstance().overrideFuncs(&isAtLeastSFuncFalse);
155 }
156
TearDown()157 void TearDown() override {
158 FlagProvider::getInstance().resetOverrides();
159 writeFlag(TEST_FLAG, FLAG_EMPTY);
160 }
161 };
162
163 INSTANTIATE_TEST_SUITE_P(
164 ServerFlagValues, FlagProviderTest_RMinus,
165 testing::ValuesIn<FlagParam>({
166 // Server flag values.
167 {FLAG_TRUE, "ServerFlagTrue"},
168 {FLAG_FALSE, "ServerFlagFalse"},
169 {FLAG_EMPTY, "ServerFlagEmpty"},
170 }),
__anona2be88380302(const testing::TestParamInfo<FlagProviderTest_RMinus::ParamType>& info) 171 [](const testing::TestParamInfo<FlagProviderTest_RMinus::ParamType>& info) {
172 return info.param.label;
173 });
174
TEST_P(FlagProviderTest_RMinus,TestGetFlagBoolDefaultValueFalse)175 TEST_P(FlagProviderTest_RMinus, TestGetFlagBoolDefaultValueFalse) {
176 EXPECT_FALSE(FlagProvider::getInstance().getFlagBool(TEST_FLAG, FLAG_FALSE));
177 }
178
TEST_P(FlagProviderTest_RMinus,TestGetFlagBoolDefaultValueTrue)179 TEST_P(FlagProviderTest_RMinus, TestGetFlagBoolDefaultValueTrue) {
180 EXPECT_TRUE(FlagProvider::getInstance().getFlagBool(TEST_FLAG, FLAG_TRUE));
181 }
182
183 #else
184 GTEST_LOG_(INFO) << "This test does nothing.\n";
185 #endif
186
187 } // namespace statsd
188 } // namespace os
189 } // namespace android
190