OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |