blob: a1b9d3da8fc1e10e46b8fc6cc5eafc1a83ad4226 [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"
10#include "base/message_loop/message_loop.h"
11#include "base/metrics/field_trial.h"
12#include "base/run_loop.h"
13#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
63TEST_F(VariationsHttpHeaderProviderTest, SetDefaultVariationIds_Valid) {
64 base::MessageLoop loop;
65 VariationsHttpHeaderProvider provider;
66
67 // Valid experiment ids.
jkrcalbf073372016-07-29 07:21:3168 EXPECT_TRUE(provider.SetDefaultVariationIds({"12", "456", "t789"}));
asvitkine9a279832015-12-18 02:35:5069 provider.InitVariationIDsCacheIfNeeded();
70 std::string variations = provider.GetClientDataHeader();
71 EXPECT_FALSE(variations.empty());
72 std::set<VariationID> variation_ids;
73 std::set<VariationID> trigger_ids;
74 ASSERT_TRUE(ExtractVariationIds(variations, &variation_ids, &trigger_ids));
75 EXPECT_TRUE(variation_ids.find(12) != variation_ids.end());
76 EXPECT_TRUE(variation_ids.find(456) != variation_ids.end());
77 EXPECT_TRUE(trigger_ids.find(789) != trigger_ids.end());
78 EXPECT_FALSE(variation_ids.find(789) != variation_ids.end());
79}
80
81TEST_F(VariationsHttpHeaderProviderTest, SetDefaultVariationIds_Invalid) {
82 base::MessageLoop loop;
83 VariationsHttpHeaderProvider provider;
84
85 // Invalid experiment ids.
jkrcalbf073372016-07-29 07:21:3186 EXPECT_FALSE(provider.SetDefaultVariationIds(
87 std::vector<std::string>{"abcd12", "456"}));
asvitkine9a279832015-12-18 02:35:5088 provider.InitVariationIDsCacheIfNeeded();
89 EXPECT_TRUE(provider.GetClientDataHeader().empty());
90
91 // Invalid trigger experiment id
jkrcalbf073372016-07-29 07:21:3192 EXPECT_FALSE(provider.SetDefaultVariationIds(
93 std::vector<std::string>{"12", "tabc456"}));
asvitkine9a279832015-12-18 02:35:5094 provider.InitVariationIDsCacheIfNeeded();
95 EXPECT_TRUE(provider.GetClientDataHeader().empty());
96}
97
98TEST_F(VariationsHttpHeaderProviderTest, OnFieldTrialGroupFinalized) {
99 base::MessageLoop loop;
100 base::FieldTrialList field_trial_list(nullptr);
101 VariationsHttpHeaderProvider provider;
102 provider.InitVariationIDsCacheIfNeeded();
103
104 const std::string default_name = "default";
105 scoped_refptr<base::FieldTrial> trial_1(CreateTrialAndAssociateId(
106 "t1", default_name, GOOGLE_WEB_PROPERTIES, 123));
107
108 ASSERT_EQ(default_name, trial_1->group_name());
109
110 scoped_refptr<base::FieldTrial> trial_2(CreateTrialAndAssociateId(
111 "t2", default_name, GOOGLE_WEB_PROPERTIES_TRIGGER, 456));
112
113 ASSERT_EQ(default_name, trial_2->group_name());
114
115 // Run the message loop to make sure OnFieldTrialGroupFinalized is called for
116 // the two field trials.
117 base::RunLoop().RunUntilIdle();
118
119 std::string variations = provider.GetClientDataHeader();
120
121 std::set<VariationID> variation_ids;
122 std::set<VariationID> trigger_ids;
123 ASSERT_TRUE(ExtractVariationIds(variations, &variation_ids, &trigger_ids));
124 EXPECT_TRUE(variation_ids.find(123) != variation_ids.end());
125 EXPECT_TRUE(trigger_ids.find(456) != trigger_ids.end());
126}
127
asvitkine35ba6472015-12-18 23:52:33128TEST_F(VariationsHttpHeaderProviderTest, GetVariationsString) {
129 base::MessageLoop loop;
130 base::FieldTrialList field_trial_list(nullptr);
131
132 CreateTrialAndAssociateId("t1", "g1", GOOGLE_WEB_PROPERTIES, 123);
133 CreateTrialAndAssociateId("t2", "g2", GOOGLE_WEB_PROPERTIES, 124);
134
135 VariationsHttpHeaderProvider provider;
jkrcalbf073372016-07-29 07:21:31136 std::vector<std::string> ids;
137 ids.push_back("100");
138 ids.push_back("200");
139 provider.SetDefaultVariationIds(ids);
asvitkine35ba6472015-12-18 23:52:33140 EXPECT_EQ(" 100 123 124 200 ", provider.GetVariationsString());
141}
142
asvitkine9a279832015-12-18 02:35:50143} // namespace variations