blob: 90552c844765bc00a86e024df8b61a7213f242ac [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.
68 EXPECT_TRUE(provider.SetDefaultVariationIds("12,456,t789"));
69 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.
86 EXPECT_FALSE(provider.SetDefaultVariationIds("abcd12,456"));
87 provider.InitVariationIDsCacheIfNeeded();
88 EXPECT_TRUE(provider.GetClientDataHeader().empty());
89
90 // Invalid trigger experiment id
91 EXPECT_FALSE(provider.SetDefaultVariationIds("12,tabc456"));
92 provider.InitVariationIDsCacheIfNeeded();
93 EXPECT_TRUE(provider.GetClientDataHeader().empty());
94}
95
96TEST_F(VariationsHttpHeaderProviderTest, OnFieldTrialGroupFinalized) {
97 base::MessageLoop loop;
98 base::FieldTrialList field_trial_list(nullptr);
99 VariationsHttpHeaderProvider provider;
100 provider.InitVariationIDsCacheIfNeeded();
101
102 const std::string default_name = "default";
103 scoped_refptr<base::FieldTrial> trial_1(CreateTrialAndAssociateId(
104 "t1", default_name, GOOGLE_WEB_PROPERTIES, 123));
105
106 ASSERT_EQ(default_name, trial_1->group_name());
107
108 scoped_refptr<base::FieldTrial> trial_2(CreateTrialAndAssociateId(
109 "t2", default_name, GOOGLE_WEB_PROPERTIES_TRIGGER, 456));
110
111 ASSERT_EQ(default_name, trial_2->group_name());
112
113 // Run the message loop to make sure OnFieldTrialGroupFinalized is called for
114 // the two field trials.
115 base::RunLoop().RunUntilIdle();
116
117 std::string variations = provider.GetClientDataHeader();
118
119 std::set<VariationID> variation_ids;
120 std::set<VariationID> trigger_ids;
121 ASSERT_TRUE(ExtractVariationIds(variations, &variation_ids, &trigger_ids));
122 EXPECT_TRUE(variation_ids.find(123) != variation_ids.end());
123 EXPECT_TRUE(trigger_ids.find(456) != trigger_ids.end());
124}
125
asvitkine35ba6472015-12-18 23:52:33126TEST_F(VariationsHttpHeaderProviderTest, GetVariationsString) {
127 base::MessageLoop loop;
128 base::FieldTrialList field_trial_list(nullptr);
129
130 CreateTrialAndAssociateId("t1", "g1", GOOGLE_WEB_PROPERTIES, 123);
131 CreateTrialAndAssociateId("t2", "g2", GOOGLE_WEB_PROPERTIES, 124);
132
133 VariationsHttpHeaderProvider provider;
134 provider.SetDefaultVariationIds("100,200");
135 EXPECT_EQ(" 100 123 124 200 ", provider.GetVariationsString());
136}
137
asvitkine9a279832015-12-18 02:35:50138} // namespace variations