1// 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 "base/memory/scoped_vector.h"
6#include "base/strings/string_util.h"
7#include "base/strings/utf_string_conversions.h"
8#include "components/search_engines/search_terms_data.h"
9#include "components/search_engines/template_url.h"
10#include "components/search_engines/template_url_service.h"
11#include "components/search_engines/util.h"
12#include "testing/gtest/include/gtest/gtest.h"
13
14namespace {
15
16scoped_ptr<TemplateURLData> CreatePrepopulateTemplateURLData(
17    int prepopulate_id,
18    const std::string& keyword,
19    TemplateURLID id) {
20  scoped_ptr<TemplateURLData> data(new TemplateURLData);
21  data->prepopulate_id = prepopulate_id;
22  data->SetKeyword(base::ASCIIToUTF16(keyword));
23  data->id = id;
24  return data.Pass();
25}
26
27// Creates a TemplateURL with default values except for the prepopulate ID,
28// keyword and TemplateURLID. Only use this in tests if your tests do not
29// care about other fields.
30scoped_ptr<TemplateURL> CreatePrepopulateTemplateURL(int prepopulate_id,
31                                                     const std::string& keyword,
32                                                     TemplateURLID id) {
33  return make_scoped_ptr(new TemplateURL(
34      *CreatePrepopulateTemplateURLData(prepopulate_id, keyword, id)));
35}
36
37};  // namespace
38
39TEST(TemplateURLServiceUtilTest, RemoveDuplicatePrepopulateIDs) {
40  ScopedVector<TemplateURLData> prepopulated_turls;
41  TemplateURLService::TemplateURLVector local_turls;
42  STLElementDeleter<TemplateURLService::TemplateURLVector> local_turls_deleter(
43      &local_turls);
44
45  prepopulated_turls.push_back(
46      CreatePrepopulateTemplateURLData(1, "winner4", 1).release());
47  prepopulated_turls.push_back(
48      CreatePrepopulateTemplateURLData(2, "xxx", 2).release());
49  prepopulated_turls.push_back(
50      CreatePrepopulateTemplateURLData(3, "yyy", 3).release());
51
52  // Create a sets of different TURLs grouped by prepopulate ID. Each group
53  // will test a different heuristic of RemoveDuplicatePrepopulateIDs.
54  // Ignored set - These should be left alone as they do not have valid
55  // prepopulate IDs.
56  local_turls.push_back(
57      CreatePrepopulateTemplateURL(0, "winner1", 4).release());
58  local_turls.push_back(
59      CreatePrepopulateTemplateURL(0, "winner2", 5).release());
60  local_turls.push_back(
61      CreatePrepopulateTemplateURL(0, "winner3", 6).release());
62  size_t num_non_prepopulated_urls = local_turls.size();
63
64  // Keyword match set - Prefer the one that matches the keyword of the
65  // prepopulate ID.
66  local_turls.push_back(CreatePrepopulateTemplateURL(1, "loser1", 7).release());
67  local_turls.push_back(CreatePrepopulateTemplateURL(1, "loser2", 8).release());
68  local_turls.push_back(
69      CreatePrepopulateTemplateURL(1, "winner4", 9).release());
70
71  // Default set - Prefer the default search engine over all other criteria.
72  // The last one is the default. It will be passed as the
73  // default_search_provider parameter to RemoveDuplicatePrepopulateIDs.
74  local_turls.push_back(
75      CreatePrepopulateTemplateURL(2, "loser3", 10).release());
76  local_turls.push_back(CreatePrepopulateTemplateURL(2, "xxx", 11).release());
77  TemplateURL* default_turl =
78      CreatePrepopulateTemplateURL(2, "winner5", 12).release();
79  local_turls.push_back(default_turl);
80
81  // ID set - Prefer the lowest TemplateURLID if the keywords don't match and if
82  // none are the default.
83  local_turls.push_back(
84      CreatePrepopulateTemplateURL(3, "winner6", 13).release());
85  local_turls.push_back(
86      CreatePrepopulateTemplateURL(3, "loser5", 14).release());
87  local_turls.push_back(
88      CreatePrepopulateTemplateURL(3, "loser6", 15).release());
89
90  RemoveDuplicatePrepopulateIDs(NULL, prepopulated_turls, default_turl,
91                                &local_turls, SearchTermsData(), NULL);
92
93  // Verify that the expected local TURLs survived the process.
94  EXPECT_EQ(local_turls.size(),
95            prepopulated_turls.size() + num_non_prepopulated_urls);
96  for (TemplateURLService::TemplateURLVector::const_iterator itr =
97       local_turls.begin(); itr != local_turls.end(); ++itr) {
98    EXPECT_TRUE(
99        StartsWith((*itr)->keyword(), base::ASCIIToUTF16("winner"), true));
100  }
101}
102