172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file.
4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include <string>
6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/basictypes.h"
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h"
9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/message_loop.h"
10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/task.h"
1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/utf_string_conversions.h"
12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/search_engines/search_provider_install_data.h"
13bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/search_engines/template_url.h"
14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/search_engines/template_url_model.h"
15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/search_engines/template_url_model_test_util.h"
16731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/common/pref_names.h"
17731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/test/testing_pref_service.h"
18731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/test/testing_profile.h"
19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h"
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_source.h"
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_type.h"
23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "testing/gtest/include/gtest/gtest.h"
24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Create a TemplateURL. The caller owns the returned TemplateURL*.
26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenstatic TemplateURL* CreateTemplateURL(const std::string& url,
2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                      const std::string& keyword) {
28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TemplateURL* t_url = new TemplateURL();
29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  t_url->SetURL(url, 0, 0);
3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  t_url->set_keyword(UTF8ToUTF16(keyword));
3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  t_url->set_short_name(UTF8ToUTF16(keyword));
32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return t_url;
33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Test the SearchProviderInstallData::GetInstallState.
36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass TestGetInstallState :
37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    public base::RefCountedThreadSafe<TestGetInstallState> {
38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  explicit TestGetInstallState(SearchProviderInstallData* install_data)
40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      : install_data_(install_data),
41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        main_loop_(NULL),
42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        passed_(false) {
43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void set_search_provider_host(
46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      const std::string& search_provider_host) {
47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    search_provider_host_ = search_provider_host;
48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void set_default_search_provider_host(
51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      const std::string& default_search_provider_host) {
52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    default_search_provider_host_ = default_search_provider_host;
53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Runs the test. Returns true if all passed. False if any failed.
56731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool RunTests();
57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private:
59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  friend class base::RefCountedThreadSafe<TestGetInstallState>;
60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ~TestGetInstallState();
61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Starts the test run on the IO thread.
63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void StartTestOnIOThread();
64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Callback for when SearchProviderInstallData is ready to have
66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // GetInstallState called. Runs all of the test cases.
67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void DoInstallStateTests();
68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Does a verification for one url and its expected state.
70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void VerifyInstallState(SearchProviderInstallData::State expected_state,
71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                          const std::string& url);
72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SearchProviderInstallData* install_data_;
74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MessageLoop* main_loop_;
75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // A host which should be a search provider but not the default.
77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string search_provider_host_;
78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // A host which should be a search provider but not the default.
80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string default_search_provider_host_;
81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Used to indicate if DoInstallStateTests passed all test.
83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  bool passed_;
84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(TestGetInstallState);
86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
88731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool TestGetInstallState::RunTests() {
89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  passed_ = true;
90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  main_loop_ = MessageLoop::current();
92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
93731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)->PostTask(
94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      FROM_HERE,
95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      NewRunnableMethod(this, &TestGetInstallState::StartTestOnIOThread));
96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Run the current message loop. When the test is finished on the I/O thread,
97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // it invokes Quit, which unblocks this.
98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MessageLoop::current()->Run();
99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  main_loop_ = NULL;
100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Let the testing code know what the result is.
102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return passed_;
103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTestGetInstallState::~TestGetInstallState() {
106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestGetInstallState::StartTestOnIOThread() {
109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  install_data_->CallWhenLoaded(
110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      NewRunnableMethod(this,
111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        &TestGetInstallState::DoInstallStateTests));
112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestGetInstallState::DoInstallStateTests() {
115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Installed but not default.
116bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  VerifyInstallState(SearchProviderInstallData::INSTALLED_BUT_NOT_DEFAULT,
117bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                     "http://" + search_provider_host_ + "/");
118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  VerifyInstallState(SearchProviderInstallData::INSTALLED_BUT_NOT_DEFAULT,
119bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                     "http://" + search_provider_host_ + ":80/");
120bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
121bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Not installed.
122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  VerifyInstallState(SearchProviderInstallData::NOT_INSTALLED,
123bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                     "http://" + search_provider_host_ + ":96/");
124bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
125bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Not installed due to different scheme.
126bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  VerifyInstallState(SearchProviderInstallData::NOT_INSTALLED,
127bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                     "https://" + search_provider_host_ + "/");
128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
129bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Not installed.
130bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  VerifyInstallState(SearchProviderInstallData::NOT_INSTALLED,
131bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                     "http://a" + search_provider_host_ + "/");
132bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
133bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Installed as default.
134bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!default_search_provider_host_.empty()) {
135bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    VerifyInstallState(SearchProviderInstallData::INSTALLED_AS_DEFAULT,
136bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                       "http://" + default_search_provider_host_ + "/");
137bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
138bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
139bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // All done.
140bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  main_loop_->PostTask(FROM_HERE, new MessageLoop::QuitTask());
141bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
142bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
143bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid TestGetInstallState::VerifyInstallState(
144bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    SearchProviderInstallData::State expected_state,
145bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    const std::string& url) {
146bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
147bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SearchProviderInstallData::State actual_state =
148bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      install_data_->GetInstallState(GURL(url));
149bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (expected_state == actual_state)
150bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
151bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
152bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  passed_ = false;
153bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  LOG(ERROR) << "GetInstallState for " << url << " failed. Expected " <<
154bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      expected_state << ".  Actual " << actual_state << ".";
155bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
156bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
157bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Provides basic test set-up/tear-down functionality needed by all tests
158bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// that use TemplateURLModelTestUtil.
159bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass SearchProviderInstallDataTest : public testing::Test {
160bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
161bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SearchProviderInstallDataTest()
162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      : install_data_(NULL) {}
163bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
164bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void SetUp() {
165bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    testing::Test::SetUp();
166bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    util_.SetUp();
167731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    util_.StartIOThread();
168bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    install_data_ = new SearchProviderInstallData(
169bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        util_.GetWebDataService(),
170bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        NotificationType::RENDERER_PROCESS_TERMINATED,
171bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        Source<SearchProviderInstallDataTest>(this));
172bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
173bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
174bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void TearDown() {
175731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)->PostTask(
176bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        FROM_HERE,
177bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        new DeleteTask<SearchProviderInstallData>(install_data_));
178bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    install_data_ = NULL;
179bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
180bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Make sure that the install data class on the UI thread gets cleaned up.
181bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // It doesn't matter that this happens after install_data_ is deleted.
182bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    NotificationService::current()->Notify(
183bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        NotificationType::RENDERER_PROCESS_TERMINATED,
184bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        Source<SearchProviderInstallDataTest>(this),
185bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        NotificationService::NoDetails());
186bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
187bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    util_.TearDown();
188bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    testing::Test::TearDown();
189bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
190bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
191731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void SimulateDefaultSearchIsManaged(const std::string& url) {
192731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    ASSERT_FALSE(url.empty());
193731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    TestingPrefService* service = util_.profile()->GetTestingPrefService();
19421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    service->SetManagedPref(
195731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        prefs::kDefaultSearchProviderEnabled,
196731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        Value::CreateBooleanValue(true));
19721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    service->SetManagedPref(
198731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        prefs::kDefaultSearchProviderSearchURL,
199731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        Value::CreateStringValue(url));
20021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    service->SetManagedPref(
201731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        prefs::kDefaultSearchProviderName,
202731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        Value::CreateStringValue("managed"));
203731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Clear the IDs that are not specified via policy.
20421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    service->SetManagedPref(
205731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        prefs::kDefaultSearchProviderID, new StringValue(""));
20621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    service->SetManagedPref(
207731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        prefs::kDefaultSearchProviderPrepopulateID, new StringValue(""));
208731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    util_.model()->Observe(
209731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        NotificationType::PREF_CHANGED,
210731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        Source<PrefService>(util_.profile()->GetTestingPrefService()),
211731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        Details<std::string>(NULL));
212731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
213731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
214bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen protected:
215bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TemplateURLModelTestUtil util_;
216bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
217bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Provides the search provider install state on the I/O thread. It must be
218bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // deleted on the I/O thread, which is why it isn't a scoped_ptr.
219bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SearchProviderInstallData* install_data_;
220bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
221bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(SearchProviderInstallDataTest);
222bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
223bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
224bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(SearchProviderInstallDataTest, GetInstallState) {
225bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Set up the database.
226bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  util_.ChangeModelToLoadState();
227bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string host = "www.unittest.com";
228bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TemplateURL* t_url = CreateTemplateURL("http://" + host + "/path",
22972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                         "unittest");
230bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  util_.model()->Add(t_url);
231bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
232bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Wait for the changes to be saved.
233731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  TemplateURLModelTestUtil::BlockTillServiceProcessesRequests();
234bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
235bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Verify the search providers install state (with no default set).
236bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_refptr<TestGetInstallState> test_get_install_state(
237bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      new TestGetInstallState(install_data_));
238bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  test_get_install_state->set_search_provider_host(host);
239731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_TRUE(test_get_install_state->RunTests());
240bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
241bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Set-up a default and try it all one more time.
242bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string default_host = "www.mmm.com";
243bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TemplateURL* default_url = CreateTemplateURL("http://" + default_host + "/",
24472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                               "mmm");
245bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  util_.model()->Add(default_url);
246bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  util_.model()->SetDefaultSearchProvider(default_url);
247bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  test_get_install_state->set_default_search_provider_host(default_host);
248731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_TRUE(test_get_install_state->RunTests());
249731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
250731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
251731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
252731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(SearchProviderInstallDataTest, ManagedDefaultSearch) {
253731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Set up the database.
254731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  util_.ChangeModelToLoadState();
255731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string host = "www.unittest.com";
256731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  TemplateURL* t_url = CreateTemplateURL("http://" + host + "/path",
25772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                         "unittest");
258731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  util_.model()->Add(t_url);
259731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
260731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Set a managed preference that establishes a default search provider.
261731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string host2 = "www.managedtest.com";
262731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string url2 = "http://" + host2 + "/p{searchTerms}";
263731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  SimulateDefaultSearchIsManaged(url2);
264731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_TRUE(util_.model()->is_default_search_managed());
265731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
266731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Wait for the changes to be saved.
267731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  util_.BlockTillServiceProcessesRequests();
268731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
269731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Verify the search providers install state.  The default search should be
270731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // the managed one we previously set.
271731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  scoped_refptr<TestGetInstallState> test_get_install_state(
272731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      new TestGetInstallState(install_data_));
273731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  test_get_install_state->set_search_provider_host(host);
274731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  test_get_install_state->set_default_search_provider_host(host2);
275731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_TRUE(test_get_install_state->RunTests());
276bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
277bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
278bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
279bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(SearchProviderInstallDataTest, GoogleBaseUrlChange) {
280bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_refptr<TestGetInstallState> test_get_install_state(
281bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      new TestGetInstallState(install_data_));
282bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
283bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Set up the database.
284bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  util_.ChangeModelToLoadState();
285bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string google_host = "w.com";
286bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  util_.SetGoogleBaseURL("http://" + google_host + "/");
287bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Wait for the I/O thread to process the update notification.
288731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  TemplateURLModelTestUtil::BlockTillIOThreadProcessesRequests();
289bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
290bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TemplateURL* t_url = CreateTemplateURL("{google:baseURL}?q={searchTerms}",
29172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                         "t");
292bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  util_.model()->Add(t_url);
293bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TemplateURL* default_url = CreateTemplateURL("http://d.com/",
29472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                               "d");
295bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  util_.model()->Add(default_url);
296bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  util_.model()->SetDefaultSearchProvider(default_url);
297bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
298bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Wait for the changes to be saved.
299731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  TemplateURLModelTestUtil::BlockTillServiceProcessesRequests();
300bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
301bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Verify the search providers install state (with no default set).
302bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  test_get_install_state->set_search_provider_host(google_host);
303731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_TRUE(test_get_install_state->RunTests());
304bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
305bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Change the Google base url.
306bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  google_host = "foo.com";
307bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  util_.SetGoogleBaseURL("http://" + google_host + "/");
308bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Wait for the I/O thread to process the update notification.
309731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  TemplateURLModelTestUtil::BlockTillIOThreadProcessesRequests();
310bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
311bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Verify that the change got picked up.
312bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  test_get_install_state->set_search_provider_host(google_host);
313731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_TRUE(test_get_install_state->RunTests());
314bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
315