1 // Copyright (c) 2018 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 <chrome/browser/android/locale/locale_template_url_loader.h>
6 #include <stddef.h>
7 
8 #include "base/strings/string_util.h"
9 #include "base/strings/utf_string_conversions.h"
10 #include "chrome/browser/search_engines/template_url_service_test_util.h"
11 #include "components/search_engines/prepopulated_engines.h"
12 #include "components/search_engines/template_url.h"
13 #include "components/search_engines/template_url_data_util.h"
14 #include "components/search_engines/template_url_prepopulate_data.h"
15 #include "components/search_engines/template_url_service.h"
16 #include "content/public/test/browser_task_environment.h"
17 #include "testing/gmock/include/gmock/gmock.h"
18 #include "testing/gtest/include/gtest/gtest.h"
19 
20 class MockLocaleTemplateUrlLoader : public LocaleTemplateUrlLoader {
21  public:
MockLocaleTemplateUrlLoader(std::string locale,TemplateURLService * service)22   MockLocaleTemplateUrlLoader(std::string locale, TemplateURLService* service)
23       : LocaleTemplateUrlLoader(locale, service) {}
24 
~MockLocaleTemplateUrlLoader()25   ~MockLocaleTemplateUrlLoader() override {}
26 
27  protected:
GetLocalPrepopulatedEngines()28   std::vector<std::unique_ptr<TemplateURLData>> GetLocalPrepopulatedEngines()
29       override {
30     std::vector<std::unique_ptr<TemplateURLData>> result;
31     result.push_back(TemplateURLDataFromPrepopulatedEngine(
32         TemplateURLPrepopulateData::so_360));
33     result.push_back(TemplateURLDataFromPrepopulatedEngine(
34         TemplateURLPrepopulateData::naver));
35     result.push_back(TemplateURLDataFromPrepopulatedEngine(
36         TemplateURLPrepopulateData::google));
37     return result;
38   }
39 
GetDesignatedSearchEngineForChina()40   int GetDesignatedSearchEngineForChina() override {
41     return TemplateURLPrepopulateData::naver.id;
42   }
43 };
44 
45 class LocaleTemplateUrlLoaderTest : public testing::Test {
46  public:
LocaleTemplateUrlLoaderTest()47   LocaleTemplateUrlLoaderTest() {}
48 
49   void SetUp() override;
50   void TearDown() override;
loader()51   LocaleTemplateUrlLoader* loader() { return loader_.get(); }
test_util()52   TemplateURLServiceTestUtil* test_util() { return test_util_.get(); }
model()53   TemplateURLService* model() { return test_util_->model(); }
54 
55  private:
56   content::BrowserTaskEnvironment
57       task_environment_;  // To set up BrowserThreads.
58   std::unique_ptr<LocaleTemplateUrlLoader> loader_;
59   std::unique_ptr<TemplateURLServiceTestUtil> test_util_;
60 
61   DISALLOW_COPY_AND_ASSIGN(LocaleTemplateUrlLoaderTest);
62 };
63 
SetUp()64 void LocaleTemplateUrlLoaderTest::SetUp() {
65   test_util_.reset(new TemplateURLServiceTestUtil);
66   loader_.reset(new MockLocaleTemplateUrlLoader("jp", model()));
67 }
68 
TearDown()69 void LocaleTemplateUrlLoaderTest::TearDown() {
70   loader_.reset();
71   test_util_.reset();
72 }
73 
TEST_F(LocaleTemplateUrlLoaderTest,AddLocalSearchEngines)74 TEST_F(LocaleTemplateUrlLoaderTest, AddLocalSearchEngines) {
75   test_util()->VerifyLoad();
76   auto naver = base::ASCIIToUTF16("naver.com");
77   auto keyword_so = base::ASCIIToUTF16("so.com");
78   ASSERT_EQ(nullptr, model()->GetTemplateURLForKeyword(naver));
79   ASSERT_EQ(nullptr, model()->GetTemplateURLForKeyword(keyword_so));
80 
81   ASSERT_TRUE(loader()->LoadTemplateUrls(nullptr));
82 
83   EXPECT_EQ(TemplateURLPrepopulateData::naver.id,
84             model()->GetTemplateURLForKeyword(naver)->prepopulate_id());
85   EXPECT_EQ(TemplateURLPrepopulateData::so_360.id,
86             model()->GetTemplateURLForKeyword(keyword_so)->prepopulate_id());
87 
88   // Ensure multiple calls to Load do not duplicate the search engines.
89   size_t existing_size = model()->GetTemplateURLs().size();
90   ASSERT_TRUE(loader()->LoadTemplateUrls(nullptr));
91   EXPECT_EQ(existing_size, model()->GetTemplateURLs().size());
92 }
93 
TEST_F(LocaleTemplateUrlLoaderTest,RemoveLocalSearchEngines)94 TEST_F(LocaleTemplateUrlLoaderTest, RemoveLocalSearchEngines) {
95   test_util()->VerifyLoad();
96   ASSERT_TRUE(loader()->LoadTemplateUrls(nullptr));
97   // Make sure locale engines are loaded.
98   auto keyword_naver = base::ASCIIToUTF16("naver.com");
99   auto keyword_so = base::ASCIIToUTF16("so.com");
100   ASSERT_EQ(TemplateURLPrepopulateData::naver.id,
101             model()->GetTemplateURLForKeyword(keyword_naver)->prepopulate_id());
102   ASSERT_EQ(TemplateURLPrepopulateData::so_360.id,
103             model()->GetTemplateURLForKeyword(keyword_so)->prepopulate_id());
104 
105   loader()->RemoveTemplateUrls(nullptr);
106 
107   ASSERT_EQ(nullptr, model()->GetTemplateURLForKeyword(keyword_naver));
108   ASSERT_EQ(nullptr, model()->GetTemplateURLForKeyword(keyword_so));
109 }
110 
TEST_F(LocaleTemplateUrlLoaderTest,OverrideDefaultSearch)111 TEST_F(LocaleTemplateUrlLoaderTest, OverrideDefaultSearch) {
112   test_util()->VerifyLoad();
113   ASSERT_EQ(TemplateURLPrepopulateData::google.id,
114             model()->GetDefaultSearchProvider()->prepopulate_id());
115   // Load local search engines first.
116   ASSERT_TRUE(loader()->LoadTemplateUrls(nullptr));
117 
118   ASSERT_EQ(TemplateURLPrepopulateData::google.id,
119             model()->GetDefaultSearchProvider()->prepopulate_id());
120 
121   // Set one of the local search engine as default.
122   loader()->OverrideDefaultSearchProvider(nullptr);
123   ASSERT_EQ(TemplateURLPrepopulateData::naver.id,
124             model()->GetDefaultSearchProvider()->prepopulate_id());
125 
126   // Revert the default search engine tweak.
127   loader()->SetGoogleAsDefaultSearch(nullptr);
128   ASSERT_EQ(TemplateURLPrepopulateData::google.id,
129             model()->GetDefaultSearchProvider()->prepopulate_id());
130 }
131