| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "base/prefs/pref_registry_simple.h" | 5 #include "base/prefs/pref_registry_simple.h" |
| 6 #include "base/prefs/testing_pref_service.h" | 6 #include "base/prefs/testing_pref_service.h" |
| 7 #include "base/strings/string_number_conversions.h" | 7 #include "base/strings/string_number_conversions.h" |
| 8 #include "base/utf_string_conversions.h" | 8 #include "base/utf_string_conversions.h" |
| 9 #include "base/values.h" | 9 #include "base/values.h" |
| 10 #include "chrome/browser/about_flags.h" | 10 #include "chrome/browser/about_flags.h" |
| 11 #include "chrome/common/chrome_switches.h" | 11 #include "chrome/common/chrome_switches.h" |
| 12 #include "chrome/common/pref_names.h" | 12 #include "chrome/common/pref_names.h" |
| 13 #include "grit/chromium_strings.h" | 13 #include "grit/chromium_strings.h" |
| 14 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
| 15 | 15 |
| 16 const char kFlags1[] = "flag1"; | 16 const char kFlags1[] = "flag1"; |
| 17 const char kFlags2[] = "flag2"; | 17 const char kFlags2[] = "flag2"; |
| 18 const char kFlags3[] = "flag3"; | 18 const char kFlags3[] = "flag3"; |
| 19 const char kFlags4[] = "flag4"; | 19 const char kFlags4[] = "flag4"; |
| 20 const char kFlags5[] = "flag5"; |
| 20 | 21 |
| 21 const char kSwitch1[] = "switch"; | 22 const char kSwitch1[] = "switch"; |
| 22 const char kSwitch2[] = "switch2"; | 23 const char kSwitch2[] = "switch2"; |
| 23 const char kSwitch3[] = "switch3"; | 24 const char kSwitch3[] = "switch3"; |
| 24 const char kValueForSwitch2[] = "value_for_switch2"; | 25 const char kValueForSwitch2[] = "value_for_switch2"; |
| 25 | 26 |
| 26 const char kMultiSwitch1[] = "multi_switch1"; | 27 const char kMultiSwitch1[] = "multi_switch1"; |
| 27 const char kMultiSwitch2[] = "multi_switch2"; | 28 const char kMultiSwitch2[] = "multi_switch2"; |
| 28 const char kValueForMultiSwitch2[] = "value_for_multi_switch2"; | 29 const char kValueForMultiSwitch2[] = "value_for_multi_switch2"; |
| 29 | 30 |
| 31 const char kEnableDisableValue1[] = "value1"; |
| 32 const char kEnableDisableValue2[] = "value2"; |
| 33 |
| 30 namespace about_flags { | 34 namespace about_flags { |
| 31 | 35 |
| 32 const Experiment::Choice kMultiChoices[] = { | 36 const Experiment::Choice kMultiChoices[] = { |
| 33 { IDS_PRODUCT_NAME, "", "" }, | 37 { IDS_PRODUCT_NAME, "", "" }, |
| 34 { IDS_PRODUCT_NAME, kMultiSwitch1, "" }, | 38 { IDS_PRODUCT_NAME, kMultiSwitch1, "" }, |
| 35 { IDS_PRODUCT_NAME, kMultiSwitch2, kValueForMultiSwitch2 }, | 39 { IDS_PRODUCT_NAME, kMultiSwitch2, kValueForMultiSwitch2 }, |
| 36 }; | 40 }; |
| 37 | 41 |
| 38 // The experiments that are set for these tests. The 3rd experiment is not | 42 // The experiments that are set for these tests. The 3rd experiment is not |
| 39 // supported on the current platform, all others are. | 43 // supported on the current platform, all others are. |
| 40 static Experiment kExperiments[] = { | 44 static Experiment kExperiments[] = { |
| 41 { | 45 { |
| 42 kFlags1, | 46 kFlags1, |
| 43 IDS_PRODUCT_NAME, | 47 IDS_PRODUCT_NAME, |
| 44 IDS_PRODUCT_NAME, | 48 IDS_PRODUCT_NAME, |
| 45 0, // Ends up being mapped to the current platform. | 49 0, // Ends up being mapped to the current platform. |
| 46 Experiment::SINGLE_VALUE, | 50 Experiment::SINGLE_VALUE, |
| 47 kSwitch1, | 51 kSwitch1, |
| 48 "", | 52 "", |
| 49 NULL, | 53 NULL, |
| 54 NULL, |
| 55 NULL, |
| 50 0 | 56 0 |
| 51 }, | 57 }, |
| 52 { | 58 { |
| 53 kFlags2, | 59 kFlags2, |
| 54 IDS_PRODUCT_NAME, | 60 IDS_PRODUCT_NAME, |
| 55 IDS_PRODUCT_NAME, | 61 IDS_PRODUCT_NAME, |
| 56 0, // Ends up being mapped to the current platform. | 62 0, // Ends up being mapped to the current platform. |
| 57 Experiment::SINGLE_VALUE, | 63 Experiment::SINGLE_VALUE, |
| 58 kSwitch2, | 64 kSwitch2, |
| 59 kValueForSwitch2, | 65 kValueForSwitch2, |
| 60 NULL, | 66 NULL, |
| 67 NULL, |
| 68 NULL, |
| 61 0 | 69 0 |
| 62 }, | 70 }, |
| 63 { | 71 { |
| 64 kFlags3, | 72 kFlags3, |
| 65 IDS_PRODUCT_NAME, | 73 IDS_PRODUCT_NAME, |
| 66 IDS_PRODUCT_NAME, | 74 IDS_PRODUCT_NAME, |
| 67 0, // This ends up enabling for an OS other than the current. | 75 0, // This ends up enabling for an OS other than the current. |
| 68 Experiment::SINGLE_VALUE, | 76 Experiment::SINGLE_VALUE, |
| 69 kSwitch3, | 77 kSwitch3, |
| 70 "", | 78 "", |
| 71 NULL, | 79 NULL, |
| 80 NULL, |
| 81 NULL, |
| 72 0 | 82 0 |
| 73 }, | 83 }, |
| 74 { | 84 { |
| 75 kFlags4, | 85 kFlags4, |
| 76 IDS_PRODUCT_NAME, | 86 IDS_PRODUCT_NAME, |
| 77 IDS_PRODUCT_NAME, | 87 IDS_PRODUCT_NAME, |
| 78 0, // Ends up being mapped to the current platform. | 88 0, // Ends up being mapped to the current platform. |
| 79 Experiment::MULTI_VALUE, | 89 Experiment::MULTI_VALUE, |
| 80 "", | 90 "", |
| 81 "", | 91 "", |
| 92 "", |
| 93 "", |
| 82 kMultiChoices, | 94 kMultiChoices, |
| 83 arraysize(kMultiChoices) | 95 arraysize(kMultiChoices) |
| 84 }, | 96 }, |
| 97 { |
| 98 kFlags5, |
| 99 IDS_PRODUCT_NAME, |
| 100 IDS_PRODUCT_NAME, |
| 101 0, // Ends up being mapped to the current platform. |
| 102 Experiment::ENABLE_DISABLE_VALUE, |
| 103 kSwitch1, |
| 104 kEnableDisableValue1, |
| 105 kSwitch2, |
| 106 kEnableDisableValue2, |
| 107 NULL, |
| 108 3 |
| 109 }, |
| 85 }; | 110 }; |
| 86 | 111 |
| 87 class AboutFlagsTest : public ::testing::Test { | 112 class AboutFlagsTest : public ::testing::Test { |
| 88 protected: | 113 protected: |
| 89 AboutFlagsTest() { | 114 AboutFlagsTest() { |
| 90 prefs_.registry()->RegisterListPref(prefs::kEnabledLabsExperiments); | 115 prefs_.registry()->RegisterListPref(prefs::kEnabledLabsExperiments); |
| 91 testing::ClearState(); | 116 testing::ClearState(); |
| 92 } | 117 } |
| 93 | 118 |
| 94 virtual void SetUp() { | 119 virtual void SetUp() OVERRIDE { |
| 95 for (size_t i = 0; i < arraysize(kExperiments); ++i) | 120 for (size_t i = 0; i < arraysize(kExperiments); ++i) |
| 96 kExperiments[i].supported_platforms = GetCurrentPlatform(); | 121 kExperiments[i].supported_platforms = GetCurrentPlatform(); |
| 97 | 122 |
| 98 int os_other_than_current = 1; | 123 int os_other_than_current = 1; |
| 99 while (os_other_than_current == GetCurrentPlatform()) | 124 while (os_other_than_current == GetCurrentPlatform()) |
| 100 os_other_than_current <<= 1; | 125 os_other_than_current <<= 1; |
| 101 kExperiments[2].supported_platforms = os_other_than_current; | 126 kExperiments[2].supported_platforms = os_other_than_current; |
| 102 | 127 |
| 103 testing::SetExperiments(kExperiments, arraysize(kExperiments)); | 128 testing::SetExperiments(kExperiments, arraysize(kExperiments)); |
| 104 } | 129 } |
| 105 | 130 |
| 106 virtual void TearDown() { | 131 virtual void TearDown() OVERRIDE { |
| 107 testing::SetExperiments(NULL, 0); | 132 testing::SetExperiments(NULL, 0); |
| 108 } | 133 } |
| 109 | 134 |
| 110 TestingPrefServiceSimple prefs_; | 135 TestingPrefServiceSimple prefs_; |
| 111 }; | 136 }; |
| 112 | 137 |
| 113 TEST_F(AboutFlagsTest, ChangeNeedsRestart) { | 138 TEST_F(AboutFlagsTest, ChangeNeedsRestart) { |
| 114 EXPECT_FALSE(IsRestartNeededToCommitChanges()); | 139 EXPECT_FALSE(IsRestartNeededToCommitChanges()); |
| 115 SetExperimentEnabled(&prefs_, kFlags1, true); | 140 SetExperimentEnabled(&prefs_, kFlags1, true); |
| 116 EXPECT_TRUE(IsRestartNeededToCommitChanges()); | 141 EXPECT_TRUE(IsRestartNeededToCommitChanges()); |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 #endif | 296 #endif |
| 272 | 297 |
| 273 // And it should persist | 298 // And it should persist |
| 274 scoped_ptr<ListValue> switch_prefs(GetFlagsExperimentsData(&prefs_)); | 299 scoped_ptr<ListValue> switch_prefs(GetFlagsExperimentsData(&prefs_)); |
| 275 ASSERT_TRUE(switch_prefs.get()); | 300 ASSERT_TRUE(switch_prefs.get()); |
| 276 EXPECT_EQ(arraysize(kExperiments), switch_prefs->GetSize()); | 301 EXPECT_EQ(arraysize(kExperiments), switch_prefs->GetSize()); |
| 277 } | 302 } |
| 278 | 303 |
| 279 // Tests multi-value type experiments. | 304 // Tests multi-value type experiments. |
| 280 TEST_F(AboutFlagsTest, MultiValues) { | 305 TEST_F(AboutFlagsTest, MultiValues) { |
| 306 const Experiment& experiment = kExperiments[3]; |
| 307 ASSERT_EQ(kFlags4, experiment.internal_name); |
| 308 |
| 281 // Initially, the first "deactivated" option of the multi experiment should | 309 // Initially, the first "deactivated" option of the multi experiment should |
| 282 // be set. | 310 // be set. |
| 283 { | 311 { |
| 284 CommandLine command_line(CommandLine::NO_PROGRAM); | 312 CommandLine command_line(CommandLine::NO_PROGRAM); |
| 285 ConvertFlagsToSwitches(&prefs_, &command_line); | 313 ConvertFlagsToSwitches(&prefs_, &command_line); |
| 286 EXPECT_FALSE(command_line.HasSwitch(kMultiSwitch1)); | 314 EXPECT_FALSE(command_line.HasSwitch(kMultiSwitch1)); |
| 287 EXPECT_FALSE(command_line.HasSwitch(kMultiSwitch2)); | 315 EXPECT_FALSE(command_line.HasSwitch(kMultiSwitch2)); |
| 288 } | 316 } |
| 289 | 317 |
| 290 // Enable the 2nd choice of the multi-value. | 318 // Enable the 2nd choice of the multi-value. |
| 291 SetExperimentEnabled(&prefs_, std::string(kFlags4) + | 319 SetExperimentEnabled(&prefs_, experiment.NameForChoice(2), true); |
| 292 std::string(testing::kMultiSeparator) + | |
| 293 base::IntToString(2), true); | |
| 294 { | 320 { |
| 295 CommandLine command_line(CommandLine::NO_PROGRAM); | 321 CommandLine command_line(CommandLine::NO_PROGRAM); |
| 296 ConvertFlagsToSwitches(&prefs_, &command_line); | 322 ConvertFlagsToSwitches(&prefs_, &command_line); |
| 297 EXPECT_FALSE(command_line.HasSwitch(kMultiSwitch1)); | 323 EXPECT_FALSE(command_line.HasSwitch(kMultiSwitch1)); |
| 298 EXPECT_TRUE(command_line.HasSwitch(kMultiSwitch2)); | 324 EXPECT_TRUE(command_line.HasSwitch(kMultiSwitch2)); |
| 299 EXPECT_EQ(std::string(kValueForMultiSwitch2), | 325 EXPECT_EQ(std::string(kValueForMultiSwitch2), |
| 300 command_line.GetSwitchValueASCII(kMultiSwitch2)); | 326 command_line.GetSwitchValueASCII(kMultiSwitch2)); |
| 301 } | 327 } |
| 302 | 328 |
| 303 // Disable the multi-value experiment. | 329 // Disable the multi-value experiment. |
| 304 SetExperimentEnabled(&prefs_, std::string(kFlags4) + | 330 SetExperimentEnabled(&prefs_, experiment.NameForChoice(0), true); |
| 305 std::string(testing::kMultiSeparator) + | |
| 306 base::IntToString(0), true); | |
| 307 { | 331 { |
| 308 CommandLine command_line(CommandLine::NO_PROGRAM); | 332 CommandLine command_line(CommandLine::NO_PROGRAM); |
| 309 ConvertFlagsToSwitches(&prefs_, &command_line); | 333 ConvertFlagsToSwitches(&prefs_, &command_line); |
| 310 EXPECT_FALSE(command_line.HasSwitch(kMultiSwitch1)); | 334 EXPECT_FALSE(command_line.HasSwitch(kMultiSwitch1)); |
| 311 EXPECT_FALSE(command_line.HasSwitch(kMultiSwitch2)); | 335 EXPECT_FALSE(command_line.HasSwitch(kMultiSwitch2)); |
| 312 } | 336 } |
| 313 } | 337 } |
| 314 | 338 |
| 339 TEST_F(AboutFlagsTest, EnableDisableValues) { |
| 340 const Experiment& experiment = kExperiments[4]; |
| 341 ASSERT_EQ(kFlags5, experiment.internal_name); |
| 342 |
| 343 // Nothing selected. |
| 344 { |
| 345 CommandLine command_line(CommandLine::NO_PROGRAM); |
| 346 ConvertFlagsToSwitches(&prefs_, &command_line); |
| 347 EXPECT_FALSE(command_line.HasSwitch(kSwitch1)); |
| 348 EXPECT_FALSE(command_line.HasSwitch(kSwitch2)); |
| 349 } |
| 350 |
| 351 // "Enable" option selected. |
| 352 SetExperimentEnabled(&prefs_, experiment.NameForChoice(1), true); |
| 353 { |
| 354 CommandLine command_line(CommandLine::NO_PROGRAM); |
| 355 ConvertFlagsToSwitches(&prefs_, &command_line); |
| 356 EXPECT_TRUE(command_line.HasSwitch(kSwitch1)); |
| 357 EXPECT_FALSE(command_line.HasSwitch(kSwitch2)); |
| 358 EXPECT_EQ(kEnableDisableValue1, command_line.GetSwitchValueASCII(kSwitch1)); |
| 359 } |
| 360 |
| 361 // "Disable" option selected. |
| 362 SetExperimentEnabled(&prefs_, experiment.NameForChoice(2), true); |
| 363 { |
| 364 CommandLine command_line(CommandLine::NO_PROGRAM); |
| 365 ConvertFlagsToSwitches(&prefs_, &command_line); |
| 366 EXPECT_FALSE(command_line.HasSwitch(kSwitch1)); |
| 367 EXPECT_TRUE(command_line.HasSwitch(kSwitch2)); |
| 368 EXPECT_EQ(kEnableDisableValue2, command_line.GetSwitchValueASCII(kSwitch2)); |
| 369 } |
| 370 |
| 371 // "Default" option selected, same as nothing selected. |
| 372 SetExperimentEnabled(&prefs_, experiment.NameForChoice(0), true); |
| 373 { |
| 374 CommandLine command_line(CommandLine::NO_PROGRAM); |
| 375 ConvertFlagsToSwitches(&prefs_, &command_line); |
| 376 EXPECT_FALSE(command_line.HasSwitch(kMultiSwitch1)); |
| 377 EXPECT_FALSE(command_line.HasSwitch(kMultiSwitch2)); |
| 378 } |
| 379 } |
| 380 |
| 315 // Makes sure there are no separators in any of the experiment names. | 381 // Makes sure there are no separators in any of the experiment names. |
| 316 TEST_F(AboutFlagsTest, NoSeparators) { | 382 TEST_F(AboutFlagsTest, NoSeparators) { |
| 317 testing::SetExperiments(NULL, 0); | 383 testing::SetExperiments(NULL, 0); |
| 318 size_t count; | 384 size_t count; |
| 319 const Experiment* experiments = testing::GetExperiments(&count); | 385 const Experiment* experiments = testing::GetExperiments(&count); |
| 320 for (size_t i = 0; i < count; ++i) { | 386 for (size_t i = 0; i < count; ++i) { |
| 321 std::string name = experiments->internal_name; | 387 std::string name = experiments->internal_name; |
| 322 EXPECT_EQ(std::string::npos, name.find(testing::kMultiSeparator)) << i; | 388 EXPECT_EQ(std::string::npos, name.find(testing::kMultiSeparator)) << i; |
| 323 } | 389 } |
| 324 } | 390 } |
| 325 | 391 |
| 326 } // namespace about_flags | 392 } // namespace about_flags |
| OLD | NEW |