template_url_prepopulate_data_unittest.cc revision 21d179b334e59e9a3bfcaed4c4430bef1bc5759d
1// Copyright (c) 2010 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/file_util.h"
6#include "base/scoped_temp_dir.h"
7#include "base/scoped_vector.h"
8#include "chrome/browser/search_engines/search_engine_type.h"
9#include "chrome/browser/search_engines/search_terms_data.h"
10#include "chrome/browser/search_engines/template_url.h"
11#include "chrome/browser/search_engines/template_url_prepopulate_data.h"
12#include "chrome/browser/search_engines/template_url_model.h"
13#include "chrome/common/pref_names.h"
14#include "chrome/test/testing_pref_service.h"
15#include "chrome/test/testing_profile.h"
16#include "grit/theme_resources.h"
17#include "testing/gtest/include/gtest/gtest.h"
18
19typedef testing::Test TemplateURLPrepopulateDataTest;
20
21const int kCountryIds[] = {
22    'A'<<8|'D', 'A'<<8|'E', 'A'<<8|'F', 'A'<<8|'G', 'A'<<8|'I',
23    'A'<<8|'L', 'A'<<8|'M', 'A'<<8|'N', 'A'<<8|'O', 'A'<<8|'Q',
24    'A'<<8|'R', 'A'<<8|'S', 'A'<<8|'T', 'A'<<8|'U', 'A'<<8|'W',
25    'A'<<8|'X', 'A'<<8|'Z', 'B'<<8|'A', 'B'<<8|'B', 'B'<<8|'D',
26    'B'<<8|'E', 'B'<<8|'F', 'B'<<8|'G', 'B'<<8|'H', 'B'<<8|'I',
27    'B'<<8|'J', 'B'<<8|'M', 'B'<<8|'N', 'B'<<8|'O', 'B'<<8|'R',
28    'B'<<8|'S', 'B'<<8|'T', 'B'<<8|'V', 'B'<<8|'W', 'B'<<8|'Y',
29    'B'<<8|'Z', 'C'<<8|'A', 'C'<<8|'C', 'C'<<8|'D', 'C'<<8|'F',
30    'C'<<8|'G', 'C'<<8|'H', 'C'<<8|'I', 'C'<<8|'K', 'C'<<8|'L',
31    'C'<<8|'M', 'C'<<8|'N', 'C'<<8|'O', 'C'<<8|'R', 'C'<<8|'U',
32    'C'<<8|'V', 'C'<<8|'X', 'C'<<8|'Y', 'C'<<8|'Z', 'D'<<8|'E',
33    'D'<<8|'J', 'D'<<8|'K', 'D'<<8|'M', 'D'<<8|'O', 'D'<<8|'Z',
34    'E'<<8|'C', 'E'<<8|'E', 'E'<<8|'G', 'E'<<8|'R', 'E'<<8|'S',
35    'E'<<8|'T', 'F'<<8|'I', 'F'<<8|'J', 'F'<<8|'K', 'F'<<8|'M',
36    'F'<<8|'O', 'F'<<8|'R', 'G'<<8|'A', 'G'<<8|'B', 'G'<<8|'D',
37    'G'<<8|'E', 'G'<<8|'F', 'G'<<8|'G', 'G'<<8|'H', 'G'<<8|'I',
38    'G'<<8|'L', 'G'<<8|'M', 'G'<<8|'N', 'G'<<8|'P', 'G'<<8|'Q',
39    'G'<<8|'R', 'G'<<8|'S', 'G'<<8|'T', 'G'<<8|'U', 'G'<<8|'W',
40    'G'<<8|'Y', 'H'<<8|'K', 'H'<<8|'M', 'H'<<8|'N', 'H'<<8|'R',
41    'H'<<8|'T', 'H'<<8|'U', 'I'<<8|'D', 'I'<<8|'E', 'I'<<8|'L',
42    'I'<<8|'M', 'I'<<8|'N', 'I'<<8|'O', 'I'<<8|'P', 'I'<<8|'Q',
43    'I'<<8|'R', 'I'<<8|'S', 'I'<<8|'T', 'J'<<8|'E', 'J'<<8|'M',
44    'J'<<8|'O', 'J'<<8|'P', 'K'<<8|'E', 'K'<<8|'G', 'K'<<8|'H',
45    'K'<<8|'I', 'K'<<8|'M', 'K'<<8|'N', 'K'<<8|'P', 'K'<<8|'R',
46    'K'<<8|'W', 'K'<<8|'Y', 'K'<<8|'Z', 'L'<<8|'A', 'L'<<8|'B',
47    'L'<<8|'C', 'L'<<8|'I', 'L'<<8|'K', 'L'<<8|'R', 'L'<<8|'S',
48    'L'<<8|'T', 'L'<<8|'U', 'L'<<8|'V', 'L'<<8|'Y', 'M'<<8|'A',
49    'M'<<8|'C', 'M'<<8|'D', 'M'<<8|'E', 'M'<<8|'G', 'M'<<8|'H',
50    'M'<<8|'K', 'M'<<8|'L', 'M'<<8|'M', 'M'<<8|'N', 'M'<<8|'O',
51    'M'<<8|'P', 'M'<<8|'Q', 'M'<<8|'R', 'M'<<8|'S', 'M'<<8|'T',
52    'M'<<8|'U', 'M'<<8|'V', 'M'<<8|'W', 'M'<<8|'X', 'M'<<8|'Y',
53    'M'<<8|'Z', 'N'<<8|'A', 'N'<<8|'C', 'N'<<8|'E', 'N'<<8|'F',
54    'N'<<8|'G', 'N'<<8|'I', 'N'<<8|'L', 'N'<<8|'O', 'N'<<8|'P',
55    'N'<<8|'R', 'N'<<8|'U', 'N'<<8|'Z', 'O'<<8|'M', 'P'<<8|'A',
56    'P'<<8|'E', 'P'<<8|'F', 'P'<<8|'G', 'P'<<8|'H', 'P'<<8|'K',
57    'P'<<8|'L', 'P'<<8|'M', 'P'<<8|'N', 'P'<<8|'R', 'P'<<8|'S',
58    'P'<<8|'T', 'P'<<8|'W', 'P'<<8|'Y', 'Q'<<8|'A', 'R'<<8|'E',
59    'R'<<8|'O', 'R'<<8|'S', 'R'<<8|'U', 'R'<<8|'W', 'S'<<8|'A',
60    'S'<<8|'B', 'S'<<8|'C', 'S'<<8|'D', 'S'<<8|'E', 'S'<<8|'G',
61    'S'<<8|'H', 'S'<<8|'I', 'S'<<8|'J', 'S'<<8|'K', 'S'<<8|'L',
62    'S'<<8|'M', 'S'<<8|'N', 'S'<<8|'O', 'S'<<8|'R', 'S'<<8|'T',
63    'S'<<8|'V', 'S'<<8|'Y', 'S'<<8|'Z', 'T'<<8|'C', 'T'<<8|'D',
64    'T'<<8|'F', 'T'<<8|'G', 'T'<<8|'H', 'T'<<8|'J', 'T'<<8|'K',
65    'T'<<8|'L', 'T'<<8|'M', 'T'<<8|'N', 'T'<<8|'O', 'T'<<8|'R',
66    'T'<<8|'T', 'T'<<8|'V', 'T'<<8|'W', 'T'<<8|'Z', 'U'<<8|'A',
67    'U'<<8|'G', 'U'<<8|'M', 'U'<<8|'S', 'U'<<8|'Y', 'U'<<8|'Z',
68    'V'<<8|'A', 'V'<<8|'C', 'V'<<8|'E', 'V'<<8|'G', 'V'<<8|'I',
69    'V'<<8|'N', 'V'<<8|'U', 'W'<<8|'F', 'W'<<8|'S', 'Y'<<8|'E',
70    'Y'<<8|'T', 'Z'<<8|'A', 'Z'<<8|'M', 'Z'<<8|'W', -1 };
71
72// Verifies the set of prepopulate data doesn't contain entries with duplicate
73// ids.
74TEST_F(TemplateURLPrepopulateDataTest, UniqueIDs) {
75  TestingProfile profile;
76  for (size_t i = 0; i < arraysize(kCountryIds); ++i) {
77    profile.GetPrefs()->SetInteger(prefs::kCountryIDAtInstall, kCountryIds[i]);
78    ScopedVector<TemplateURL> urls;
79    size_t default_index;
80    TemplateURLPrepopulateData::GetPrepopulatedEngines(
81        profile.GetPrefs(), &(urls.get()), &default_index);
82    std::set<int> unique_ids;
83    for (size_t turl_i = 0; turl_i < urls.size(); ++turl_i) {
84      ASSERT_TRUE(unique_ids.find(urls[turl_i]->prepopulate_id()) ==
85                  unique_ids.end());
86      unique_ids.insert(urls[turl_i]->prepopulate_id());
87    }
88  }
89}
90
91// Verifies that default search providers from the preferences file
92// override the built-in ones.
93TEST_F(TemplateURLPrepopulateDataTest, ProvidersFromPrefs) {
94  TestingPrefService prefs;
95  TemplateURLPrepopulateData::RegisterUserPrefs(&prefs);
96  prefs.SetUserPref(prefs::kSearchProviderOverridesVersion,
97                    Value::CreateIntegerValue(1));
98  ListValue* overrides = new ListValue;
99  DictionaryValue* entry = new DictionaryValue;
100  entry->SetString("name", "foo");
101  entry->SetString("keyword", "fook");
102  entry->SetString("search_url", "http://foo.com/s?q={searchTerms}");
103  entry->SetString("favicon_url", "http://foi.com/favicon.ico");
104  entry->SetString("suggest_url", "");
105  entry->SetString("instant_url", "");
106  entry->SetString("encoding", "UTF-8");
107  entry->SetInteger("search_engine_type", 1);
108  entry->SetInteger("logo_id", 0);
109  entry->SetInteger("id", 1001);
110  overrides->Append(entry);
111  prefs.SetUserPref(prefs::kSearchProviderOverrides, overrides);
112
113  int version = TemplateURLPrepopulateData::GetDataVersion(&prefs);
114  EXPECT_EQ(1, version);
115
116  ScopedVector<TemplateURL> t_urls;
117  size_t default_index;
118  TemplateURLPrepopulateData::GetPrepopulatedEngines(
119      &prefs, &(t_urls.get()), &default_index);
120
121  ASSERT_EQ(1u, t_urls.size());
122  EXPECT_EQ(L"foo", t_urls[0]->short_name());
123  EXPECT_EQ(L"fook", t_urls[0]->keyword());
124  EXPECT_EQ("foo.com", t_urls[0]->url()->GetHost());
125  EXPECT_EQ("foi.com", t_urls[0]->GetFavIconURL().host());
126  EXPECT_EQ(1u, t_urls[0]->input_encodings().size());
127  EXPECT_EQ(1001, t_urls[0]->prepopulate_id());
128  EXPECT_EQ(SEARCH_ENGINE_GOOGLE, t_urls[0]->search_engine_type());
129  EXPECT_EQ(0, t_urls[0]->logo_id());
130}
131
132TEST_F(TemplateURLPrepopulateDataTest, SearchEngineFromOrigin) {
133  UIThreadSearchTermsData search_terms_data;
134  std::set<GURL> unique_engines;
135
136  { // Scoping for the profile.
137    TestingProfile profile;
138    for (size_t i = 0; i < arraysize(kCountryIds); ++i) {
139      profile.GetPrefs()->SetInteger(prefs::kCountryIDAtInstall,
140                                     kCountryIds[i]);
141      ScopedVector<TemplateURL> urls;
142      size_t default_index;
143      TemplateURLPrepopulateData::GetPrepopulatedEngines(
144          profile.GetPrefs(), &(urls.get()), &default_index);
145      for (size_t turl_i = 0; turl_i < urls.size(); ++turl_i) {
146        GURL engine_url(urls[turl_i]->url()->url());
147        if (!engine_url.is_valid()) {
148          engine_url = TemplateURLModel::GenerateSearchURLUsingTermsData(
149              urls[turl_i], search_terms_data);
150        }
151        GURL origin = engine_url.GetOrigin();
152        unique_engines.insert(origin);
153      }
154    }
155  }
156
157  TestingProfile profile;
158  for (std::set<GURL>::iterator it = unique_engines.begin();
159       it != unique_engines.end(); ++it) {
160    scoped_ptr<TemplateURL> found_url(
161        TemplateURLPrepopulateData::GetEngineForOrigin(profile.GetPrefs(),
162                                                       *it));
163    EXPECT_EQ(
164        TemplateURLModel::GenerateSearchURLUsingTermsData(
165            found_url.get(), search_terms_data).GetOrigin(),
166        it->GetOrigin());
167  }
168
169  GURL not_a_search_engine("http://example.com/");
170  EXPECT_EQ(NULL, TemplateURLPrepopulateData::GetEngineForOrigin(
171      profile.GetPrefs(),
172      not_a_search_engine));
173}
174
175TEST_F(TemplateURLPrepopulateDataTest, GetSearchEngineLogo) {
176  GURL bad_engine("http://example.com/");
177  EXPECT_EQ(kNoSearchEngineLogo,
178            TemplateURLPrepopulateData::GetSearchEngineLogo(bad_engine));
179  GURL engine_with_logo("http://www.ask.com/");
180  EXPECT_EQ(IDR_SEARCH_ENGINE_LOGO_ASK,
181            TemplateURLPrepopulateData::GetSearchEngineLogo(engine_with_logo));
182  GURL engine_no_logo("http://araby.com/");
183  EXPECT_EQ(kNoSearchEngineLogo,
184            TemplateURLPrepopulateData::GetSearchEngineLogo(engine_no_logo));
185
186}
187