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

Unified Diff: chrome/browser/about_flags_unittest.cc

Issue 1408783002: Support base::Feature entries in chrome://flags. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address comments. Created 5 years, 2 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/about_flags.cc ('k') | chrome/browser/profiles/profile_window.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/about_flags_unittest.cc
diff --git a/chrome/browser/about_flags_unittest.cc b/chrome/browser/about_flags_unittest.cc
index 2d86b973a8468118e0055ac7793d9334b4bc023e..e954497c05dd68353fba78cde5ce395e7929b371 100644
--- a/chrome/browser/about_flags_unittest.cc
+++ b/chrome/browser/about_flags_unittest.cc
@@ -8,10 +8,12 @@
#include <utility>
#include "base/files/file_path.h"
+#include "base/format_macros.h"
#include "base/path_service.h"
#include "base/prefs/pref_registry_simple.h"
#include "base/prefs/testing_pref_service.h"
#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_split.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
@@ -19,6 +21,7 @@
#include "chrome/grit/chromium_strings.h"
#include "components/flags_ui/flags_ui_pref_names.h"
#include "components/flags_ui/pref_service_flags_storage.h"
+#include "content/public/common/content_switches.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/libxml/chromium/libxml_utils.h"
@@ -32,6 +35,7 @@ const char kFlags3[] = "flag3";
const char kFlags4[] = "flag4";
const char kFlags5[] = "flag5";
const char kFlags6[] = "flag6";
+const char kFlags7[] = "flag7";
const char kSwitch1[] = "switch";
const char kSwitch2[] = "switch2";
@@ -186,6 +190,8 @@ std::string FilePathStringTypeToString(const base::FilePath::StringType& path) {
#endif
}
+// Get all associated switches corresponding to defined about_flags.cc entries.
+// Does not include information about FEATURE_VALUE entries.
std::set<std::string> GetAllSwitchesForTesting() {
std::set<std::string> result;
@@ -195,17 +201,22 @@ std::set<std::string> GetAllSwitchesForTesting() {
for (size_t i = 0; i < num_entries; ++i) {
const FeatureEntry& entry = entries[i];
- if (entry.type == FeatureEntry::SINGLE_VALUE ||
- entry.type == FeatureEntry::SINGLE_DISABLE_VALUE) {
- result.insert(entry.command_line_switch);
- } else if (entry.type == FeatureEntry::MULTI_VALUE) {
- for (int j = 0; j < entry.num_choices; ++j) {
- result.insert(entry.choices[j].command_line_switch);
- }
- } else {
- DCHECK_EQ(entry.type, FeatureEntry::ENABLE_DISABLE_VALUE);
- result.insert(entry.command_line_switch);
- result.insert(entry.disable_command_line_switch);
+ switch (entry.type) {
+ case FeatureEntry::SINGLE_VALUE:
+ case FeatureEntry::SINGLE_DISABLE_VALUE:
+ result.insert(entry.command_line_switch);
+ break;
+ case FeatureEntry::MULTI_VALUE:
+ for (int j = 0; j < entry.num_choices; ++j) {
+ result.insert(entry.choices[j].command_line_switch);
+ }
+ break;
+ case FeatureEntry::ENABLE_DISABLE_VALUE:
+ result.insert(entry.command_line_switch);
+ result.insert(entry.disable_command_line_switch);
+ break;
+ case FeatureEntry::FEATURE_VALUE:
+ break;
}
}
return result;
@@ -222,84 +233,33 @@ const FeatureEntry::Choice kMultiChoices[] = {
// The entries that are set for these tests. The 3rd entry is not supported on
// the current platform, all others are.
static FeatureEntry kEntries[] = {
- {
- kFlags1,
- IDS_PRODUCT_NAME,
- IDS_PRODUCT_NAME,
- 0, // Ends up being mapped to the current platform.
- FeatureEntry::SINGLE_VALUE,
- kSwitch1,
- "",
- NULL,
- NULL,
- NULL,
- 0
- },
- {
- kFlags2,
- IDS_PRODUCT_NAME,
- IDS_PRODUCT_NAME,
- 0, // Ends up being mapped to the current platform.
- FeatureEntry::SINGLE_VALUE,
- kSwitch2,
- kValueForSwitch2,
- NULL,
- NULL,
- NULL,
- 0
- },
- {
- kFlags3,
- IDS_PRODUCT_NAME,
- IDS_PRODUCT_NAME,
- 0, // This ends up enabling for an OS other than the current.
- FeatureEntry::SINGLE_VALUE,
- kSwitch3,
- "",
- NULL,
- NULL,
- NULL,
- 0
- },
- {
- kFlags4,
- IDS_PRODUCT_NAME,
- IDS_PRODUCT_NAME,
- 0, // Ends up being mapped to the current platform.
- FeatureEntry::MULTI_VALUE,
- "",
- "",
- "",
- "",
- kMultiChoices,
- arraysize(kMultiChoices)
- },
- {
- kFlags5,
- IDS_PRODUCT_NAME,
- IDS_PRODUCT_NAME,
- 0, // Ends up being mapped to the current platform.
- FeatureEntry::ENABLE_DISABLE_VALUE,
- kSwitch1,
- kEnableDisableValue1,
- kSwitch2,
- kEnableDisableValue2,
- NULL,
- 3
- },
- {
- kFlags6,
- IDS_PRODUCT_NAME,
- IDS_PRODUCT_NAME,
- 0,
- FeatureEntry::SINGLE_DISABLE_VALUE,
- kSwitch6,
- "",
- NULL,
- NULL,
- NULL,
- 0
- },
+ {kFlags1, IDS_PRODUCT_NAME, IDS_PRODUCT_NAME,
+ 0, // Ends up being mapped to the current platform.
+ FeatureEntry::SINGLE_VALUE, kSwitch1, "", nullptr, nullptr, nullptr,
+ nullptr, 0},
+ {kFlags2, IDS_PRODUCT_NAME, IDS_PRODUCT_NAME,
+ 0, // Ends up being mapped to the current platform.
+ FeatureEntry::SINGLE_VALUE, kSwitch2, kValueForSwitch2, nullptr, nullptr,
+ nullptr, nullptr, 0},
+ {kFlags3, IDS_PRODUCT_NAME, IDS_PRODUCT_NAME,
+ 0, // This ends up enabling for an OS other than the current.
+ FeatureEntry::SINGLE_VALUE, kSwitch3, "", nullptr, nullptr, nullptr,
+ nullptr, 0},
+ {kFlags4, IDS_PRODUCT_NAME, IDS_PRODUCT_NAME,
+ 0, // Ends up being mapped to the current platform.
+ FeatureEntry::MULTI_VALUE, "", "", "", "", nullptr, kMultiChoices,
+ arraysize(kMultiChoices)},
+ {kFlags5, IDS_PRODUCT_NAME, IDS_PRODUCT_NAME,
+ 0, // Ends up being mapped to the current platform.
+ FeatureEntry::ENABLE_DISABLE_VALUE, kSwitch1, kEnableDisableValue1,
+ kSwitch2, kEnableDisableValue2, nullptr, nullptr, 3},
+ {kFlags6, IDS_PRODUCT_NAME, IDS_PRODUCT_NAME, 0,
+ FeatureEntry::SINGLE_DISABLE_VALUE, kSwitch6, "", nullptr, nullptr,
+ nullptr, nullptr, 0},
+ {kFlags7, IDS_PRODUCT_NAME, IDS_PRODUCT_NAME,
+ 0, // Ends up being mapped to the current platform.
+ FeatureEntry::FEATURE_VALUE, nullptr, nullptr, nullptr, nullptr,
+ "FeatureName", nullptr, 3},
};
class AboutFlagsTest : public ::testing::Test {
@@ -322,7 +282,7 @@ class AboutFlagsTest : public ::testing::Test {
testing::SetFeatureEntries(kEntries, arraysize(kEntries));
}
- void TearDown() override { testing::SetFeatureEntries(NULL, 0); }
+ void TearDown() override { testing::SetFeatureEntries(nullptr, 0); }
TestingPrefServiceSimple prefs_;
flags_ui::PrefServiceFlagsStorage flags_storage_;
@@ -367,13 +327,13 @@ TEST_F(AboutFlagsTest, MultiFlagChangeNeedsRestart) {
}
TEST_F(AboutFlagsTest, AddTwoFlagsRemoveOne) {
- // Add two entriess, check they're there.
+ // Add two entries, check they're there.
SetFeatureEntryEnabled(&flags_storage_, kFlags1, true);
SetFeatureEntryEnabled(&flags_storage_, kFlags2, true);
const base::ListValue* entries_list =
prefs_.GetList(flags_ui::prefs::kEnabledLabsExperiments);
- ASSERT_TRUE(entries_list != NULL);
+ ASSERT_TRUE(entries_list != nullptr);
ASSERT_EQ(2u, entries_list->GetSize());
@@ -389,7 +349,7 @@ TEST_F(AboutFlagsTest, AddTwoFlagsRemoveOne) {
SetFeatureEntryEnabled(&flags_storage_, kFlags2, false);
entries_list = prefs_.GetList(flags_ui::prefs::kEnabledLabsExperiments);
- ASSERT_TRUE(entries_list != NULL);
+ ASSERT_TRUE(entries_list != nullptr);
ASSERT_EQ(1u, entries_list->GetSize());
ASSERT_TRUE(entries_list->GetString(0, &s0));
EXPECT_TRUE(s0 == kFlags1);
@@ -401,13 +361,13 @@ TEST_F(AboutFlagsTest, AddTwoFlagsRemoveBoth) {
SetFeatureEntryEnabled(&flags_storage_, kFlags2, true);
const base::ListValue* entries_list =
prefs_.GetList(flags_ui::prefs::kEnabledLabsExperiments);
- ASSERT_TRUE(entries_list != NULL);
+ ASSERT_TRUE(entries_list != nullptr);
// Remove both, the pref should have been removed completely.
SetFeatureEntryEnabled(&flags_storage_, kFlags1, false);
SetFeatureEntryEnabled(&flags_storage_, kFlags2, false);
entries_list = prefs_.GetList(flags_ui::prefs::kEnabledLabsExperiments);
- EXPECT_TRUE(entries_list == NULL || entries_list->GetSize() == 0);
+ EXPECT_TRUE(entries_list == nullptr || entries_list->GetSize() == 0);
}
TEST_F(AboutFlagsTest, ConvertFlagsToSwitches) {
@@ -454,8 +414,8 @@ TEST_F(AboutFlagsTest, CompareSwitchesToCurrentCommandLine) {
base::CommandLine new_command_line(base::CommandLine::NO_PROGRAM);
ConvertFlagsToSwitches(&flags_storage_, &new_command_line, kAddSentinels);
- EXPECT_FALSE(AreSwitchesIdenticalToCurrentCommandLine(
- new_command_line, command_line, NULL));
+ EXPECT_FALSE(AreSwitchesIdenticalToCurrentCommandLine(new_command_line,
+ command_line, nullptr));
{
std::set<base::CommandLine::StringType> difference;
EXPECT_FALSE(AreSwitchesIdenticalToCurrentCommandLine(
@@ -466,8 +426,8 @@ TEST_F(AboutFlagsTest, CompareSwitchesToCurrentCommandLine) {
ConvertFlagsToSwitches(&flags_storage_, &command_line, kAddSentinels);
- EXPECT_TRUE(AreSwitchesIdenticalToCurrentCommandLine(
- new_command_line, command_line, NULL));
+ EXPECT_TRUE(AreSwitchesIdenticalToCurrentCommandLine(new_command_line,
+ command_line, nullptr));
{
std::set<base::CommandLine::StringType> difference;
EXPECT_TRUE(AreSwitchesIdenticalToCurrentCommandLine(
@@ -483,7 +443,7 @@ TEST_F(AboutFlagsTest, CompareSwitchesToCurrentCommandLine) {
ConvertFlagsToSwitches(&flags_storage_, &another_command_line, kAddSentinels);
EXPECT_FALSE(AreSwitchesIdenticalToCurrentCommandLine(
- new_command_line, another_command_line, NULL));
+ new_command_line, another_command_line, nullptr));
{
std::set<base::CommandLine::StringType> difference;
EXPECT_FALSE(AreSwitchesIdenticalToCurrentCommandLine(
@@ -508,12 +468,10 @@ TEST_F(AboutFlagsTest, RemoveFlagSwitches) {
// This shouldn't do anything before ConvertFlagsToSwitches() wasn't called.
RemoveFlagsSwitches(&switch_list);
ASSERT_EQ(4u, switch_list.size());
- EXPECT_TRUE(switch_list.find(kSwitch1) != switch_list.end());
- EXPECT_TRUE(switch_list.find(switches::kFlagSwitchesBegin) !=
- switch_list.end());
- EXPECT_TRUE(switch_list.find(switches::kFlagSwitchesEnd) !=
- switch_list.end());
- EXPECT_TRUE(switch_list.find("foo") != switch_list.end());
+ EXPECT_TRUE(ContainsKey(switch_list, kSwitch1));
+ EXPECT_TRUE(ContainsKey(switch_list, switches::kFlagSwitchesBegin));
+ EXPECT_TRUE(ContainsKey(switch_list, switches::kFlagSwitchesEnd));
+ EXPECT_TRUE(ContainsKey(switch_list, "foo"));
// Call ConvertFlagsToSwitches(), then RemoveFlagsSwitches() again.
base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
@@ -523,7 +481,81 @@ TEST_F(AboutFlagsTest, RemoveFlagSwitches) {
// Now the about:flags-related switch should have been removed.
ASSERT_EQ(1u, switch_list.size());
- EXPECT_TRUE(switch_list.find("foo") != switch_list.end());
+ EXPECT_TRUE(ContainsKey(switch_list, "foo"));
+}
+
+TEST_F(AboutFlagsTest, RemoveFlagSwitches_Features) {
+ struct {
+ int enabled_choice; // 0: default, 1: enabled, 2: disabled.
+ const char* existing_enable_features;
+ const char* existing_disable_features;
+ const char* expected_enable_features;
+ const char* expected_disable_features;
+ } cases[] = {
+ // Default value: Should not affect existing flags.
+ {0, nullptr, nullptr, nullptr, nullptr},
+ {0, "A,B", "C", "A,B", "C"},
+ // "Enable" option: should only affect enabled list.
+ {1, nullptr, nullptr, "FeatureName", nullptr},
+ {1, "A,B", "C", "A,B,FeatureName", "C"},
+ // "Disable" option: should only affect disabled list.
+ {2, nullptr, nullptr, nullptr, "FeatureName"},
+ {2, "A,B", "C", "A,B", "C,FeatureName"},
+ };
+
+ for (size_t i = 0; i < arraysize(cases); ++i) {
+ SCOPED_TRACE(base::StringPrintf(
+ "Test[%" PRIuS "]: %d [%s] [%s]", i, cases[i].enabled_choice,
+ cases[i].existing_enable_features ? cases[i].existing_enable_features
+ : "null",
+ cases[i].existing_disable_features ? cases[i].existing_disable_features
+ : "null"));
+
+ base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
+ if (cases[i].existing_enable_features) {
+ command_line.AppendSwitchASCII(switches::kEnableFeatures,
+ cases[i].existing_enable_features);
+ }
+ if (cases[i].existing_disable_features) {
+ command_line.AppendSwitchASCII(switches::kDisableFeatures,
+ cases[i].existing_disable_features);
+ }
+
+ testing::ClearState();
+
+ const std::string entry_name = base::StringPrintf(
+ "%s%s%d", kFlags7, testing::kMultiSeparator, cases[i].enabled_choice);
+ SetFeatureEntryEnabled(&flags_storage_, entry_name, true);
+
+ ConvertFlagsToSwitches(&flags_storage_, &command_line, kAddSentinels);
+ auto switch_list = command_line.GetSwitches();
+ EXPECT_EQ(cases[i].expected_enable_features != nullptr,
+ ContainsKey(switch_list, switches::kEnableFeatures));
+ if (cases[i].expected_enable_features)
+ EXPECT_EQ(CreateSwitch(cases[i].expected_enable_features),
+ switch_list[switches::kEnableFeatures]);
+
+ EXPECT_EQ(cases[i].expected_disable_features != nullptr,
+ ContainsKey(switch_list, switches::kDisableFeatures));
+ if (cases[i].expected_disable_features)
+ EXPECT_EQ(CreateSwitch(cases[i].expected_disable_features),
+ switch_list[switches::kDisableFeatures]);
+
+ // RemoveFlagsSwitches() should result in the original values for these
+ // switches.
+ switch_list = command_line.GetSwitches();
+ RemoveFlagsSwitches(&switch_list);
+ EXPECT_EQ(cases[i].existing_enable_features != nullptr,
+ ContainsKey(switch_list, switches::kEnableFeatures));
+ if (cases[i].existing_enable_features)
+ EXPECT_EQ(CreateSwitch(cases[i].existing_enable_features),
+ switch_list[switches::kEnableFeatures]);
+ EXPECT_EQ(cases[i].existing_disable_features != nullptr,
+ ContainsKey(switch_list, switches::kEnableFeatures));
+ if (cases[i].existing_disable_features)
+ EXPECT_EQ(CreateSwitch(cases[i].existing_disable_features),
+ switch_list[switches::kDisableFeatures]);
+ }
}
// Tests enabling entries that aren't supported on the current platform.
@@ -714,9 +746,65 @@ TEST_F(AboutFlagsTest, EnableDisableValues) {
}
}
+TEST_F(AboutFlagsTest, FeatureValues) {
+ const FeatureEntry& entry = kEntries[6];
+ ASSERT_EQ(kFlags7, entry.internal_name);
+
+ struct {
+ int enabled_choice;
+ const char* existing_enable_features;
+ const char* existing_disable_features;
+ const char* expected_enable_features;
+ const char* expected_disable_features;
+ } cases[] = {
+ // Nothing selected.
+ {-1, nullptr, nullptr, "", ""},
+ // "Default" option selected, same as nothing selected.
+ {0, nullptr, nullptr, "", ""},
+ // "Enable" option selected.
+ {1, nullptr, nullptr, "FeatureName", ""},
+ // "Disable" option selected.
+ {2, nullptr, nullptr, "", "FeatureName"},
+ // "Enable" option should get added to the existing list.
+ {1, "Foo,Bar", nullptr, "Foo,Bar,FeatureName", ""},
+ // "Disable" option should get added to the existing list.
+ {2, nullptr, "Foo,Bar", "", "Foo,Bar,FeatureName"},
+ };
+
+ for (size_t i = 0; i < arraysize(cases); ++i) {
+ SCOPED_TRACE(base::StringPrintf(
+ "Test[%" PRIuS "]: %d [%s] [%s]", i, cases[i].enabled_choice,
+ cases[i].existing_enable_features ? cases[i].existing_enable_features
+ : "null",
+ cases[i].existing_disable_features ? cases[i].existing_disable_features
+ : "null"));
+
+ if (cases[i].enabled_choice != -1) {
+ SetFeatureEntryEnabled(
+ &flags_storage_, entry.NameForChoice(cases[i].enabled_choice), true);
+ }
+
+ base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
+ if (cases[i].existing_enable_features) {
+ command_line.AppendSwitchASCII(switches::kEnableFeatures,
+ cases[i].existing_enable_features);
+ }
+ if (cases[i].existing_disable_features) {
+ command_line.AppendSwitchASCII(switches::kDisableFeatures,
+ cases[i].existing_disable_features);
+ }
+
+ ConvertFlagsToSwitches(&flags_storage_, &command_line, kAddSentinels);
+ EXPECT_EQ(cases[i].expected_enable_features,
+ command_line.GetSwitchValueASCII(switches::kEnableFeatures));
+ EXPECT_EQ(cases[i].expected_disable_features,
+ command_line.GetSwitchValueASCII(switches::kDisableFeatures));
+ }
+}
+
// Makes sure there are no separators in any of the entry names.
TEST_F(AboutFlagsTest, NoSeparators) {
- testing::SetFeatureEntries(NULL, 0);
+ testing::SetFeatureEntries(nullptr, 0);
size_t count;
const FeatureEntry* entries = testing::GetFeatureEntries(&count);
for (size_t i = 0; i < count; ++i) {
« no previous file with comments | « chrome/browser/about_flags.cc ('k') | chrome/browser/profiles/profile_window.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698