xref: /aosp_15_r20/external/cronet/components/cronet/android/cronet_base_feature_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2023 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "components/cronet/android/cronet_base_feature.h"
6 #include "base/feature_list.h"
7 #include "base/metrics/field_trial_params.h"
8 #include "base/test/scoped_feature_list.h"
9 #include "testing/gmock/include/gmock/gmock.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11 
12 namespace cronet {
13 namespace {
14 
15 using ::org::chromium::net::httpflags::BaseFeatureOverrides;
16 using ::testing::IsEmpty;
17 using ::testing::Pair;
18 using ::testing::UnorderedElementsAre;
19 
20 constexpr char kTestFeatureDisabledByDefaultName[] =
21     "CronetBaseFeatureTestFeatureDisabledByDefault";
22 BASE_FEATURE(kTestFeatureDisabledByDefault,
23              kTestFeatureDisabledByDefaultName,
24              base::FEATURE_DISABLED_BY_DEFAULT);
25 
26 constexpr char kTestFeatureEnabledByDefaultName[] =
27     "CronetBaseFeatureTestFeatureEnabledByDefault";
28 BASE_FEATURE(kTestFeatureEnabledByDefault,
29              kTestFeatureEnabledByDefaultName,
30              base::FEATURE_ENABLED_BY_DEFAULT);
31 
32 constexpr char kTestFeatureWithParamsName[] =
33     "CronetBaseFeatureTestFeatureWithParams";
34 BASE_FEATURE(kTestFeatureWithParams,
35              kTestFeatureWithParamsName,
36              base::FEATURE_DISABLED_BY_DEFAULT);
37 constexpr char kTestParamName[] = "test_param";
38 constexpr char kTestParamDefaultValue[] = "test_param_default_value";
39 constexpr base::FeatureParam<std::string> kTestParam{
40     &kTestFeatureWithParams, kTestParamName, kTestParamDefaultValue};
41 
TEST(ApplyBaseFeatureOverrides,NoOpOnEmptyOverrides)42 TEST(ApplyBaseFeatureOverrides, NoOpOnEmptyOverrides) {
43   base::test::ScopedFeatureList scoped_feature_list;
44   scoped_feature_list.InitWithNullFeatureAndFieldTrialLists();
45   ApplyBaseFeatureOverrides(BaseFeatureOverrides());
46   EXPECT_FALSE(base::FeatureList::IsEnabled(kTestFeatureDisabledByDefault));
47   EXPECT_TRUE(base::FeatureList::IsEnabled(kTestFeatureEnabledByDefault));
48 }
49 
TEST(ApplyBaseFeatureOverrides,OverridesFeatureToEnabled)50 TEST(ApplyBaseFeatureOverrides, OverridesFeatureToEnabled) {
51   base::test::ScopedFeatureList scoped_feature_list;
52   scoped_feature_list.InitWithNullFeatureAndFieldTrialLists();
53   BaseFeatureOverrides overrides;
54   (*overrides.mutable_feature_states())[kTestFeatureDisabledByDefaultName]
55       .set_enabled(true);
56   ApplyBaseFeatureOverrides(overrides);
57   EXPECT_TRUE(base::FeatureList::IsEnabled(kTestFeatureDisabledByDefault));
58 }
59 
TEST(ApplyBaseFeatureOverrides,OverridesFeatureToDisabled)60 TEST(ApplyBaseFeatureOverrides, OverridesFeatureToDisabled) {
61   base::test::ScopedFeatureList scoped_feature_list;
62   scoped_feature_list.InitWithNullFeatureAndFieldTrialLists();
63   BaseFeatureOverrides overrides;
64   (*overrides.mutable_feature_states())[kTestFeatureEnabledByDefaultName]
65       .set_enabled(false);
66   ApplyBaseFeatureOverrides(overrides);
67   EXPECT_FALSE(base::FeatureList::IsEnabled(kTestFeatureEnabledByDefault));
68 }
69 
TEST(ApplyBaseFeatureOverrides,DoesNotOverrideFeature)70 TEST(ApplyBaseFeatureOverrides, DoesNotOverrideFeature) {
71   base::test::ScopedFeatureList scoped_feature_list;
72   scoped_feature_list.InitWithNullFeatureAndFieldTrialLists();
73   BaseFeatureOverrides overrides;
74   (*overrides.mutable_feature_states())[kTestFeatureEnabledByDefaultName];
75   ApplyBaseFeatureOverrides(overrides);
76   EXPECT_TRUE(base::FeatureList::IsEnabled(kTestFeatureEnabledByDefault));
77 }
78 
TEST(ApplyBaseFeatureOverrides,NoOpIfBaseFeatureAlreadyInitialized)79 TEST(ApplyBaseFeatureOverrides, NoOpIfBaseFeatureAlreadyInitialized) {
80   base::test::ScopedFeatureList scoped_feature_list;
81   scoped_feature_list.InitWithEmptyFeatureAndFieldTrialLists();
82   BaseFeatureOverrides overrides;
83   (*overrides.mutable_feature_states())[kTestFeatureDisabledByDefaultName]
84       .set_enabled(true);
85   ApplyBaseFeatureOverrides(overrides);
86   EXPECT_FALSE(base::FeatureList::IsEnabled(kTestFeatureDisabledByDefault));
87 }
88 
TEST(ApplyBaseFeatureOverrides,DoesNotAssociateFeatureParamsIfNoParamsAreProvided)89 TEST(ApplyBaseFeatureOverrides,
90      DoesNotAssociateFeatureParamsIfNoParamsAreProvided) {
91   base::test::ScopedFeatureList scoped_feature_list;
92   scoped_feature_list.InitWithNullFeatureAndFieldTrialLists();
93   BaseFeatureOverrides overrides;
94   (*overrides.mutable_feature_states())[kTestFeatureWithParamsName].set_enabled(
95       true);
96   ApplyBaseFeatureOverrides(overrides);
97   base::FieldTrialParams params;
98   EXPECT_FALSE(
99       base::GetFieldTrialParamsByFeature(kTestFeatureWithParams, &params));
100   EXPECT_THAT(params, IsEmpty());
101   EXPECT_EQ(kTestParam.Get(), kTestParamDefaultValue);
102 }
103 
TEST(ApplyBaseFeatureOverrides,AssociatesFeatureParams)104 TEST(ApplyBaseFeatureOverrides, AssociatesFeatureParams) {
105   base::test::ScopedFeatureList scoped_feature_list;
106   scoped_feature_list.InitWithNullFeatureAndFieldTrialLists();
107   BaseFeatureOverrides overrides;
108   constexpr char kParamValue[] = "test_param_value";
109   auto& feature_state =
110       (*overrides.mutable_feature_states())[kTestFeatureWithParamsName];
111   feature_state.set_enabled(true);
112   (*feature_state.mutable_params())[kTestParamName] = kParamValue;
113   ApplyBaseFeatureOverrides(overrides);
114   base::FieldTrialParams params;
115   EXPECT_TRUE(
116       base::GetFieldTrialParamsByFeature(kTestFeatureWithParams, &params));
117   EXPECT_THAT(params, UnorderedElementsAre(Pair(kTestParamName, kParamValue)));
118   EXPECT_EQ(kTestParam.Get(), kParamValue);
119 }
120 
121 }  // namespace
122 }  // namespace cronet
123