blob: 70d1cbe8f4bfbbafb7c618f6115c097c1a86f590 [file] [log] [blame]
asvitkine9a279832015-12-18 02:35:501// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "components/variations/variations_http_header_provider.h"
6
7#include <string>
8
9#include "base/base64.h"
asvitkine9a279832015-12-18 02:35:5010#include "base/metrics/field_trial.h"
11#include "base/run_loop.h"
Carlos Caballero954ca162018-11-12 10:47:0912#include "base/test/scoped_task_environment.h"
asvitkine9a279832015-12-18 02:35:5013#include "components/variations/entropy_provider.h"
14#include "components/variations/proto/client_variations.pb.h"
15#include "components/variations/variations_associated_data.h"
16#include "testing/gtest/include/gtest/gtest.h"
17
18namespace variations {
19
20namespace {
21
22// Decodes the variations header and extracts the variation ids.
23bool ExtractVariationIds(const std::string& variations,
24 std::set<VariationID>* variation_ids,
25 std::set<VariationID>* trigger_ids) {
26 std::string serialized_proto;
27 if (!base::Base64Decode(variations, &serialized_proto))
28 return false;
29 ClientVariations proto;
30 if (!proto.ParseFromString(serialized_proto))
31 return false;
32 for (int i = 0; i < proto.variation_id_size(); ++i)
33 variation_ids->insert(proto.variation_id(i));
34 for (int i = 0; i < proto.trigger_variation_id_size(); ++i)
35 trigger_ids->insert(proto.trigger_variation_id(i));
36 return true;
37}
38
39scoped_refptr<base::FieldTrial> CreateTrialAndAssociateId(
40 const std::string& trial_name,
41 const std::string& default_group_name,
42 IDCollectionKey key,
43 VariationID id) {
44 scoped_refptr<base::FieldTrial> trial(
45 base::FieldTrialList::CreateFieldTrial(trial_name, default_group_name));
46
47 AssociateGoogleVariationID(key, trial->trial_name(), trial->group_name(), id);
48
49 return trial;
50}
51
52} // namespace
53
54class VariationsHttpHeaderProviderTest : public ::testing::Test {
55 public:
56 VariationsHttpHeaderProviderTest() {}
57
58 ~VariationsHttpHeaderProviderTest() override {}
59
60 void TearDown() override { testing::ClearAllVariationIDs(); }
61};
62
Alexei Svitkine105f942e2018-02-17 02:53:4863TEST_F(VariationsHttpHeaderProviderTest, ForceVariationIds_Valid) {
Carlos Caballero954ca162018-11-12 10:47:0964 base::test::ScopedTaskEnvironment task_environment;
asvitkine9a279832015-12-18 02:35:5065 VariationsHttpHeaderProvider provider;
66
67 // Valid experiment ids.
Alexei Svitkine105f942e2018-02-17 02:53:4868 EXPECT_EQ(VariationsHttpHeaderProvider::ForceIdsResult::SUCCESS,
69 provider.ForceVariationIds({"12", "456", "t789"}, ""));
asvitkine9a279832015-12-18 02:35:5070 provider.InitVariationIDsCacheIfNeeded();
yutak3305f49d2016-12-13 10:32:3171 std::string variations = provider.GetClientDataHeader(false);
asvitkine9a279832015-12-18 02:35:5072 EXPECT_FALSE(variations.empty());
73 std::set<VariationID> variation_ids;
74 std::set<VariationID> trigger_ids;
75 ASSERT_TRUE(ExtractVariationIds(variations, &variation_ids, &trigger_ids));
76 EXPECT_TRUE(variation_ids.find(12) != variation_ids.end());
77 EXPECT_TRUE(variation_ids.find(456) != variation_ids.end());
78 EXPECT_TRUE(trigger_ids.find(789) != trigger_ids.end());
79 EXPECT_FALSE(variation_ids.find(789) != variation_ids.end());
80}
81
Alexei Svitkine105f942e2018-02-17 02:53:4882TEST_F(VariationsHttpHeaderProviderTest, ForceVariationIds_ValidCommandLine) {
Carlos Caballero954ca162018-11-12 10:47:0983 base::test::ScopedTaskEnvironment task_environment;
Alexei Svitkine105f942e2018-02-17 02:53:4884 VariationsHttpHeaderProvider provider;
85
86 // Valid experiment ids.
87 EXPECT_EQ(VariationsHttpHeaderProvider::ForceIdsResult::SUCCESS,
88 provider.ForceVariationIds({"12"}, "456,t789"));
89 provider.InitVariationIDsCacheIfNeeded();
90 std::string variations = provider.GetClientDataHeader(false);
91 EXPECT_FALSE(variations.empty());
92 std::set<VariationID> variation_ids;
93 std::set<VariationID> trigger_ids;
94 ASSERT_TRUE(ExtractVariationIds(variations, &variation_ids, &trigger_ids));
95 EXPECT_TRUE(variation_ids.find(12) != variation_ids.end());
96 EXPECT_TRUE(variation_ids.find(456) != variation_ids.end());
97 EXPECT_TRUE(trigger_ids.find(789) != trigger_ids.end());
98 EXPECT_FALSE(variation_ids.find(789) != variation_ids.end());
99}
100
101TEST_F(VariationsHttpHeaderProviderTest, ForceVariationIds_Invalid) {
Carlos Caballero954ca162018-11-12 10:47:09102 base::test::ScopedTaskEnvironment task_environment;
asvitkine9a279832015-12-18 02:35:50103 VariationsHttpHeaderProvider provider;
104
105 // Invalid experiment ids.
Alexei Svitkine105f942e2018-02-17 02:53:48106 EXPECT_EQ(VariationsHttpHeaderProvider::ForceIdsResult::INVALID_VECTOR_ENTRY,
107 provider.ForceVariationIds({"abcd12", "456"}, ""));
asvitkine9a279832015-12-18 02:35:50108 provider.InitVariationIDsCacheIfNeeded();
yutak3305f49d2016-12-13 10:32:31109 EXPECT_TRUE(provider.GetClientDataHeader(false).empty());
asvitkine9a279832015-12-18 02:35:50110
111 // Invalid trigger experiment id
Alexei Svitkine105f942e2018-02-17 02:53:48112 EXPECT_EQ(VariationsHttpHeaderProvider::ForceIdsResult::INVALID_VECTOR_ENTRY,
113 provider.ForceVariationIds({"12", "tabc456"}, ""));
114 provider.InitVariationIDsCacheIfNeeded();
115 EXPECT_TRUE(provider.GetClientDataHeader(false).empty());
116
117 // Invalid command-line ids.
118 EXPECT_EQ(VariationsHttpHeaderProvider::ForceIdsResult::INVALID_SWITCH_ENTRY,
119 provider.ForceVariationIds({"12", "50"}, "tabc456"));
asvitkine9a279832015-12-18 02:35:50120 provider.InitVariationIDsCacheIfNeeded();
yutak3305f49d2016-12-13 10:32:31121 EXPECT_TRUE(provider.GetClientDataHeader(false).empty());
asvitkine9a279832015-12-18 02:35:50122}
123
124TEST_F(VariationsHttpHeaderProviderTest, OnFieldTrialGroupFinalized) {
Carlos Caballero954ca162018-11-12 10:47:09125 base::test::ScopedTaskEnvironment task_environment;
asvitkine9a279832015-12-18 02:35:50126 base::FieldTrialList field_trial_list(nullptr);
127 VariationsHttpHeaderProvider provider;
128 provider.InitVariationIDsCacheIfNeeded();
129
130 const std::string default_name = "default";
131 scoped_refptr<base::FieldTrial> trial_1(CreateTrialAndAssociateId(
132 "t1", default_name, GOOGLE_WEB_PROPERTIES, 123));
asvitkine9a279832015-12-18 02:35:50133 ASSERT_EQ(default_name, trial_1->group_name());
134
135 scoped_refptr<base::FieldTrial> trial_2(CreateTrialAndAssociateId(
136 "t2", default_name, GOOGLE_WEB_PROPERTIES_TRIGGER, 456));
yutake48e1082016-12-13 06:08:30137 ASSERT_EQ(default_name, trial_2->group_name());
asvitkine9ed7b562016-12-12 23:41:43138
yutak3305f49d2016-12-13 10:32:31139 scoped_refptr<base::FieldTrial> trial_3(CreateTrialAndAssociateId(
140 "t3", default_name, GOOGLE_WEB_PROPERTIES_SIGNED_IN, 789));
141 ASSERT_EQ(default_name, trial_3->group_name());
142
asvitkine9a279832015-12-18 02:35:50143 // Run the message loop to make sure OnFieldTrialGroupFinalized is called for
144 // the two field trials.
145 base::RunLoop().RunUntilIdle();
146
yutak3305f49d2016-12-13 10:32:31147 // Get non-signed in ids.
148 {
149 std::string variations = provider.GetClientDataHeader(false);
150 std::set<VariationID> variation_ids;
151 std::set<VariationID> trigger_ids;
152 ASSERT_TRUE(ExtractVariationIds(variations, &variation_ids, &trigger_ids));
153 EXPECT_EQ(1U, variation_ids.size());
154 EXPECT_TRUE(variation_ids.find(123) != variation_ids.end());
155 EXPECT_EQ(1U, trigger_ids.size());
156 EXPECT_TRUE(trigger_ids.find(456) != trigger_ids.end());
157 }
asvitkine9a279832015-12-18 02:35:50158
yutak3305f49d2016-12-13 10:32:31159 // Now, get signed-in ids.
160 {
161 std::string variations = provider.GetClientDataHeader(true);
162 std::set<VariationID> variation_ids;
163 std::set<VariationID> trigger_ids;
164 ASSERT_TRUE(ExtractVariationIds(variations, &variation_ids, &trigger_ids));
165 EXPECT_EQ(2U, variation_ids.size());
166 EXPECT_TRUE(variation_ids.find(123) != variation_ids.end());
167 EXPECT_TRUE(variation_ids.find(789) != variation_ids.end());
168 EXPECT_EQ(1U, trigger_ids.size());
169 EXPECT_TRUE(trigger_ids.find(456) != trigger_ids.end());
170 }
asvitkine9a279832015-12-18 02:35:50171}
172
asvitkine35ba6472015-12-18 23:52:33173TEST_F(VariationsHttpHeaderProviderTest, GetVariationsString) {
Carlos Caballero954ca162018-11-12 10:47:09174 base::test::ScopedTaskEnvironment task_environment;
asvitkine35ba6472015-12-18 23:52:33175 base::FieldTrialList field_trial_list(nullptr);
176
177 CreateTrialAndAssociateId("t1", "g1", GOOGLE_WEB_PROPERTIES, 123);
178 CreateTrialAndAssociateId("t2", "g2", GOOGLE_WEB_PROPERTIES, 124);
yutak3305f49d2016-12-13 10:32:31179 // SIGNED_IN ids shouldn't be included.
180 CreateTrialAndAssociateId("t3", "g3", GOOGLE_WEB_PROPERTIES_SIGNED_IN, 125);
asvitkine35ba6472015-12-18 23:52:33181
182 VariationsHttpHeaderProvider provider;
Alexei Svitkine105f942e2018-02-17 02:53:48183 provider.ForceVariationIds({"100", "200"}, "");
asvitkine35ba6472015-12-18 23:52:33184 EXPECT_EQ(" 100 123 124 200 ", provider.GetVariationsString());
185}
186
asvitkine9a279832015-12-18 02:35:50187} // namespace variations