| // Copyright 2019 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "base/scoped_add_feature_flags.h" |
| |
| #include <cstring> |
| #include <string> |
| |
| #include "base/base_switches.h" |
| #include "base/command_line.h" |
| #include "base/feature_list.h" |
| #include "base/strings/string_util.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace base { |
| |
| namespace { |
| |
| // Converts a string to CommandLine::StringType, which is std::wstring on |
| // Windows and std::string on other platforms. |
| CommandLine::StringType ToCommandLineStringType(StringPiece s) { |
| return CommandLine::StringType(s.begin(), s.end()); |
| } |
| |
| } // namespace |
| |
| TEST(ScopedAddFeatureFlags, ConflictWithExistingFlags) { |
| CommandLine command_line(CommandLine::NO_PROGRAM); |
| command_line.AppendSwitchASCII(switches::kEnableFeatures, |
| "ExistingEnabledFoo,ExistingEnabledBar"); |
| command_line.AppendSwitchASCII(switches::kDisableFeatures, |
| "ExistingDisabledFoo,ExistingDisabledBar"); |
| |
| static BASE_FEATURE(kExistingEnabledFoo, "ExistingEnabledFoo", |
| FEATURE_DISABLED_BY_DEFAULT); |
| static BASE_FEATURE(kExistingDisabledFoo, "ExistingDisabledFoo", |
| FEATURE_DISABLED_BY_DEFAULT); |
| static BASE_FEATURE(kEnabledBaz, "EnabledBaz", FEATURE_DISABLED_BY_DEFAULT); |
| static BASE_FEATURE(kDisabledBaz, "DisabledBaz", FEATURE_DISABLED_BY_DEFAULT); |
| { |
| ScopedAddFeatureFlags scoped_add(&command_line); |
| scoped_add.EnableIfNotSet(kExistingEnabledFoo); |
| scoped_add.EnableIfNotSet(kExistingDisabledFoo); |
| scoped_add.EnableIfNotSet(kEnabledBaz); |
| scoped_add.DisableIfNotSet(kExistingEnabledFoo); |
| scoped_add.DisableIfNotSet(kExistingDisabledFoo); |
| scoped_add.DisableIfNotSet(kDisabledBaz); |
| } |
| |
| EXPECT_EQ(std::string("ExistingEnabledFoo,ExistingEnabledBar,EnabledBaz"), |
| command_line.GetSwitchValueASCII(switches::kEnableFeatures)); |
| EXPECT_EQ(std::string("ExistingDisabledFoo,ExistingDisabledBar,DisabledBaz"), |
| command_line.GetSwitchValueASCII(switches::kDisableFeatures)); |
| |
| // There should not be duplicate --enable-features or --disable-features flags |
| EXPECT_EQ( |
| ToCommandLineStringType( |
| " --enable-features=ExistingEnabledFoo,ExistingEnabledBar,EnabledBaz" |
| " --disable-features=ExistingDisabledFoo,ExistingDisabledBar," |
| "DisabledBaz"), |
| JoinString(command_line.argv(), ToCommandLineStringType(" "))); |
| } |
| |
| TEST(ScopedAddFeatureFlags, FlagWithParameter) { |
| CommandLine command_line(CommandLine::NO_PROGRAM); |
| command_line.AppendSwitchASCII(switches::kEnableFeatures, |
| "ExistingEnabledFoo"); |
| static BASE_FEATURE(kExistingEnabledFoo, "ExistingEnabledFoo", |
| FEATURE_DISABLED_BY_DEFAULT); |
| static BASE_FEATURE(kFeatureWithParameter, "FeatureWithParam", |
| FEATURE_DISABLED_BY_DEFAULT); |
| |
| { |
| ScopedAddFeatureFlags scoped_add(&command_line); |
| scoped_add.EnableIfNotSet(kExistingEnabledFoo); |
| scoped_add.EnableIfNotSetWithParameter(kFeatureWithParameter, "name", |
| "value"); |
| EXPECT_TRUE(scoped_add.IsEnabledWithParameter(kFeatureWithParameter, "name", |
| "value")); |
| } |
| |
| EXPECT_EQ(std::string("ExistingEnabledFoo,FeatureWithParam:name/value"), |
| command_line.GetSwitchValueASCII(switches::kEnableFeatures)); |
| } |
| |
| } // namespace base |