Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(201)

Side by Side Diff: components/task_scheduler_util/common/variations_util_unittest.cc

Issue 2568793003: Control TaskScheduler initialization params in renderers via field trial. (Closed)
Patch Set: fix ios build error Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/task_scheduler_util/common/variations_util.h" 5 #include "components/task_scheduler_util/common/variations_util.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
11 #include "build/build_config.h"
12 #include "base/command_line.h"
13 #include "base/macros.h"
14 #include "base/metrics/field_trial.h"
11 #include "base/task_scheduler/scheduler_worker_pool_params.h" 15 #include "base/task_scheduler/scheduler_worker_pool_params.h"
12 #include "base/threading/platform_thread.h" 16 #include "base/threading/platform_thread.h"
17 #include "components/variations/variations_associated_data.h"
13 #include "testing/gtest/include/gtest/gtest.h" 18 #include "testing/gtest/include/gtest/gtest.h"
14 19
15 namespace task_scheduler_util { 20 namespace task_scheduler_util {
16 21
17 namespace { 22 namespace {
18 23
19 using StandbyThreadPolicy = 24 using StandbyThreadPolicy =
20 base::SchedulerWorkerPoolParams::StandbyThreadPolicy; 25 base::SchedulerWorkerPoolParams::StandbyThreadPolicy;
21 using ThreadPriority = base::ThreadPriority; 26 using ThreadPriority = base::ThreadPriority;
22 27
28 #if !defined(OS_IOS)
29 constexpr char kFieldTrialName[] = "BrowserScheduler";
30 constexpr char kFieldTrialTestGroup[] = "Test";
31 constexpr char kTaskSchedulerVariationParamsSwitch[] =
32 "task-scheduler-variation-params";
33 #endif // !defined(OS_IOS)
34
23 std::vector<SchedulerImmutableWorkerPoolParams> GetImmutableWorkerPoolParams() { 35 std::vector<SchedulerImmutableWorkerPoolParams> GetImmutableWorkerPoolParams() {
24 std::vector<SchedulerImmutableWorkerPoolParams> constant_worker_pool_params; 36 std::vector<SchedulerImmutableWorkerPoolParams> constant_worker_pool_params;
25 constant_worker_pool_params.emplace_back("Background", 37 constant_worker_pool_params.emplace_back("Background",
26 ThreadPriority::BACKGROUND); 38 ThreadPriority::BACKGROUND);
27 constant_worker_pool_params.emplace_back("BackgroundFileIO", 39 constant_worker_pool_params.emplace_back("BackgroundFileIO",
28 ThreadPriority::BACKGROUND); 40 ThreadPriority::BACKGROUND);
29 constant_worker_pool_params.emplace_back("Foreground", 41 constant_worker_pool_params.emplace_back("Foreground",
30 ThreadPriority::NORMAL); 42 ThreadPriority::NORMAL);
31 constant_worker_pool_params.emplace_back("ForegroundFileIO", 43 constant_worker_pool_params.emplace_back("ForegroundFileIO",
32 ThreadPriority::NORMAL); 44 ThreadPriority::NORMAL);
33 return constant_worker_pool_params; 45 return constant_worker_pool_params;
34 } 46 }
35 47
48 class TaskSchedulerUtilVariationsUtilTest : public testing::Test {
49 public:
50 TaskSchedulerUtilVariationsUtilTest() : field_trial_list_(nullptr) {}
51 ~TaskSchedulerUtilVariationsUtilTest() override {
52 // Ensure that the maps are cleared between tests, since they are stored as
53 // process singletons.
54 variations::testing::ClearAllVariationIDs();
55 variations::testing::ClearAllVariationParams();
56 }
57
58 private:
59 base::FieldTrialList field_trial_list_;
60
61 DISALLOW_COPY_AND_ASSIGN(TaskSchedulerUtilVariationsUtilTest);
62 };
63
36 } // namespace 64 } // namespace
37 65
38 TEST(TaskSchedulerUtilVariationsUtilTest, OrderingParams5) { 66 TEST_F(TaskSchedulerUtilVariationsUtilTest, OrderingParams5) {
39 std::map<std::string, std::string> variation_params; 67 std::map<std::string, std::string> variation_params;
40 variation_params["Background"] = "1;1;1;0;42"; 68 variation_params["Background"] = "1;1;1;0;42";
41 variation_params["BackgroundFileIO"] = "2;2;1;0;52"; 69 variation_params["BackgroundFileIO"] = "2;2;1;0;52";
42 variation_params["Foreground"] = "4;4;1;0;62"; 70 variation_params["Foreground"] = "4;4;1;0;62";
43 variation_params["ForegroundFileIO"] = "8;8;1;0;72"; 71 variation_params["ForegroundFileIO"] = "8;8;1;0;72";
44 72
45 auto params_vector = 73 auto params_vector =
46 GetWorkerPoolParams(GetImmutableWorkerPoolParams(), variation_params); 74 GetWorkerPoolParams(GetImmutableWorkerPoolParams(), variation_params);
47 ASSERT_EQ(4U, params_vector.size()); 75 ASSERT_EQ(4U, params_vector.size());
48 76
(...skipping 19 matching lines...) Expand all
68 params_vector[2].suggested_reclaim_time()); 96 params_vector[2].suggested_reclaim_time());
69 97
70 EXPECT_EQ("ForegroundFileIO", params_vector[3].name()); 98 EXPECT_EQ("ForegroundFileIO", params_vector[3].name());
71 EXPECT_EQ(ThreadPriority::NORMAL, params_vector[3].priority_hint()); 99 EXPECT_EQ(ThreadPriority::NORMAL, params_vector[3].priority_hint());
72 EXPECT_EQ(StandbyThreadPolicy::ONE, params_vector[3].standby_thread_policy()); 100 EXPECT_EQ(StandbyThreadPolicy::ONE, params_vector[3].standby_thread_policy());
73 EXPECT_EQ(8U, params_vector[3].max_threads()); 101 EXPECT_EQ(8U, params_vector[3].max_threads());
74 EXPECT_EQ(base::TimeDelta::FromMilliseconds(72), 102 EXPECT_EQ(base::TimeDelta::FromMilliseconds(72),
75 params_vector[3].suggested_reclaim_time()); 103 params_vector[3].suggested_reclaim_time());
76 } 104 }
77 105
78 TEST(TaskSchedulerUtilVariationsUtilTest, OrderingParams6) { 106 TEST_F(TaskSchedulerUtilVariationsUtilTest, OrderingParams6) {
79 std::map<std::string, std::string> variation_params; 107 std::map<std::string, std::string> variation_params;
80 variation_params["Background"] = "1;1;1;0;42;lazy"; 108 variation_params["Background"] = "1;1;1;0;42;lazy";
81 variation_params["BackgroundFileIO"] = "2;2;1;0;52;one"; 109 variation_params["BackgroundFileIO"] = "2;2;1;0;52;one";
82 variation_params["Foreground"] = "4;4;1;0;62;lazy"; 110 variation_params["Foreground"] = "4;4;1;0;62;lazy";
83 variation_params["ForegroundFileIO"] = "8;8;1;0;72;one"; 111 variation_params["ForegroundFileIO"] = "8;8;1;0;72;one";
84 112
85 auto params_vector = 113 auto params_vector =
86 GetWorkerPoolParams(GetImmutableWorkerPoolParams(), variation_params); 114 GetWorkerPoolParams(GetImmutableWorkerPoolParams(), variation_params);
87 ASSERT_EQ(4U, params_vector.size()); 115 ASSERT_EQ(4U, params_vector.size());
88 116
(...skipping 21 matching lines...) Expand all
110 params_vector[2].suggested_reclaim_time()); 138 params_vector[2].suggested_reclaim_time());
111 139
112 EXPECT_EQ("ForegroundFileIO", params_vector[3].name()); 140 EXPECT_EQ("ForegroundFileIO", params_vector[3].name());
113 EXPECT_EQ(ThreadPriority::NORMAL, params_vector[3].priority_hint()); 141 EXPECT_EQ(ThreadPriority::NORMAL, params_vector[3].priority_hint());
114 EXPECT_EQ(StandbyThreadPolicy::ONE, params_vector[3].standby_thread_policy()); 142 EXPECT_EQ(StandbyThreadPolicy::ONE, params_vector[3].standby_thread_policy());
115 EXPECT_EQ(8U, params_vector[3].max_threads()); 143 EXPECT_EQ(8U, params_vector[3].max_threads());
116 EXPECT_EQ(base::TimeDelta::FromMilliseconds(72), 144 EXPECT_EQ(base::TimeDelta::FromMilliseconds(72),
117 params_vector[3].suggested_reclaim_time()); 145 params_vector[3].suggested_reclaim_time());
118 } 146 }
119 147
120 TEST(TaskSchedulerUtilVariationsUtilTest, NoData) { 148 TEST_F(TaskSchedulerUtilVariationsUtilTest, NoData) {
121 EXPECT_TRUE(GetWorkerPoolParams(GetImmutableWorkerPoolParams(), 149 EXPECT_TRUE(GetWorkerPoolParams(GetImmutableWorkerPoolParams(),
122 std::map<std::string, std::string>()) 150 std::map<std::string, std::string>())
123 .empty()); 151 .empty());
124 } 152 }
125 153
126 TEST(TaskSchedulerUtilVariationsUtilTest, IncompleteParameters) { 154 TEST_F(TaskSchedulerUtilVariationsUtilTest, IncompleteParameters) {
127 std::map<std::string, std::string> variation_params; 155 std::map<std::string, std::string> variation_params;
128 variation_params["Background"] = "1;1;1;0"; 156 variation_params["Background"] = "1;1;1;0";
129 variation_params["BackgroundFileIO"] = "2;2;1;0"; 157 variation_params["BackgroundFileIO"] = "2;2;1;0";
130 variation_params["Foreground"] = "4;4;1;0"; 158 variation_params["Foreground"] = "4;4;1;0";
131 variation_params["ForegroundFileIO"] = "8;8;1;0"; 159 variation_params["ForegroundFileIO"] = "8;8;1;0";
132 EXPECT_TRUE( 160 EXPECT_TRUE(
133 GetWorkerPoolParams(GetImmutableWorkerPoolParams(), variation_params) 161 GetWorkerPoolParams(GetImmutableWorkerPoolParams(), variation_params)
134 .empty()); 162 .empty());
135 } 163 }
136 164
137 TEST(TaskSchedulerUtilVariationsUtilTest, InvalidParameters) { 165 TEST_F(TaskSchedulerUtilVariationsUtilTest, InvalidParameters) {
138 std::map<std::string, std::string> variation_params; 166 std::map<std::string, std::string> variation_params;
139 variation_params["Background"] = "a;b;c;d;e"; 167 variation_params["Background"] = "a;b;c;d;e";
140 variation_params["BackgroundFileIO"] = "a;b;c;d;e"; 168 variation_params["BackgroundFileIO"] = "a;b;c;d;e";
141 variation_params["Foreground"] = "a;b;c;d;e"; 169 variation_params["Foreground"] = "a;b;c;d;e";
142 variation_params["ForegroundFileIO"] = "a;b;c;d;e"; 170 variation_params["ForegroundFileIO"] = "a;b;c;d;e";
143 EXPECT_TRUE( 171 EXPECT_TRUE(
144 GetWorkerPoolParams(GetImmutableWorkerPoolParams(), variation_params) 172 GetWorkerPoolParams(GetImmutableWorkerPoolParams(), variation_params)
145 .empty()); 173 .empty());
146 } 174 }
147 175
176 #if !defined(OS_IOS)
177 // Verify that AddVariationParamsToCommandLine() serializes BrowserScheduler
178 // variation params that start with the specified prefix to the command line and
179 // that GetVariationParamsFromCommandLine() correctly deserializes them.
180 TEST_F(TaskSchedulerUtilVariationsUtilTest, CommandLine) {
181 std::map<std::string, std::string> in_variation_params;
182 in_variation_params["PrefixFoo"] = "Foo";
183 in_variation_params["PrefixBar"] = "Bar";
184 in_variation_params["NoPrefix"] = "NoPrefix";
185 ASSERT_TRUE(variations::AssociateVariationParams(
186 kFieldTrialName, kFieldTrialTestGroup, in_variation_params));
187 base::FieldTrialList::CreateFieldTrial(kFieldTrialName, kFieldTrialTestGroup);
188
189 base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
190 AddVariationParamsToCommandLine("Prefix", &command_line);
191 const std::map<std::string, std::string> out_variation_params =
192 GetVariationParamsFromCommandLine(command_line);
193
194 std::map<std::string, std::string> expected_out_variation_params;
195 expected_out_variation_params["PrefixFoo"] = "Foo";
196 expected_out_variation_params["PrefixBar"] = "Bar";
197 EXPECT_EQ(expected_out_variation_params, out_variation_params);
198 }
199
200 // Verify that AddVariationParamsToCommandLine() doesn't add anything to the
201 // command line when a BrowserScheduler variation param key contains |. A key
202 // that contains | wouldn't be deserialized correctly by
203 // GetVariationParamsFromCommandLine().
204 TEST_F(TaskSchedulerUtilVariationsUtilTest,
205 CommandLineSeparatorInVariationParamsKey) {
206 std::map<std::string, std::string> in_variation_params;
207 in_variation_params["PrefixFoo"] = "Foo";
208 in_variation_params["PrefixKey|"] = "Value";
209 ASSERT_TRUE(variations::AssociateVariationParams(
210 kFieldTrialName, kFieldTrialTestGroup, in_variation_params));
211 base::FieldTrialList::CreateFieldTrial(kFieldTrialName, kFieldTrialTestGroup);
212
213 base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
214 AddVariationParamsToCommandLine("Prefix", &command_line);
215 EXPECT_TRUE(
216 command_line.GetSwitchValueASCII(kTaskSchedulerVariationParamsSwitch)
217 .empty());
218 }
219
220 // Verify that AddVariationParamsToCommandLine() doesn't add anything to the
221 // command line when a BrowserScheduler variation param value contains |. A
222 // value that contains | wouldn't be deserialized correctly by
223 // GetVariationParamsFromCommandLine().
224 TEST_F(TaskSchedulerUtilVariationsUtilTest,
225 CommandLineSeparatorInVariationParamsValue) {
226 std::map<std::string, std::string> in_variation_params;
227 in_variation_params["PrefixFoo"] = "Foo";
228 in_variation_params["PrefixKey"] = "Value|";
229 ASSERT_TRUE(variations::AssociateVariationParams(
230 kFieldTrialName, kFieldTrialTestGroup, in_variation_params));
231 base::FieldTrialList::CreateFieldTrial(kFieldTrialName, kFieldTrialTestGroup);
232
233 base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
234 AddVariationParamsToCommandLine("Prefix", &command_line);
235 EXPECT_TRUE(
236 command_line.GetSwitchValueASCII(kTaskSchedulerVariationParamsSwitch)
237 .empty());
238 }
239
240 // Verify that GetVariationParamsFromCommandLine() returns an empty map when the
241 // command line doesn't have a --task-scheduler-variation-params switch.
242 TEST_F(TaskSchedulerUtilVariationsUtilTest, CommandLineNoSwitch) {
243 base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
244 EXPECT_TRUE(GetVariationParamsFromCommandLine(command_line).empty());
245 }
246 #endif // !defined(OS_IOS)
247
148 } // namespace task_scheduler_util 248 } // namespace task_scheduler_util
OLDNEW
« no previous file with comments | « components/task_scheduler_util/common/variations_util.cc ('k') | components/task_scheduler_util/renderer/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698