Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(589)

Side by Side Diff: chrome/browser/history/most_visited_tiles_experiment_unittest.cc

Issue 17114002: Field trial removing tiles from NTP if URL is already open - for 1993 clients (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Spacing fix Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2013 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 <algorithm>
6 #include <sstream>
7
8 #include "base/metrics/field_trial.h"
9 #include "base/metrics/histogram.h"
10 #include "base/metrics/statistics_recorder.h"
11 #include "base/strings/string_util.h"
12 #include "base/values.h"
13 #include "chrome/browser/history/history_types.h"
14 #include "chrome/browser/history/most_visited_tiles_experiment.h"
15 #include "chrome/common/instant_types.h"
16 #include "chrome/common/metrics/entropy_provider.h"
17 #include "testing/gtest/include/gtest/gtest.h"
18 #include "url/gurl.h"
19
20 namespace history {
21
22 namespace {
23
24 // Constants for the most visited tile placement field trial.
25 // See field trial config (MostVisitedTilePlacement.json) for details.
26 const char kMostVisitedFieldTrialName[] = "MostVisitedTilePlacement";
27 const char kOneEightAGroupName[] = "OneEight_A_Flipped";
28 const char kOneFourAGroupName[] = "OneFour_A_Flipped";
29 const char kDontShowOpenURLsGroupName[] = "DontShowOpenTabs";
30 const char kGmailURL[] = "http://www.gmail.com/";
31
32 // The indices of the tiles that are affected in the experiment.
33 enum FlippedIndexes {
34 TILE_ONE = 0,
35 TILE_FOUR = 3,
36 TILE_EIGHT = 7
37 };
38
39 // Creates a test url string: "http://www.test" + |num| + ".com".
40 static void MakeTestURLString(const int& num, std::string* url) {
41 std::stringstream out;
42 url->append("http://www.test");
43 out << num;
44 url->append(out.str());
45 url->append(".com");
46 }
47
48 // Creates a DictionaryValue using |url| and appends to |list|.
49 static void AppendURLToListValue(const std::string& url_string,
50 base::ListValue* list) {
51 DictionaryValue* page_value = new DictionaryValue();
52 page_value->SetString("url", url_string);
53 list->Append(page_value);
54 }
55
56 // Creates an InstantMostVisitedItem using |url| and appends to |list|.
57 static void AppendInstantURLToVector(
58 const std::string& url_string,
59 std::vector<InstantMostVisitedItem>* list) {
60 InstantMostVisitedItem item;
61 item.url = GURL(url_string);
62 list->push_back(item);
63 }
64
65 // Creates an MostVisitedURL using |url| and appends to |list|.
66 static void AppendMostVisitedURLToVector(
67 const std::string& url_string,
68 std::vector<history::MostVisitedURL>* list) {
69 history::MostVisitedURL most_visited;
70 most_visited.url = GURL(url_string);
71 list->push_back(most_visited);
72 }
73
74 void SetUpMaybeShuffle(const int& max_urls,
75 MostVisitedURLList* most_visited_urls,
76 MostVisitedURLList* test_urls) {
77 // |most_visited_urls| must have > 8 MostVisitedURLs for any URLs to be
78 // flipped by experiment.
79 for (int i = 0; i < max_urls; ++i) {
80 std::string url;
81 MakeTestURLString(i, &url);
82 AppendMostVisitedURLToVector(url, most_visited_urls);
83 AppendMostVisitedURLToVector(url, test_urls);
84 }
85 }
86
87 } // namespace
88
89 class MostVisitedTilesExperimentTest : public testing::Test {
90 public:
91 MostVisitedTilesExperimentTest() : histogram_(NULL) {
92 }
93
94 ~MostVisitedTilesExperimentTest() {}
95
96 protected:
97 virtual void SetUp() {
98 field_trial_list_.reset(new base::FieldTrialList(
99 new metrics::SHA1EntropyProvider("foo")));
100 base::StatisticsRecorder::Initialize();
101 previous_metrics_count_.resize(NUM_NTP_TILE_EXPERIMENT_ACTIONS, 0);
102 base::HistogramBase* histogram = GetHistogram();
103 if (histogram) {
104 scoped_ptr<base::HistogramSamples> samples(histogram->SnapshotSamples());
105 if (samples.get()) {
106 for (int state = NTP_TILE_EXPERIMENT_ACTION_REMOVED_URL;
107 state < NUM_NTP_TILE_EXPERIMENT_ACTIONS;
108 ++state) {
109 previous_metrics_count_[state] = samples->GetCount(state);
110 }
111 }
112 }
113 }
114
115 void ValidateMetrics(const base::HistogramBase::Sample& value) {
116 base::HistogramBase* histogram = GetHistogram();
117 if (histogram) {
118 scoped_ptr<base::HistogramSamples> samples(histogram->SnapshotSamples());
119 if (samples.get()) {
120 for (int state = NTP_TILE_EXPERIMENT_ACTION_REMOVED_URL;
121 state < NUM_NTP_TILE_EXPERIMENT_ACTIONS;
122 ++state) {
123 if (state == value) {
124 EXPECT_EQ(previous_metrics_count_[state] + 1,
125 samples->GetCount(state));
126 } else {
127 EXPECT_EQ(previous_metrics_count_[state], samples->GetCount(state));
128 }
129 }
130 }
131 }
132 }
133
134 private:
135 base::HistogramBase* GetHistogram() {
136 if (!histogram_) {
137 histogram_ = base::StatisticsRecorder::FindHistogram(
138 MostVisitedTilesExperiment::kMostVisitedExperimentHistogramName);
139 }
140 return histogram_;
141 }
142
143 base::HistogramBase* histogram_;
144 scoped_ptr<base::FieldTrialList> field_trial_list_;
145 std::vector<int> previous_metrics_count_;
146
147 DISALLOW_COPY_AND_ASSIGN(MostVisitedTilesExperimentTest);
148 };
149
150 // For pre-instant extended clients.
151 TEST_F(MostVisitedTilesExperimentTest,
152 RemovePageValuesMatchingOpenTabsTooFewURLs) {
153 base::FieldTrialList::CreateFieldTrial(kMostVisitedFieldTrialName,
154 kDontShowOpenURLsGroupName);
155
156 // Ensure the field trial is created with the correct group.
157 EXPECT_TRUE(MostVisitedTilesExperiment::IsDontShowOpenURLsEnabled());
158
159 std::set<std::string> open_urls;
160 open_urls.insert(kGmailURL);
161
162 scoped_ptr<base::ListValue> pages_value(new ListValue());
163 AppendURLToListValue(kGmailURL, pages_value.get());
164
165 // Test the method when there are not enough URLs to force removal.
166 MostVisitedTilesExperiment::RemovePageValuesMatchingOpenTabs(
167 open_urls, pages_value.get());
168 DictionaryValue gmail_value;
169 gmail_value.SetString("url", kGmailURL);
170 // Ensure the open url has not been removed from |pages_value|.
171 EXPECT_NE(pages_value.get()->end(), pages_value.get()->Find(gmail_value));
172
173 // Ensure counts have been incremented correctly.
174 ValidateMetrics(NTP_TILE_EXPERIMENT_ACTION_DID_NOT_REMOVE_URL);
175 }
176
177 // For pre-instant extended clients.
178 TEST_F(MostVisitedTilesExperimentTest, RemovePageValuesMatchingOpenTabs) {
179 base::FieldTrialList::CreateFieldTrial(kMostVisitedFieldTrialName,
180 kDontShowOpenURLsGroupName);
181
182 // Ensure the field trial is created with the correct group.
183 EXPECT_TRUE(MostVisitedTilesExperiment::IsDontShowOpenURLsEnabled());
184
185 std::set<std::string> open_urls;
186 open_urls.insert(kGmailURL);
187
188 scoped_ptr<base::ListValue> pages_value(new ListValue());
189 AppendURLToListValue(kGmailURL, pages_value.get());
190
191 // |pages_value| must have > 8 page values for any URLs to be removed by
192 // experiment.
193 for (size_t i = 0; i < MostVisitedTilesExperiment::kMinUrlSuggestions; ++i) {
194 std::string url;
195 MakeTestURLString(i, &url);
196 AppendURLToListValue(url, pages_value.get());
197 }
198
199 // Call method with enough URLs to force removal.
200 MostVisitedTilesExperiment::RemovePageValuesMatchingOpenTabs(
201 open_urls, pages_value.get());
202 // Ensure the open url has been removed from |pages_value|.
203 DictionaryValue gmail_value;
204 gmail_value.SetString("url", kGmailURL);
205 EXPECT_EQ(pages_value.get()->end(), pages_value.get()->Find(gmail_value));
206
207 // Ensure counts have been incremented correctly.
208 ValidateMetrics(NTP_TILE_EXPERIMENT_ACTION_REMOVED_URL);
209 }
210
211 // For instant extended clients.
212 TEST_F(MostVisitedTilesExperimentTest, RemoveItemsMatchingOpenTabsTooFewURLs) {
213 base::FieldTrialList::CreateFieldTrial(kMostVisitedFieldTrialName,
214 kDontShowOpenURLsGroupName);
215
216 // Ensure the field trial is created with the correct group.
217 EXPECT_TRUE(MostVisitedTilesExperiment::IsDontShowOpenURLsEnabled());
218
219 std::set<std::string> open_urls;
220 open_urls.insert(kGmailURL);
221 std::vector<InstantMostVisitedItem> items;
222 AppendInstantURLToVector(kGmailURL, &items);
223
224 // Call the method when there are not enough URLs to force removal.
225 MostVisitedTilesExperiment::RemoveItemsMatchingOpenTabs(open_urls, &items);
226
227 // Ensure the open url has not been removed from |items|.
228 for (size_t i = 0; i < items.size(); i++) {
229 const std::string& item_url = items[i].url.spec();
230 EXPECT_NE(0u, open_urls.count(item_url));
231 }
232
233 // Ensure counts have been incremented correctly.
234 ValidateMetrics(NTP_TILE_EXPERIMENT_ACTION_DID_NOT_REMOVE_URL);
235 }
236
237 // For instant extended clients.
238 TEST_F(MostVisitedTilesExperimentTest, RemoveItemsMatchingOpenTabs) {
239 base::FieldTrialList::CreateFieldTrial(
240 kMostVisitedFieldTrialName,
241 kDontShowOpenURLsGroupName);
242
243 // Ensure the field trial is created with the correct group.
244 EXPECT_TRUE(MostVisitedTilesExperiment::IsDontShowOpenURLsEnabled());
245
246 std::set<std::string> open_urls;
247 open_urls.insert(kGmailURL);
248 std::vector<InstantMostVisitedItem> items;
249 AppendInstantURLToVector(kGmailURL, &items);
250
251 // |items| must have > 8 InstantMostVisitedItems for any URLs to be removed by
252 // experiment.
253 for (size_t i = 0; i < MostVisitedTilesExperiment::kMinUrlSuggestions; ++i) {
254 std::string url;
255 MakeTestURLString(i, &url);
256 AppendInstantURLToVector(url, &items);
257 }
258
259 // Call method with enough URLs to force removal.
260 MostVisitedTilesExperiment::RemoveItemsMatchingOpenTabs(open_urls, &items);
261
262 // Ensure the open URL has been removed from |items|.
263 for (size_t i = 0; i < items.size(); i++) {
264 const std::string& item_url = items[i].url.spec();
265 EXPECT_EQ(0u, open_urls.count(item_url));
266 }
267
268 // Ensure counts have been incremented correctly.
269 ValidateMetrics(NTP_TILE_EXPERIMENT_ACTION_REMOVED_URL);
270 }
271
272 TEST_F(MostVisitedTilesExperimentTest, MaybeShuffleOneEight) {
273 base::FieldTrialList::CreateFieldTrial(kMostVisitedFieldTrialName,
274 kOneEightAGroupName);
275
276 // Ensure the field trial is created with the correct group.
277 EXPECT_EQ(kOneEightAGroupName,
278 base::FieldTrialList::FindFullName(kMostVisitedFieldTrialName));
279
280 MostVisitedURLList most_visited_urls;
281 MostVisitedURLList test_urls;
282 SetUpMaybeShuffle(MostVisitedTilesExperiment::kMinUrlSuggestions,
283 &most_visited_urls,
284 &test_urls);
285
286 history::MostVisitedTilesExperiment::MaybeShuffle(&most_visited_urls);
287 // Ensure the 1st and 8th URLs have been switched.
288 EXPECT_EQ(most_visited_urls[TILE_ONE].url.spec(),
289 test_urls[TILE_EIGHT].url.spec());
290
291 // Ensure counts are correct.
292 ValidateMetrics(NUM_NTP_TILE_EXPERIMENT_ACTIONS);
293 }
294
295 TEST_F(MostVisitedTilesExperimentTest, MaybeShuffleOneEightTooFewURLs) {
296 base::FieldTrialList::CreateFieldTrial(kMostVisitedFieldTrialName,
297 kOneEightAGroupName);
298
299 // Ensure the field trial is created with the correct group.
300 EXPECT_EQ(kOneEightAGroupName,
301 base::FieldTrialList::FindFullName(kMostVisitedFieldTrialName));
302
303 MostVisitedURLList most_visited_urls;
304 MostVisitedURLList test_urls;
305 // If |most_visited_urls| has < 8 URLs, experiment will not flip any tiles.
306 SetUpMaybeShuffle(MostVisitedTilesExperiment::kMinUrlSuggestions - 1,
307 &most_visited_urls,
308 &test_urls);
309
310 history::MostVisitedTilesExperiment::MaybeShuffle(&most_visited_urls);
311 // Ensure no URLs have been switched.
312 EXPECT_EQ(most_visited_urls[TILE_ONE].url.spec(),
313 test_urls[TILE_ONE].url.spec());
314 EXPECT_EQ(most_visited_urls[TILE_EIGHT - 1].url.spec(),
315 test_urls[TILE_EIGHT - 1].url.spec());
316
317 // Ensure counts are correct.
318 ValidateMetrics(NTP_TILE_EXPERIMENT_ACTION_TOO_FEW_URLS_TILES_1_8);
319 }
320
321 TEST_F(MostVisitedTilesExperimentTest, MaybeShuffleOneFour) {
322 base::FieldTrialList::CreateFieldTrial(kMostVisitedFieldTrialName,
323 kOneFourAGroupName);
324
325 // Ensure the field trial is created with the correct group.
326 EXPECT_EQ(kOneFourAGroupName,
327 base::FieldTrialList::FindFullName(kMostVisitedFieldTrialName));
328
329 MostVisitedURLList most_visited_urls;
330 MostVisitedURLList test_urls;
331 SetUpMaybeShuffle(MostVisitedTilesExperiment::kMinUrlSuggestions,
332 &most_visited_urls,
333 &test_urls);
334
335 history::MostVisitedTilesExperiment::MaybeShuffle(&most_visited_urls);
336 // Ensure the 1st and 4th URLs have been switched.
337 EXPECT_EQ(most_visited_urls[TILE_ONE].url.spec(),
338 test_urls[TILE_FOUR].url.spec());
339
340 // Ensure counts are correct.
341 ValidateMetrics(NUM_NTP_TILE_EXPERIMENT_ACTIONS);
342 }
343
344 TEST_F(MostVisitedTilesExperimentTest, MaybeShuffleOneFourTooFewURLs) {
345 base::FieldTrialList::CreateFieldTrial(
346 kMostVisitedFieldTrialName,
347 kOneFourAGroupName);
348
349 // Ensure the field trial is created with the correct group.
350 EXPECT_EQ(kOneFourAGroupName,
351 base::FieldTrialList::FindFullName(kMostVisitedFieldTrialName));
352
353 MostVisitedURLList most_visited_urls;
354 MostVisitedURLList test_urls;
355 // If |most_visited_urls| has < 4 URLs, experiment will not flip any tiles.
356 SetUpMaybeShuffle(MostVisitedTilesExperiment::kMinUrlSuggestions - 5,
357 &most_visited_urls,
358 &test_urls);
359
360 history::MostVisitedTilesExperiment::MaybeShuffle(&most_visited_urls);
361 // Ensure no URLs have been switched.
362 EXPECT_EQ(most_visited_urls[TILE_ONE].url.spec(),
363 test_urls[TILE_ONE].url.spec());
364 EXPECT_EQ(most_visited_urls[TILE_FOUR-1].url.spec(),
365 test_urls[TILE_FOUR-1].url.spec());
366
367 // Ensure counts are correct.
368 ValidateMetrics(NTP_TILE_EXPERIMENT_ACTION_TOO_FEW_URLS_TILES_1_4);
369 }
370
371 } // namespace history
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698