15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_test_util.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/message_loop/message_loop_proxy.h"
8a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/run_loop.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/search_engines/chrome_template_url_service_client.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/testing_pref_service_syncable.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/default_search_pref_test_util.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/search_engines/keyword_table.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/search_engines/keyword_web_data_service.h"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_service.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/search_engines/testing_search_terms_data.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/webdata/common/web_database_service.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass TestingTemplateURLServiceClient : public ChromeTemplateURLServiceClient {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestingTemplateURLServiceClient(Profile* profile,
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  base::string16* search_term)
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : ChromeTemplateURLServiceClient(profile),
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        search_term_(search_term) {}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void SetKeywordSearchTermsForURL(
30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const GURL& url,
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      TemplateURLID id,
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const base::string16& term) OVERRIDE {
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *search_term_ = term;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::string16* search_term_;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(TestingTemplateURLServiceClient);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace
43ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
44116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTemplateURLServiceTestUtil::TemplateURLServiceTestUtil()
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : changed_count_(0),
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      search_terms_data_(NULL) {
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Make unique temp directory.
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(temp_dir_.CreateUniqueTempDir());
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  profile_.reset(new TestingProfile(temp_dir_.path()));
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<WebDatabaseService> web_database_service =
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new WebDatabaseService(temp_dir_.path().AppendASCII("webdata"),
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             base::MessageLoopProxy::current(),
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             base::MessageLoopProxy::current());
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  web_database_service->AddTable(
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      scoped_ptr<WebDatabaseTable>(new KeywordTable()));
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  web_database_service->LoadDatabase();
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  web_data_service_ =  new KeywordWebDataService(
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      web_database_service.get(), base::MessageLoopProxy::current(),
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      KeywordWebDataService::ProfileErrorCallback());
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  web_data_service_->Init();
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ResetModel(false);
65a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
66ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
67116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTemplateURLServiceTestUtil::~TemplateURLServiceTestUtil() {
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ClearModel();
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  profile_.reset();
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Flush the message loop to make application verifiers happy.
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop().RunUntilIdle();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid TemplateURLServiceTestUtil::OnTemplateURLServiceChanged() {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  changed_count_++;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint TemplateURLServiceTestUtil::GetObserverCount() {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return changed_count_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid TemplateURLServiceTestUtil::ResetObserverCount() {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  changed_count_ = 0;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid TemplateURLServiceTestUtil::VerifyLoad() {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(model()->loaded());
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model()->Load();
90a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::RunLoop().RunUntilIdle();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, GetObserverCount());
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResetObserverCount();
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid TemplateURLServiceTestUtil::ChangeModelToLoadState() {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model()->ChangeToLoadedState();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the web data service so that the database gets updated with
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // any changes made.
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  model()->web_data_service_ = web_data_service_;
101a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::RunLoop().RunUntilIdle();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid TemplateURLServiceTestUtil::ClearModel() {
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  model_->Shutdown();
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  model_.reset();
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  search_terms_data_ = NULL;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid TemplateURLServiceTestUtil::ResetModel(bool verify_load) {
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (model_)
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ClearModel();
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  search_terms_data_ = new TestingSearchTermsData("http://www.google.com/");
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  model_.reset(new TemplateURLService(
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      profile()->GetPrefs(), scoped_ptr<SearchTermsData>(search_terms_data_),
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      web_data_service_.get(),
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      scoped_ptr<TemplateURLServiceClient>(
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          new TestingTemplateURLServiceClient(profile(), &search_term_)),
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      NULL, NULL, base::Closure()));
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model()->AddObserver(this);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  changed_count_ = 0;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (verify_load)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VerifyLoad();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::string16 TemplateURLServiceTestUtil::GetAndClearSearchTerm() {
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::string16 search_term;
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  search_term.swap(search_term_);
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return search_term;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid TemplateURLServiceTestUtil::SetGoogleBaseURL(const GURL& base_url) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(base_url.is_valid());
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  search_terms_data_->set_google_base_url(base_url.spec());
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  model_->GoogleBaseURLChanged();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid TemplateURLServiceTestUtil::SetManagedDefaultSearchPreferences(
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool enabled,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& name,
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& keyword,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& search_url,
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& suggest_url,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& icon_url,
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& encodings,
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& alternate_url,
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& search_terms_replacement_key) {
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DefaultSearchPrefTestUtil::SetManagedPref(
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      profile()->GetTestingPrefService(),
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      enabled, name, keyword, search_url, suggest_url, icon_url, encodings,
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      alternate_url, search_terms_replacement_key);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid TemplateURLServiceTestUtil::RemoveManagedDefaultSearchPreferences() {
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DefaultSearchPrefTestUtil::RemoveManagedPref(
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      profile()->GetTestingPrefService());
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
158