summaryrefslogtreecommitdiffstats
path: root/components/variations/variations_http_header_provider_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'components/variations/variations_http_header_provider_unittest.cc')
-rw-r--r--components/variations/variations_http_header_provider_unittest.cc126
1 files changed, 126 insertions, 0 deletions
diff --git a/components/variations/variations_http_header_provider_unittest.cc b/components/variations/variations_http_header_provider_unittest.cc
new file mode 100644
index 0000000..22d5173
--- /dev/null
+++ b/components/variations/variations_http_header_provider_unittest.cc
@@ -0,0 +1,126 @@
+// Copyright 2014 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/variations/variations_http_header_provider.h"
+
+#include <string>
+
+#include "base/base64.h"
+#include "base/message_loop/message_loop.h"
+#include "base/metrics/field_trial.h"
+#include "base/run_loop.h"
+#include "components/variations/entropy_provider.h"
+#include "components/variations/proto/client_variations.pb.h"
+#include "components/variations/variations_associated_data.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace variations {
+
+namespace {
+
+// Decodes the variations header and extracts the variation ids.
+bool ExtractVariationIds(const std::string& variations,
+ std::set<VariationID>* variation_ids,
+ std::set<VariationID>* trigger_ids) {
+ std::string serialized_proto;
+ if (!base::Base64Decode(variations, &serialized_proto))
+ return false;
+ ClientVariations proto;
+ if (!proto.ParseFromString(serialized_proto))
+ return false;
+ for (int i = 0; i < proto.variation_id_size(); ++i)
+ variation_ids->insert(proto.variation_id(i));
+ for (int i = 0; i < proto.trigger_variation_id_size(); ++i)
+ trigger_ids->insert(proto.trigger_variation_id(i));
+ return true;
+}
+
+scoped_refptr<base::FieldTrial> CreateTrialAndAssociateId(
+ const std::string& trial_name,
+ const std::string& default_group_name,
+ IDCollectionKey key,
+ VariationID id) {
+ scoped_refptr<base::FieldTrial> trial(
+ base::FieldTrialList::CreateFieldTrial(trial_name, default_group_name));
+
+ AssociateGoogleVariationID(key, trial->trial_name(), trial->group_name(), id);
+
+ return trial;
+}
+
+} // namespace
+
+class VariationsHttpHeaderProviderTest : public ::testing::Test {
+ public:
+ VariationsHttpHeaderProviderTest() {}
+
+ ~VariationsHttpHeaderProviderTest() override {}
+
+ void TearDown() override { testing::ClearAllVariationIDs(); }
+};
+
+TEST_F(VariationsHttpHeaderProviderTest, SetDefaultVariationIds_Valid) {
+ base::MessageLoop loop;
+ VariationsHttpHeaderProvider provider;
+
+ // Valid experiment ids.
+ EXPECT_TRUE(provider.SetDefaultVariationIds("12,456,t789"));
+ provider.InitVariationIDsCacheIfNeeded();
+ std::string variations = provider.GetClientDataHeader();
+ EXPECT_FALSE(variations.empty());
+ std::set<VariationID> variation_ids;
+ std::set<VariationID> trigger_ids;
+ ASSERT_TRUE(ExtractVariationIds(variations, &variation_ids, &trigger_ids));
+ EXPECT_TRUE(variation_ids.find(12) != variation_ids.end());
+ EXPECT_TRUE(variation_ids.find(456) != variation_ids.end());
+ EXPECT_TRUE(trigger_ids.find(789) != trigger_ids.end());
+ EXPECT_FALSE(variation_ids.find(789) != variation_ids.end());
+}
+
+TEST_F(VariationsHttpHeaderProviderTest, SetDefaultVariationIds_Invalid) {
+ base::MessageLoop loop;
+ VariationsHttpHeaderProvider provider;
+
+ // Invalid experiment ids.
+ EXPECT_FALSE(provider.SetDefaultVariationIds("abcd12,456"));
+ provider.InitVariationIDsCacheIfNeeded();
+ EXPECT_TRUE(provider.GetClientDataHeader().empty());
+
+ // Invalid trigger experiment id
+ EXPECT_FALSE(provider.SetDefaultVariationIds("12,tabc456"));
+ provider.InitVariationIDsCacheIfNeeded();
+ EXPECT_TRUE(provider.GetClientDataHeader().empty());
+}
+
+TEST_F(VariationsHttpHeaderProviderTest, OnFieldTrialGroupFinalized) {
+ base::MessageLoop loop;
+ base::FieldTrialList field_trial_list(nullptr);
+ VariationsHttpHeaderProvider provider;
+ provider.InitVariationIDsCacheIfNeeded();
+
+ const std::string default_name = "default";
+ scoped_refptr<base::FieldTrial> trial_1(CreateTrialAndAssociateId(
+ "t1", default_name, GOOGLE_WEB_PROPERTIES, 123));
+
+ ASSERT_EQ(default_name, trial_1->group_name());
+
+ scoped_refptr<base::FieldTrial> trial_2(CreateTrialAndAssociateId(
+ "t2", default_name, GOOGLE_WEB_PROPERTIES_TRIGGER, 456));
+
+ ASSERT_EQ(default_name, trial_2->group_name());
+
+ // Run the message loop to make sure OnFieldTrialGroupFinalized is called for
+ // the two field trials.
+ base::RunLoop().RunUntilIdle();
+
+ std::string variations = provider.GetClientDataHeader();
+
+ std::set<VariationID> variation_ids;
+ std::set<VariationID> trigger_ids;
+ ASSERT_TRUE(ExtractVariationIds(variations, &variation_ids, &trigger_ids));
+ EXPECT_TRUE(variation_ids.find(123) != variation_ids.end());
+ EXPECT_TRUE(trigger_ids.find(456) != trigger_ids.end());
+}
+
+} // namespace variations