Chromium Code Reviews| 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 "base/command_line.h" | |
| 12 #include "base/macros.h" | |
| 13 #include "base/metrics/field_trial.h" | |
| 11 #include "base/task_scheduler/scheduler_worker_pool_params.h" | 14 #include "base/task_scheduler/scheduler_worker_pool_params.h" |
| 12 #include "base/threading/platform_thread.h" | 15 #include "base/threading/platform_thread.h" |
| 16 #include "components/variations/variations_associated_data.h" | |
| 13 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
| 14 | 18 |
| 15 namespace task_scheduler_util { | 19 namespace task_scheduler_util { |
| 16 | 20 |
| 17 namespace { | 21 namespace { |
| 18 | 22 |
| 19 using StandbyThreadPolicy = | 23 using StandbyThreadPolicy = |
| 20 base::SchedulerWorkerPoolParams::StandbyThreadPolicy; | 24 base::SchedulerWorkerPoolParams::StandbyThreadPolicy; |
| 21 using ThreadPriority = base::ThreadPriority; | 25 using ThreadPriority = base::ThreadPriority; |
| 22 | 26 |
| 27 constexpr char kFieldTrialName[] = "BrowserScheduler"; | |
| 28 constexpr char kFieldTrialTestGroup[] = "Test"; | |
| 29 constexpr char kTaskSchedulerVariationParamsSwitch[] = | |
| 30 "task-scheduler-variation-params"; | |
| 31 | |
| 23 std::vector<SchedulerImmutableWorkerPoolParams> GetImmutableWorkerPoolParams() { | 32 std::vector<SchedulerImmutableWorkerPoolParams> GetImmutableWorkerPoolParams() { |
| 24 std::vector<SchedulerImmutableWorkerPoolParams> constant_worker_pool_params; | 33 std::vector<SchedulerImmutableWorkerPoolParams> constant_worker_pool_params; |
| 25 constant_worker_pool_params.emplace_back("Background", | 34 constant_worker_pool_params.emplace_back("Background", |
| 26 ThreadPriority::BACKGROUND); | 35 ThreadPriority::BACKGROUND); |
| 27 constant_worker_pool_params.emplace_back("BackgroundFileIO", | 36 constant_worker_pool_params.emplace_back("BackgroundFileIO", |
| 28 ThreadPriority::BACKGROUND); | 37 ThreadPriority::BACKGROUND); |
| 29 constant_worker_pool_params.emplace_back("Foreground", | 38 constant_worker_pool_params.emplace_back("Foreground", |
| 30 ThreadPriority::NORMAL); | 39 ThreadPriority::NORMAL); |
| 31 constant_worker_pool_params.emplace_back("ForegroundFileIO", | 40 constant_worker_pool_params.emplace_back("ForegroundFileIO", |
| 32 ThreadPriority::NORMAL); | 41 ThreadPriority::NORMAL); |
| 33 return constant_worker_pool_params; | 42 return constant_worker_pool_params; |
| 34 } | 43 } |
| 35 | 44 |
| 45 class TaskSchedulerUtilVariationsUtilTest : public testing::Test { | |
| 46 public: | |
| 47 TaskSchedulerUtilVariationsUtilTest() : field_trial_list_(nullptr) {} | |
| 48 ~TaskSchedulerUtilVariationsUtilTest() override { | |
| 49 // Ensure that the maps are cleared between tests, since they are stored as | |
| 50 // process singletons. | |
| 51 variations::testing::ClearAllVariationIDs(); | |
| 52 variations::testing::ClearAllVariationParams(); | |
| 53 } | |
| 54 | |
| 55 private: | |
| 56 base::FieldTrialList field_trial_list_; | |
|
gab
2017/01/06 17:41:09
= nullptr; (and make constructor = default;)
fdoray
2017/01/06 18:10:39
Doesn't work. nullptr is an argument for the const
| |
| 57 | |
| 58 DISALLOW_COPY_AND_ASSIGN(TaskSchedulerUtilVariationsUtilTest); | |
| 59 }; | |
| 60 | |
| 36 } // namespace | 61 } // namespace |
| 37 | 62 |
| 38 TEST(TaskSchedulerUtilVariationsUtilTest, OrderingParams5) { | 63 TEST_F(TaskSchedulerUtilVariationsUtilTest, OrderingParams5) { |
| 39 std::map<std::string, std::string> variation_params; | 64 std::map<std::string, std::string> variation_params; |
| 40 variation_params["Background"] = "1;1;1;0;42"; | 65 variation_params["Background"] = "1;1;1;0;42"; |
| 41 variation_params["BackgroundFileIO"] = "2;2;1;0;52"; | 66 variation_params["BackgroundFileIO"] = "2;2;1;0;52"; |
| 42 variation_params["Foreground"] = "4;4;1;0;62"; | 67 variation_params["Foreground"] = "4;4;1;0;62"; |
| 43 variation_params["ForegroundFileIO"] = "8;8;1;0;72"; | 68 variation_params["ForegroundFileIO"] = "8;8;1;0;72"; |
| 44 | 69 |
| 45 auto params_vector = | 70 auto params_vector = |
| 46 GetWorkerPoolParams(GetImmutableWorkerPoolParams(), variation_params); | 71 GetWorkerPoolParams(GetImmutableWorkerPoolParams(), variation_params); |
| 47 ASSERT_EQ(4U, params_vector.size()); | 72 ASSERT_EQ(4U, params_vector.size()); |
| 48 | 73 |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 68 params_vector[2].suggested_reclaim_time()); | 93 params_vector[2].suggested_reclaim_time()); |
| 69 | 94 |
| 70 EXPECT_EQ("ForegroundFileIO", params_vector[3].name()); | 95 EXPECT_EQ("ForegroundFileIO", params_vector[3].name()); |
| 71 EXPECT_EQ(ThreadPriority::NORMAL, params_vector[3].priority_hint()); | 96 EXPECT_EQ(ThreadPriority::NORMAL, params_vector[3].priority_hint()); |
| 72 EXPECT_EQ(StandbyThreadPolicy::ONE, params_vector[3].standby_thread_policy()); | 97 EXPECT_EQ(StandbyThreadPolicy::ONE, params_vector[3].standby_thread_policy()); |
| 73 EXPECT_EQ(8U, params_vector[3].max_threads()); | 98 EXPECT_EQ(8U, params_vector[3].max_threads()); |
| 74 EXPECT_EQ(base::TimeDelta::FromMilliseconds(72), | 99 EXPECT_EQ(base::TimeDelta::FromMilliseconds(72), |
| 75 params_vector[3].suggested_reclaim_time()); | 100 params_vector[3].suggested_reclaim_time()); |
| 76 } | 101 } |
| 77 | 102 |
| 78 TEST(TaskSchedulerUtilVariationsUtilTest, OrderingParams6) { | 103 TEST_F(TaskSchedulerUtilVariationsUtilTest, OrderingParams6) { |
| 79 std::map<std::string, std::string> variation_params; | 104 std::map<std::string, std::string> variation_params; |
| 80 variation_params["Background"] = "1;1;1;0;42;lazy"; | 105 variation_params["Background"] = "1;1;1;0;42;lazy"; |
| 81 variation_params["BackgroundFileIO"] = "2;2;1;0;52;one"; | 106 variation_params["BackgroundFileIO"] = "2;2;1;0;52;one"; |
| 82 variation_params["Foreground"] = "4;4;1;0;62;lazy"; | 107 variation_params["Foreground"] = "4;4;1;0;62;lazy"; |
| 83 variation_params["ForegroundFileIO"] = "8;8;1;0;72;one"; | 108 variation_params["ForegroundFileIO"] = "8;8;1;0;72;one"; |
| 84 | 109 |
| 85 auto params_vector = | 110 auto params_vector = |
| 86 GetWorkerPoolParams(GetImmutableWorkerPoolParams(), variation_params); | 111 GetWorkerPoolParams(GetImmutableWorkerPoolParams(), variation_params); |
| 87 ASSERT_EQ(4U, params_vector.size()); | 112 ASSERT_EQ(4U, params_vector.size()); |
| 88 | 113 |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 110 params_vector[2].suggested_reclaim_time()); | 135 params_vector[2].suggested_reclaim_time()); |
| 111 | 136 |
| 112 EXPECT_EQ("ForegroundFileIO", params_vector[3].name()); | 137 EXPECT_EQ("ForegroundFileIO", params_vector[3].name()); |
| 113 EXPECT_EQ(ThreadPriority::NORMAL, params_vector[3].priority_hint()); | 138 EXPECT_EQ(ThreadPriority::NORMAL, params_vector[3].priority_hint()); |
| 114 EXPECT_EQ(StandbyThreadPolicy::ONE, params_vector[3].standby_thread_policy()); | 139 EXPECT_EQ(StandbyThreadPolicy::ONE, params_vector[3].standby_thread_policy()); |
| 115 EXPECT_EQ(8U, params_vector[3].max_threads()); | 140 EXPECT_EQ(8U, params_vector[3].max_threads()); |
| 116 EXPECT_EQ(base::TimeDelta::FromMilliseconds(72), | 141 EXPECT_EQ(base::TimeDelta::FromMilliseconds(72), |
| 117 params_vector[3].suggested_reclaim_time()); | 142 params_vector[3].suggested_reclaim_time()); |
| 118 } | 143 } |
| 119 | 144 |
| 120 TEST(TaskSchedulerUtilVariationsUtilTest, NoData) { | 145 TEST_F(TaskSchedulerUtilVariationsUtilTest, NoData) { |
| 121 EXPECT_TRUE(GetWorkerPoolParams(GetImmutableWorkerPoolParams(), | 146 EXPECT_TRUE(GetWorkerPoolParams(GetImmutableWorkerPoolParams(), |
| 122 std::map<std::string, std::string>()) | 147 std::map<std::string, std::string>()) |
| 123 .empty()); | 148 .empty()); |
| 124 } | 149 } |
| 125 | 150 |
| 126 TEST(TaskSchedulerUtilVariationsUtilTest, IncompleteParameters) { | 151 TEST_F(TaskSchedulerUtilVariationsUtilTest, IncompleteParameters) { |
| 127 std::map<std::string, std::string> variation_params; | 152 std::map<std::string, std::string> variation_params; |
| 128 variation_params["Background"] = "1;1;1;0"; | 153 variation_params["Background"] = "1;1;1;0"; |
| 129 variation_params["BackgroundFileIO"] = "2;2;1;0"; | 154 variation_params["BackgroundFileIO"] = "2;2;1;0"; |
| 130 variation_params["Foreground"] = "4;4;1;0"; | 155 variation_params["Foreground"] = "4;4;1;0"; |
| 131 variation_params["ForegroundFileIO"] = "8;8;1;0"; | 156 variation_params["ForegroundFileIO"] = "8;8;1;0"; |
| 132 EXPECT_TRUE( | 157 EXPECT_TRUE( |
| 133 GetWorkerPoolParams(GetImmutableWorkerPoolParams(), variation_params) | 158 GetWorkerPoolParams(GetImmutableWorkerPoolParams(), variation_params) |
| 134 .empty()); | 159 .empty()); |
| 135 } | 160 } |
| 136 | 161 |
| 137 TEST(TaskSchedulerUtilVariationsUtilTest, InvalidParameters) { | 162 TEST_F(TaskSchedulerUtilVariationsUtilTest, InvalidParameters) { |
| 138 std::map<std::string, std::string> variation_params; | 163 std::map<std::string, std::string> variation_params; |
| 139 variation_params["Background"] = "a;b;c;d;e"; | 164 variation_params["Background"] = "a;b;c;d;e"; |
| 140 variation_params["BackgroundFileIO"] = "a;b;c;d;e"; | 165 variation_params["BackgroundFileIO"] = "a;b;c;d;e"; |
| 141 variation_params["Foreground"] = "a;b;c;d;e"; | 166 variation_params["Foreground"] = "a;b;c;d;e"; |
| 142 variation_params["ForegroundFileIO"] = "a;b;c;d;e"; | 167 variation_params["ForegroundFileIO"] = "a;b;c;d;e"; |
| 143 EXPECT_TRUE( | 168 EXPECT_TRUE( |
| 144 GetWorkerPoolParams(GetImmutableWorkerPoolParams(), variation_params) | 169 GetWorkerPoolParams(GetImmutableWorkerPoolParams(), variation_params) |
| 145 .empty()); | 170 .empty()); |
| 146 } | 171 } |
| 147 | 172 |
| 173 // Verify that AddVariationParamsToCommandLine() serializes BrowserScheduler | |
| 174 // variation params that start with the specified prefix to the command line and | |
| 175 // that GetVariationParamsFromCommandLine() correctly deserializes them. | |
| 176 TEST_F(TaskSchedulerUtilVariationsUtilTest, CommandLine) { | |
| 177 std::map<std::string, std::string> in_variation_params; | |
| 178 in_variation_params["PrefixFoo"] = "Foo"; | |
| 179 in_variation_params["PrefixBar"] = "Bar"; | |
| 180 in_variation_params["NoPrefix"] = "NoPrefix"; | |
| 181 ASSERT_TRUE(variations::AssociateVariationParams( | |
| 182 kFieldTrialName, kFieldTrialTestGroup, in_variation_params)); | |
| 183 | |
| 184 base::CommandLine command_line(base::CommandLine::NO_PROGRAM); | |
| 185 AddVariationParamsToCommandLine("Prefix", &command_line); | |
| 186 const std::map<std::string, std::string> out_variation_params = | |
| 187 GetVariationParamsFromCommandLine(command_line); | |
| 188 | |
| 189 std::map<std::string, std::string> expected_out_variation_params; | |
| 190 expected_out_variation_params["PrefixFoo"] = "Foo"; | |
| 191 expected_out_variation_params["PrefixBar"] = "Bar"; | |
| 192 EXPECT_EQ(expected_out_variation_params, out_variation_params); | |
| 193 } | |
| 194 | |
| 195 // Verify that AddVariationParamsToCommandLine() doesn't add anything to the | |
| 196 // command line when a BrowserScheduler variation param key contains |. A key | |
| 197 // that contains | wouldn't be deserialized correctly by | |
| 198 // GetVariationParamsFromCommandLine(). | |
| 199 TEST_F(TaskSchedulerUtilVariationsUtilTest, | |
| 200 CommandLineSeparatorInVariationParamsKey) { | |
| 201 std::map<std::string, std::string> in_variation_params; | |
| 202 in_variation_params["PrefixFoo"] = "Foo"; | |
| 203 in_variation_params["PrefixKey|"] = "Value"; | |
| 204 ASSERT_TRUE(variations::AssociateVariationParams( | |
| 205 kFieldTrialName, kFieldTrialTestGroup, in_variation_params)); | |
| 206 | |
| 207 base::CommandLine command_line(base::CommandLine::NO_PROGRAM); | |
| 208 AddVariationParamsToCommandLine("Prefix", &command_line); | |
| 209 EXPECT_TRUE( | |
| 210 command_line.GetSwitchValueASCII(kTaskSchedulerVariationParamsSwitch) | |
| 211 .empty()); | |
| 212 } | |
| 213 | |
| 214 // Verify that AddVariationParamsToCommandLine() doesn't add anything to the | |
| 215 // command line when a BrowserScheduler variation param value contains |. A | |
| 216 // value that contains | wouldn't be deserialized correctly by | |
| 217 // GetVariationParamsFromCommandLine(). | |
| 218 TEST_F(TaskSchedulerUtilVariationsUtilTest, | |
| 219 CommandLineSeparatorInVariationParamsValue) { | |
| 220 std::map<std::string, std::string> in_variation_params; | |
| 221 in_variation_params["PrefixFoo"] = "Foo"; | |
| 222 in_variation_params["PrefixKey"] = "Value|"; | |
| 223 ASSERT_TRUE(variations::AssociateVariationParams( | |
| 224 kFieldTrialName, kFieldTrialTestGroup, in_variation_params)); | |
| 225 | |
| 226 base::CommandLine command_line(base::CommandLine::NO_PROGRAM); | |
| 227 AddVariationParamsToCommandLine("Prefix", &command_line); | |
| 228 EXPECT_TRUE( | |
| 229 command_line.GetSwitchValueASCII(kTaskSchedulerVariationParamsSwitch) | |
| 230 .empty()); | |
| 231 } | |
| 232 | |
| 233 // Verify that GetVariationParamsFromCommandLine() returns an empty map when the | |
| 234 // command line doesn't have a --task-scheduler-variation-params switch. | |
| 235 TEST_F(TaskSchedulerUtilVariationsUtilTest, CommandLineNoSwitch) { | |
| 236 base::CommandLine command_line(base::CommandLine::NO_PROGRAM); | |
| 237 EXPECT_TRUE(GetVariationParamsFromCommandLine(command_line).empty()); | |
| 238 } | |
| 239 | |
| 148 } // namespace task_scheduler_util | 240 } // namespace task_scheduler_util |
| OLD | NEW |