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, ¶ms));
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, ¶ms));
117 EXPECT_THAT(params, UnorderedElementsAre(Pair(kTestParamName, kParamValue)));
118 EXPECT_EQ(kTestParam.Get(), kParamValue);
119 }
120
121 } // namespace
122 } // namespace cronet
123