summaryrefslogtreecommitdiff
path: root/chromium/components/feature_engagement_tracker/internal/chrome_variations_configuration_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/feature_engagement_tracker/internal/chrome_variations_configuration_unittest.cc')
-rw-r--r--chromium/components/feature_engagement_tracker/internal/chrome_variations_configuration_unittest.cc622
1 files changed, 622 insertions, 0 deletions
diff --git a/chromium/components/feature_engagement_tracker/internal/chrome_variations_configuration_unittest.cc b/chromium/components/feature_engagement_tracker/internal/chrome_variations_configuration_unittest.cc
new file mode 100644
index 00000000000..9b6e1ea5f8b
--- /dev/null
+++ b/chromium/components/feature_engagement_tracker/internal/chrome_variations_configuration_unittest.cc
@@ -0,0 +1,622 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/feature_engagement_tracker/internal/chrome_variations_configuration.h"
+
+#include <map>
+#include <string>
+#include <vector>
+
+#include "base/feature_list.h"
+#include "base/metrics/field_trial.h"
+#include "base/metrics/field_trial_param_associator.h"
+#include "base/metrics/field_trial_params.h"
+#include "base/test/histogram_tester.h"
+#include "base/test/scoped_feature_list.h"
+#include "components/feature_engagement_tracker/internal/configuration.h"
+#include "components/feature_engagement_tracker/internal/stats.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace feature_engagement_tracker {
+
+namespace {
+
+const base::Feature kTestFeatureFoo{"test_foo",
+ base::FEATURE_DISABLED_BY_DEFAULT};
+const base::Feature kTestFeatureBar{"test_bar",
+ base::FEATURE_DISABLED_BY_DEFAULT};
+const base::Feature kTestFeatureQux{"test_qux",
+ base::FEATURE_DISABLED_BY_DEFAULT};
+
+const char kFooTrialName[] = "FooTrial";
+const char kBarTrialName[] = "BarTrial";
+const char kQuxTrialName[] = "QuxTrial";
+const char kGroupName[] = "Group1";
+const char kConfigParseEventName[] = "InProductHelp.Config.ParsingEvent";
+
+class ChromeVariationsConfigurationTest : public ::testing::Test {
+ public:
+ ChromeVariationsConfigurationTest() : field_trials_(nullptr) {
+ base::FieldTrial* foo_trial =
+ base::FieldTrialList::CreateFieldTrial(kFooTrialName, kGroupName);
+ base::FieldTrial* bar_trial =
+ base::FieldTrialList::CreateFieldTrial(kBarTrialName, kGroupName);
+ base::FieldTrial* qux_trial =
+ base::FieldTrialList::CreateFieldTrial(kQuxTrialName, kGroupName);
+ trials_[&kTestFeatureFoo] = foo_trial;
+ trials_[&kTestFeatureBar] = bar_trial;
+ trials_[&kTestFeatureQux] = qux_trial;
+
+ std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList);
+ feature_list->RegisterFieldTrialOverride(
+ kTestFeatureFoo.name, base::FeatureList::OVERRIDE_ENABLE_FEATURE,
+ foo_trial);
+ feature_list->RegisterFieldTrialOverride(
+ kTestFeatureBar.name, base::FeatureList::OVERRIDE_ENABLE_FEATURE,
+ bar_trial);
+ feature_list->RegisterFieldTrialOverride(
+ kTestFeatureQux.name, base::FeatureList::OVERRIDE_ENABLE_FEATURE,
+ qux_trial);
+
+ scoped_feature_list.InitWithFeatureList(std::move(feature_list));
+ EXPECT_EQ(foo_trial, base::FeatureList::GetFieldTrial(kTestFeatureFoo));
+ EXPECT_EQ(bar_trial, base::FeatureList::GetFieldTrial(kTestFeatureBar));
+ EXPECT_EQ(qux_trial, base::FeatureList::GetFieldTrial(kTestFeatureQux));
+ }
+
+ void TearDown() override {
+ // This is required to ensure each test can define its own params.
+ base::FieldTrialParamAssociator::GetInstance()->ClearAllParamsForTesting();
+ }
+
+ protected:
+ void SetFeatureParams(const base::Feature& feature,
+ std::map<std::string, std::string> params) {
+ ASSERT_TRUE(base::FieldTrialParamAssociator::GetInstance()
+ ->AssociateFieldTrialParams(trials_[&feature]->trial_name(),
+ kGroupName, params));
+
+ std::map<std::string, std::string> actualParams;
+ EXPECT_TRUE(base::GetFieldTrialParamsByFeature(feature, &actualParams));
+ EXPECT_EQ(params, actualParams);
+ }
+
+ void VerifyInvalid(const std::string& event_config) {
+ std::map<std::string, std::string> foo_params;
+ foo_params["event_used"] = "name:u;comparator:any;window:0;storage:1";
+ foo_params["event_trigger"] = "name:et;comparator:any;window:0;storage:360";
+ foo_params["event_0"] = event_config;
+ SetFeatureParams(kTestFeatureFoo, foo_params);
+
+ std::vector<const base::Feature*> features = {&kTestFeatureFoo};
+ configuration_.ParseFeatureConfigs(features);
+
+ FeatureConfig foo = configuration_.GetFeatureConfig(kTestFeatureFoo);
+ EXPECT_FALSE(foo.valid);
+ }
+
+ ChromeVariationsConfiguration configuration_;
+
+ private:
+ base::FieldTrialList field_trials_;
+ std::map<const base::Feature*, base::FieldTrial*> trials_;
+ base::test::ScopedFeatureList scoped_feature_list;
+
+ DISALLOW_COPY_AND_ASSIGN(ChromeVariationsConfigurationTest);
+};
+
+} // namespace
+
+TEST_F(ChromeVariationsConfigurationTest,
+ DisabledFeatureShouldHaveInvalidConfig) {
+ base::test::ScopedFeatureList scoped_feature_list;
+ scoped_feature_list.InitWithFeatures({}, {kTestFeatureFoo});
+
+ FeatureVector features;
+ features.push_back(&kTestFeatureFoo);
+ base::HistogramTester histogram_tester;
+
+ configuration_.ParseFeatureConfigs(features);
+
+ FeatureConfig foo_config = configuration_.GetFeatureConfig(kTestFeatureFoo);
+ EXPECT_FALSE(foo_config.valid);
+ histogram_tester.ExpectBucketCount(
+ kConfigParseEventName,
+ static_cast<int>(stats::ConfigParsingEvent::FAILURE_NO_FIELD_TRIAL), 1);
+ histogram_tester.ExpectTotalCount(kConfigParseEventName, 1);
+}
+
+TEST_F(ChromeVariationsConfigurationTest, ParseSingleFeature) {
+ std::map<std::string, std::string> foo_params;
+ foo_params["event_used"] =
+ "name:page_download_started;comparator:any;window:0;storage:360";
+ foo_params["event_trigger"] =
+ "name:opened_chrome_home;comparator:any;window:0;storage:360";
+ foo_params["event_1"] =
+ "name:user_has_seen_dino;comparator:>=1;window:120;storage:180";
+ foo_params["event_2"] =
+ "name:user_opened_app_menu;comparator:<=0;window:120;storage:180";
+ foo_params["event_3"] =
+ "name:user_opened_downloads_home;comparator:any;window:0;storage:360";
+ SetFeatureParams(kTestFeatureFoo, foo_params);
+
+ base::HistogramTester histogram_tester;
+ std::vector<const base::Feature*> features = {&kTestFeatureFoo};
+ configuration_.ParseFeatureConfigs(features);
+
+ FeatureConfig foo = configuration_.GetFeatureConfig(kTestFeatureFoo);
+ EXPECT_TRUE(foo.valid);
+ histogram_tester.ExpectBucketCount(
+ kConfigParseEventName,
+ static_cast<int>(stats::ConfigParsingEvent::SUCCESS), 1);
+ histogram_tester.ExpectTotalCount(kConfigParseEventName, 1);
+
+ FeatureConfig expected_foo;
+ expected_foo.valid = true;
+ expected_foo.used =
+ EventConfig("page_download_started", Comparator(ANY, 0), 0, 360);
+ expected_foo.trigger =
+ EventConfig("opened_chrome_home", Comparator(ANY, 0), 0, 360);
+ expected_foo.event_configs.insert(EventConfig(
+ "user_has_seen_dino", Comparator(GREATER_THAN_OR_EQUAL, 1), 120, 180));
+ expected_foo.event_configs.insert(EventConfig(
+ "user_opened_app_menu", Comparator(LESS_THAN_OR_EQUAL, 0), 120, 180));
+ expected_foo.event_configs.insert(
+ EventConfig("user_opened_downloads_home", Comparator(ANY, 0), 0, 360));
+ EXPECT_EQ(expected_foo, foo);
+}
+
+TEST_F(ChromeVariationsConfigurationTest, MissingUsedIsInvalid) {
+ std::map<std::string, std::string> foo_params;
+ foo_params["event_trigger"] = "name:et;comparator:any;window:0;storage:360";
+ SetFeatureParams(kTestFeatureFoo, foo_params);
+
+ base::HistogramTester histogram_tester;
+ std::vector<const base::Feature*> features = {&kTestFeatureFoo};
+ configuration_.ParseFeatureConfigs(features);
+
+ FeatureConfig foo = configuration_.GetFeatureConfig(kTestFeatureFoo);
+ EXPECT_FALSE(foo.valid);
+ histogram_tester.ExpectBucketCount(
+ kConfigParseEventName,
+ static_cast<int>(stats::ConfigParsingEvent::FAILURE_USED_EVENT_MISSING),
+ 1);
+ histogram_tester.ExpectBucketCount(
+ kConfigParseEventName,
+ static_cast<int>(stats::ConfigParsingEvent::FAILURE), 1);
+ histogram_tester.ExpectTotalCount(kConfigParseEventName, 2);
+}
+
+TEST_F(ChromeVariationsConfigurationTest, MissingTriggerIsInvalid) {
+ std::map<std::string, std::string> foo_params;
+ foo_params["event_used"] = "name:eu;comparator:any;window:0;storage:360";
+ SetFeatureParams(kTestFeatureFoo, foo_params);
+
+ base::HistogramTester histogram_tester;
+ std::vector<const base::Feature*> features = {&kTestFeatureFoo};
+ configuration_.ParseFeatureConfigs(features);
+
+ FeatureConfig foo = configuration_.GetFeatureConfig(kTestFeatureFoo);
+ EXPECT_FALSE(foo.valid);
+ histogram_tester.ExpectBucketCount(
+ kConfigParseEventName,
+ static_cast<int>(
+ stats::ConfigParsingEvent::FAILURE_TRIGGER_EVENT_MISSING),
+ 1);
+ histogram_tester.ExpectBucketCount(
+ kConfigParseEventName,
+ static_cast<int>(stats::ConfigParsingEvent::FAILURE), 1);
+ histogram_tester.ExpectTotalCount(kConfigParseEventName, 2);
+}
+
+TEST_F(ChromeVariationsConfigurationTest, OnlyTriggerAndUsedIsValid) {
+ std::map<std::string, std::string> foo_params;
+ foo_params["event_used"] = "name:eu;comparator:any;window:0;storage:360";
+ foo_params["event_trigger"] = "name:et;comparator:any;window:0;storage:360";
+ SetFeatureParams(kTestFeatureFoo, foo_params);
+
+ base::HistogramTester histogram_tester;
+ std::vector<const base::Feature*> features = {&kTestFeatureFoo};
+ configuration_.ParseFeatureConfigs(features);
+
+ FeatureConfig foo = configuration_.GetFeatureConfig(kTestFeatureFoo);
+ EXPECT_TRUE(foo.valid);
+
+ FeatureConfig expected_foo;
+ expected_foo.valid = true;
+ expected_foo.used = EventConfig("eu", Comparator(ANY, 0), 0, 360);
+ expected_foo.trigger = EventConfig("et", Comparator(ANY, 0), 0, 360);
+ EXPECT_EQ(expected_foo, foo);
+ histogram_tester.ExpectBucketCount(
+ kConfigParseEventName,
+ static_cast<int>(stats::ConfigParsingEvent::SUCCESS), 1);
+ histogram_tester.ExpectTotalCount(kConfigParseEventName, 1);
+}
+
+TEST_F(ChromeVariationsConfigurationTest, WhitespaceIsValid) {
+ std::map<std::string, std::string> foo_params;
+ foo_params["event_used"] =
+ " name : eu ; comparator : any ; window : 1 ; storage : 320 ";
+ foo_params["event_trigger"] =
+ " name:et;comparator : any ;window: 2;storage:330 ";
+ foo_params["event_0"] = "name:e0;comparator: <1 ;window:3\n;storage:340";
+ foo_params["event_1"] = "name:e1;comparator: > 2 ;window:4;\rstorage:350";
+ foo_params["event_2"] = "name:e2;comparator: <= 3 ;window:5;\tstorage:360";
+ foo_params["event_3"] = "name:e3;comparator: <\n4 ;window:6;storage:370";
+ foo_params["event_4"] = "name:e4;comparator: >\t5 ;window:7;storage:380";
+ foo_params["event_5"] = "name:e5;comparator: <=\r6 ;window:8;storage:390";
+ foo_params["event_6"] = "name:e6;comparator:\n<=7;window:9;storage:400";
+ foo_params["event_7"] = "name:e7;comparator:<=8\n;window:10;storage:410";
+ SetFeatureParams(kTestFeatureFoo, foo_params);
+
+ std::vector<const base::Feature*> features = {&kTestFeatureFoo};
+ configuration_.ParseFeatureConfigs(features);
+
+ FeatureConfig foo = configuration_.GetFeatureConfig(kTestFeatureFoo);
+ EXPECT_TRUE(foo.valid);
+
+ FeatureConfig expected_foo;
+ expected_foo.valid = true;
+ expected_foo.used = EventConfig("eu", Comparator(ANY, 0), 1, 320);
+ expected_foo.trigger = EventConfig("et", Comparator(ANY, 0), 2, 330);
+ expected_foo.event_configs.insert(
+ EventConfig("e0", Comparator(LESS_THAN, 1), 3, 340));
+ expected_foo.event_configs.insert(
+ EventConfig("e1", Comparator(GREATER_THAN, 2), 4, 350));
+ expected_foo.event_configs.insert(
+ EventConfig("e2", Comparator(LESS_THAN_OR_EQUAL, 3), 5, 360));
+ expected_foo.event_configs.insert(
+ EventConfig("e3", Comparator(LESS_THAN, 4), 6, 370));
+ expected_foo.event_configs.insert(
+ EventConfig("e4", Comparator(GREATER_THAN, 5), 7, 380));
+ expected_foo.event_configs.insert(
+ EventConfig("e5", Comparator(LESS_THAN_OR_EQUAL, 6), 8, 390));
+ expected_foo.event_configs.insert(
+ EventConfig("e6", Comparator(LESS_THAN_OR_EQUAL, 7), 9, 400));
+ expected_foo.event_configs.insert(
+ EventConfig("e7", Comparator(LESS_THAN_OR_EQUAL, 8), 10, 410));
+ EXPECT_EQ(expected_foo, foo);
+}
+
+TEST_F(ChromeVariationsConfigurationTest, IgnoresInvalidConfigKeys) {
+ std::map<std::string, std::string> foo_params;
+ foo_params["event_used"] = "name:eu;comparator:any;window:0;storage:360";
+ foo_params["event_trigger"] = "name:et;comparator:any;window:0;storage:360";
+ foo_params["not_there_yet"] = "bogus value";
+ SetFeatureParams(kTestFeatureFoo, foo_params);
+
+ std::vector<const base::Feature*> features = {&kTestFeatureFoo};
+ configuration_.ParseFeatureConfigs(features);
+
+ FeatureConfig foo = configuration_.GetFeatureConfig(kTestFeatureFoo);
+ EXPECT_TRUE(foo.valid);
+
+ FeatureConfig expected_foo;
+ expected_foo.valid = true;
+ expected_foo.used = EventConfig("eu", Comparator(ANY, 0), 0, 360);
+ expected_foo.trigger = EventConfig("et", Comparator(ANY, 0), 0, 360);
+ EXPECT_EQ(expected_foo, foo);
+}
+
+TEST_F(ChromeVariationsConfigurationTest, IgnoresInvalidEventConfigTokens) {
+ std::map<std::string, std::string> foo_params;
+ foo_params["event_used"] =
+ "name:eu;comparator:any;window:0;storage:360;somethingelse:1";
+ foo_params["event_trigger"] =
+ "yesway:0;noway:1;name:et;comparator:any;window:0;storage:360";
+ SetFeatureParams(kTestFeatureFoo, foo_params);
+
+ std::vector<const base::Feature*> features = {&kTestFeatureFoo};
+ configuration_.ParseFeatureConfigs(features);
+
+ FeatureConfig foo = configuration_.GetFeatureConfig(kTestFeatureFoo);
+ EXPECT_TRUE(foo.valid);
+
+ FeatureConfig expected_foo;
+ expected_foo.valid = true;
+ expected_foo.used = EventConfig("eu", Comparator(ANY, 0), 0, 360);
+ expected_foo.trigger = EventConfig("et", Comparator(ANY, 0), 0, 360);
+ EXPECT_EQ(expected_foo, foo);
+}
+
+TEST_F(ChromeVariationsConfigurationTest,
+ MissingAllEventConfigParamsIsInvalid) {
+ VerifyInvalid("a:1;b:2;c:3;d:4");
+}
+
+TEST_F(ChromeVariationsConfigurationTest,
+ MissingEventEventConfigParamIsInvalid) {
+ VerifyInvalid("foobar:eu;comparator:any;window:1;storage:360");
+}
+
+TEST_F(ChromeVariationsConfigurationTest,
+ MissingComparatorEventConfigParamIsInvalid) {
+ VerifyInvalid("name:eu;foobar:any;window:1;storage:360");
+}
+
+TEST_F(ChromeVariationsConfigurationTest,
+ MissingWindowEventConfigParamIsInvalid) {
+ VerifyInvalid("name:eu;comparator:any;foobar:1;storage:360");
+}
+
+TEST_F(ChromeVariationsConfigurationTest,
+ MissingStorageEventConfigParamIsInvalid) {
+ VerifyInvalid("name:eu;comparator:any;window:1;foobar:360");
+}
+
+TEST_F(ChromeVariationsConfigurationTest,
+ EventSpecifiedMultipleTimesIsInvalid) {
+ VerifyInvalid("name:eu;name:eu;comparator:any;window:1;storage:360");
+}
+
+TEST_F(ChromeVariationsConfigurationTest,
+ ComparatorSpecifiedMultipleTimesIsInvalid) {
+ VerifyInvalid("name:eu;comparator:any;comparator:any;window:1;storage:360");
+}
+
+TEST_F(ChromeVariationsConfigurationTest,
+ WindowSpecifiedMultipleTimesIsInvalid) {
+ VerifyInvalid("name:eu;comparator:any;window:1;window:2;storage:360");
+}
+
+TEST_F(ChromeVariationsConfigurationTest,
+ StorageSpecifiedMultipleTimesIsInvalid) {
+ VerifyInvalid("name:eu;comparator:any;window:1;storage:360;storage:10");
+}
+
+TEST_F(ChromeVariationsConfigurationTest,
+ InvalidSessionRateCausesInvalidConfig) {
+ std::map<std::string, std::string> foo_params;
+ foo_params["event_used"] = "name:eu;comparator:any;window:1;storage:360";
+ foo_params["event_trigger"] = "name:et;comparator:any;window:0;storage:360";
+ foo_params["session_rate"] = "bogus value";
+ SetFeatureParams(kTestFeatureFoo, foo_params);
+
+ base::HistogramTester histogram_tester;
+ std::vector<const base::Feature*> features = {&kTestFeatureFoo};
+ configuration_.ParseFeatureConfigs(features);
+
+ FeatureConfig foo = configuration_.GetFeatureConfig(kTestFeatureFoo);
+ EXPECT_FALSE(foo.valid);
+ histogram_tester.ExpectBucketCount(
+ kConfigParseEventName,
+ static_cast<int>(stats::ConfigParsingEvent::FAILURE_SESSION_RATE_PARSE),
+ 1);
+ histogram_tester.ExpectBucketCount(
+ kConfigParseEventName,
+ static_cast<int>(stats::ConfigParsingEvent::FAILURE), 1);
+ histogram_tester.ExpectTotalCount(kConfigParseEventName, 2);
+}
+
+TEST_F(ChromeVariationsConfigurationTest,
+ InvalidAvailabilityCausesInvalidConfig) {
+ std::map<std::string, std::string> foo_params;
+ foo_params["event_used"] = "name:eu;comparator:any;window:0;storage:360";
+ foo_params["event_trigger"] = "name:et;comparator:any;window:0;storage:360";
+ foo_params["availability"] = "bogus value";
+ SetFeatureParams(kTestFeatureFoo, foo_params);
+
+ base::HistogramTester histogram_tester;
+ std::vector<const base::Feature*> features = {&kTestFeatureFoo};
+ configuration_.ParseFeatureConfigs(features);
+
+ FeatureConfig foo = configuration_.GetFeatureConfig(kTestFeatureFoo);
+ EXPECT_FALSE(foo.valid);
+ histogram_tester.ExpectBucketCount(
+ kConfigParseEventName,
+ static_cast<int>(stats::ConfigParsingEvent::FAILURE_AVAILABILITY_PARSE),
+ 1);
+ histogram_tester.ExpectBucketCount(
+ kConfigParseEventName,
+ static_cast<int>(stats::ConfigParsingEvent::FAILURE), 1);
+ histogram_tester.ExpectTotalCount(kConfigParseEventName, 2);
+}
+
+TEST_F(ChromeVariationsConfigurationTest, InvalidUsedCausesInvalidConfig) {
+ std::map<std::string, std::string> foo_params;
+ foo_params["event_used"] = "bogus value";
+ foo_params["event_trigger"] = "name:et;comparator:any;window:0;storage:360";
+ SetFeatureParams(kTestFeatureFoo, foo_params);
+
+ base::HistogramTester histogram_tester;
+ std::vector<const base::Feature*> features = {&kTestFeatureFoo};
+ configuration_.ParseFeatureConfigs(features);
+
+ FeatureConfig foo = configuration_.GetFeatureConfig(kTestFeatureFoo);
+ EXPECT_FALSE(foo.valid);
+ histogram_tester.ExpectBucketCount(
+ kConfigParseEventName,
+ static_cast<int>(stats::ConfigParsingEvent::FAILURE_USED_EVENT_PARSE), 1);
+ histogram_tester.ExpectBucketCount(
+ kConfigParseEventName,
+ static_cast<int>(stats::ConfigParsingEvent::FAILURE_USED_EVENT_MISSING),
+ 1);
+ histogram_tester.ExpectBucketCount(
+ kConfigParseEventName,
+ static_cast<int>(stats::ConfigParsingEvent::FAILURE), 1);
+ histogram_tester.ExpectTotalCount(kConfigParseEventName, 3);
+}
+
+TEST_F(ChromeVariationsConfigurationTest, InvalidTriggerCausesInvalidConfig) {
+ std::map<std::string, std::string> foo_params;
+ foo_params["event_used"] = "name:eu;comparator:any;window:0;storage:360";
+ foo_params["event_trigger"] = "bogus value";
+ SetFeatureParams(kTestFeatureFoo, foo_params);
+
+ base::HistogramTester histogram_tester;
+ std::vector<const base::Feature*> features = {&kTestFeatureFoo};
+ configuration_.ParseFeatureConfigs(features);
+
+ FeatureConfig foo = configuration_.GetFeatureConfig(kTestFeatureFoo);
+ EXPECT_FALSE(foo.valid);
+ histogram_tester.ExpectBucketCount(
+ kConfigParseEventName,
+ static_cast<int>(stats::ConfigParsingEvent::FAILURE_TRIGGER_EVENT_PARSE),
+ 1);
+ histogram_tester.ExpectBucketCount(
+ kConfigParseEventName,
+ static_cast<int>(
+ stats::ConfigParsingEvent::FAILURE_TRIGGER_EVENT_MISSING),
+ 1);
+ histogram_tester.ExpectBucketCount(
+ kConfigParseEventName,
+ static_cast<int>(stats::ConfigParsingEvent::FAILURE), 1);
+ histogram_tester.ExpectTotalCount(kConfigParseEventName, 3);
+}
+
+TEST_F(ChromeVariationsConfigurationTest,
+ InvalidEventConfigCausesInvalidConfig) {
+ std::map<std::string, std::string> foo_params;
+ foo_params["event_used"] = "name:eu;comparator:any;window:0;storage:360";
+ foo_params["event_trigger"] = "name:et;comparator:any;window:0;storage:360";
+ foo_params["event_used_0"] = "bogus value";
+ SetFeatureParams(kTestFeatureFoo, foo_params);
+
+ std::vector<const base::Feature*> features = {&kTestFeatureFoo};
+ configuration_.ParseFeatureConfigs(features);
+
+ FeatureConfig foo = configuration_.GetFeatureConfig(kTestFeatureFoo);
+ EXPECT_FALSE(foo.valid);
+}
+
+TEST_F(ChromeVariationsConfigurationTest, AllComparatorTypesWork) {
+ std::map<std::string, std::string> foo_params;
+ foo_params["event_used"] = "name:e0;comparator:any;window:20;storage:30";
+ foo_params["event_trigger"] = "name:e1;comparator:<1;window:21;storage:31";
+ foo_params["event_2"] = "name:e2;comparator:>2;window:22;storage:32";
+ foo_params["event_3"] = "name:e3;comparator:<=3;window:23;storage:33";
+ foo_params["event_4"] = "name:e4;comparator:>=4;window:24;storage:34";
+ foo_params["event_5"] = "name:e5;comparator:==5;window:25;storage:35";
+ foo_params["event_6"] = "name:e6;comparator:!=6;window:26;storage:36";
+ foo_params["session_rate"] = "!=6";
+ foo_params["availability"] = ">=1";
+ SetFeatureParams(kTestFeatureFoo, foo_params);
+
+ std::vector<const base::Feature*> features = {&kTestFeatureFoo};
+ configuration_.ParseFeatureConfigs(features);
+
+ FeatureConfig foo = configuration_.GetFeatureConfig(kTestFeatureFoo);
+ EXPECT_TRUE(foo.valid);
+
+ FeatureConfig expected_foo;
+ expected_foo.valid = true;
+ expected_foo.used = EventConfig("e0", Comparator(ANY, 0), 20, 30);
+ expected_foo.trigger = EventConfig("e1", Comparator(LESS_THAN, 1), 21, 31);
+ expected_foo.event_configs.insert(
+ EventConfig("e2", Comparator(GREATER_THAN, 2), 22, 32));
+ expected_foo.event_configs.insert(
+ EventConfig("e3", Comparator(LESS_THAN_OR_EQUAL, 3), 23, 33));
+ expected_foo.event_configs.insert(
+ EventConfig("e4", Comparator(GREATER_THAN_OR_EQUAL, 4), 24, 34));
+ expected_foo.event_configs.insert(
+ EventConfig("e5", Comparator(EQUAL, 5), 25, 35));
+ expected_foo.event_configs.insert(
+ EventConfig("e6", Comparator(NOT_EQUAL, 6), 26, 36));
+ expected_foo.session_rate = Comparator(NOT_EQUAL, 6);
+ expected_foo.availability = Comparator(GREATER_THAN_OR_EQUAL, 1);
+ EXPECT_EQ(expected_foo, foo);
+}
+
+TEST_F(ChromeVariationsConfigurationTest, MultipleEventsWithSameName) {
+ std::map<std::string, std::string> foo_params;
+ foo_params["event_used"] = "name:foo;comparator:any;window:20;storage:30";
+ foo_params["event_trigger"] = "name:foo;comparator:<1;window:21;storage:31";
+ foo_params["event_2"] = "name:foo;comparator:>2;window:22;storage:32";
+ foo_params["event_3"] = "name:foo;comparator:<=3;window:23;storage:33";
+ foo_params["session_rate"] = "any";
+ foo_params["availability"] = ">1";
+ SetFeatureParams(kTestFeatureFoo, foo_params);
+
+ std::vector<const base::Feature*> features = {&kTestFeatureFoo};
+ configuration_.ParseFeatureConfigs(features);
+
+ FeatureConfig foo = configuration_.GetFeatureConfig(kTestFeatureFoo);
+ EXPECT_TRUE(foo.valid);
+
+ FeatureConfig expected_foo;
+ expected_foo.valid = true;
+ expected_foo.used = EventConfig("foo", Comparator(ANY, 0), 20, 30);
+ expected_foo.trigger = EventConfig("foo", Comparator(LESS_THAN, 1), 21, 31);
+ expected_foo.event_configs.insert(
+ EventConfig("foo", Comparator(GREATER_THAN, 2), 22, 32));
+ expected_foo.event_configs.insert(
+ EventConfig("foo", Comparator(LESS_THAN_OR_EQUAL, 3), 23, 33));
+ expected_foo.session_rate = Comparator(ANY, 0);
+ expected_foo.availability = Comparator(GREATER_THAN, 1);
+ EXPECT_EQ(expected_foo, foo);
+}
+
+TEST_F(ChromeVariationsConfigurationTest, ParseMultipleFeatures) {
+ std::map<std::string, std::string> foo_params;
+ foo_params["event_used"] =
+ "name:foo_used;comparator:any;window:20;storage:30";
+ foo_params["event_trigger"] =
+ "name:foo_trigger;comparator:<1;window:21;storage:31";
+ foo_params["session_rate"] = "==10";
+ foo_params["availability"] = "<0";
+ SetFeatureParams(kTestFeatureFoo, foo_params);
+
+ std::map<std::string, std::string> bar_params;
+ bar_params["event_used"] = "name:bar_used;comparator:ANY;window:0;storage:0";
+ SetFeatureParams(kTestFeatureBar, bar_params);
+
+ std::map<std::string, std::string> qux_params;
+ qux_params["event_used"] =
+ "name:qux_used;comparator:>=2;window:99;storage:42";
+ qux_params["event_trigger"] =
+ "name:qux_trigger;comparator:ANY;window:103;storage:104";
+ qux_params["event_0"] = "name:q0;comparator:<10;window:20;storage:30";
+ qux_params["event_1"] = "name:q1;comparator:>11;window:21;storage:31";
+ qux_params["event_2"] = "name:q2;comparator:<=12;window:22;storage:32";
+ qux_params["event_3"] = "name:q3;comparator:>=13;window:23;storage:33";
+ qux_params["event_4"] = "name:q4;comparator:==14;window:24;storage:34";
+ qux_params["event_5"] = "name:q5;comparator:!=15;window:25;storage:35";
+ qux_params["session_rate"] = "!=13";
+ qux_params["availability"] = "==0";
+ SetFeatureParams(kTestFeatureQux, qux_params);
+
+ std::vector<const base::Feature*> features = {
+ &kTestFeatureFoo, &kTestFeatureBar, &kTestFeatureQux};
+ configuration_.ParseFeatureConfigs(features);
+
+ FeatureConfig foo = configuration_.GetFeatureConfig(kTestFeatureFoo);
+ EXPECT_TRUE(foo.valid);
+ FeatureConfig expected_foo;
+ expected_foo.valid = true;
+ expected_foo.used = EventConfig("foo_used", Comparator(ANY, 0), 20, 30);
+ expected_foo.trigger =
+ EventConfig("foo_trigger", Comparator(LESS_THAN, 1), 21, 31);
+ expected_foo.session_rate = Comparator(EQUAL, 10);
+ expected_foo.availability = Comparator(LESS_THAN, 0);
+ EXPECT_EQ(expected_foo, foo);
+
+ FeatureConfig bar = configuration_.GetFeatureConfig(kTestFeatureBar);
+ EXPECT_FALSE(bar.valid);
+
+ FeatureConfig qux = configuration_.GetFeatureConfig(kTestFeatureQux);
+ EXPECT_TRUE(qux.valid);
+ FeatureConfig expected_qux;
+ expected_qux.valid = true;
+ expected_qux.used =
+ EventConfig("qux_used", Comparator(GREATER_THAN_OR_EQUAL, 2), 99, 42);
+ expected_qux.trigger =
+ EventConfig("qux_trigger", Comparator(ANY, 0), 103, 104);
+ expected_qux.event_configs.insert(
+ EventConfig("q0", Comparator(LESS_THAN, 10), 20, 30));
+ expected_qux.event_configs.insert(
+ EventConfig("q1", Comparator(GREATER_THAN, 11), 21, 31));
+ expected_qux.event_configs.insert(
+ EventConfig("q2", Comparator(LESS_THAN_OR_EQUAL, 12), 22, 32));
+ expected_qux.event_configs.insert(
+ EventConfig("q3", Comparator(GREATER_THAN_OR_EQUAL, 13), 23, 33));
+ expected_qux.event_configs.insert(
+ EventConfig("q4", Comparator(EQUAL, 14), 24, 34));
+ expected_qux.event_configs.insert(
+ EventConfig("q5", Comparator(NOT_EQUAL, 15), 25, 35));
+ expected_qux.session_rate = Comparator(NOT_EQUAL, 13);
+ expected_qux.availability = Comparator(EQUAL, 0);
+ EXPECT_EQ(expected_qux, qux);
+}
+
+} // namespace feature_engagement_tracker