OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 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/files/file_util.h" | |
6 #include "base/logging.h" | |
7 #include "base/path_service.h" | |
8 #include "base/strings/utf_string_conversions.h" | |
9 #include "chrome/common/chrome_paths.h" | |
10 #include "components/search_engines/search_terms_data.h" | |
11 #include "components/search_engines/template_url.h" | |
12 #include "components/search_engines/template_url_parser.h" | |
13 #include "testing/gtest/include/gtest/gtest.h" | |
14 | |
15 using base::ASCIIToUTF16; | |
16 | |
17 // ParamFilterImpl ------------------------------------------------------------ | |
18 | |
19 // Filters any param which as an occurrence of name_str_ in its name or an | |
20 // occurrence of value_str_ in its value. | |
21 class ParamFilterImpl : public TemplateURLParser::ParameterFilter { | |
22 public: | |
23 ParamFilterImpl(std::string name_str, std::string value_str); | |
24 virtual ~ParamFilterImpl(); | |
25 | |
26 virtual bool KeepParameter(const std::string& key, | |
27 const std::string& value) OVERRIDE; | |
28 | |
29 private: | |
30 std::string name_str_; | |
31 std::string value_str_; | |
32 | |
33 DISALLOW_COPY_AND_ASSIGN(ParamFilterImpl); | |
34 }; | |
35 | |
36 ParamFilterImpl::ParamFilterImpl(std::string name_str, std::string value_str) | |
37 : name_str_(name_str), | |
38 value_str_(value_str) { | |
39 } | |
40 | |
41 ParamFilterImpl::~ParamFilterImpl() { | |
42 } | |
43 | |
44 bool ParamFilterImpl::KeepParameter(const std::string& key, | |
45 const std::string& value) { | |
46 return (name_str_.empty() || key.find(name_str_) == std::string::npos) && | |
47 (value_str_.empty() || value.find(value_str_) == std::string::npos); | |
48 } | |
49 | |
50 | |
51 // TemplateURLParserTest ------------------------------------------------------ | |
52 | |
53 class TemplateURLParserTest : public testing::Test { | |
54 protected: | |
55 TemplateURLParserTest(); | |
56 virtual ~TemplateURLParserTest(); | |
57 | |
58 virtual void SetUp() OVERRIDE; | |
59 | |
60 bool is_disabled() const; | |
61 | |
62 // Parses the OpenSearch description document at file_name (relative to the | |
63 // data dir). The TemplateURL is placed in |template_url_|. | |
64 void ParseFile(const std::string& file_name, | |
65 TemplateURLParser::ParameterFilter* filter); | |
66 | |
67 // ParseFile parses the results into this template_url. | |
68 scoped_ptr<TemplateURL> template_url_; | |
69 | |
70 private: | |
71 base::FilePath full_path_; | |
72 }; | |
73 | |
74 TemplateURLParserTest::TemplateURLParserTest() { | |
75 } | |
76 | |
77 TemplateURLParserTest::~TemplateURLParserTest() { | |
78 } | |
79 | |
80 void TemplateURLParserTest::SetUp() { | |
81 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &full_path_)); | |
82 full_path_ = full_path_.AppendASCII("osdd"); | |
83 if (!base::PathExists(full_path_)) { | |
84 LOG(ERROR) << | |
85 "This test can't be run without some non-redistributable data"; | |
86 full_path_ = base::FilePath(); | |
87 } | |
88 } | |
89 | |
90 bool TemplateURLParserTest::is_disabled() const { | |
91 return full_path_.empty(); | |
92 } | |
93 | |
94 void TemplateURLParserTest::ParseFile( | |
95 const std::string& file_name, | |
96 TemplateURLParser::ParameterFilter* filter) { | |
97 base::FilePath full_path; | |
98 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &full_path)); | |
99 full_path = full_path.AppendASCII("osdd"); | |
100 full_path = full_path.AppendASCII(file_name); | |
101 ASSERT_TRUE(base::PathExists(full_path)); | |
102 | |
103 std::string contents; | |
104 ASSERT_TRUE(base::ReadFileToString(full_path, &contents)); | |
105 template_url_.reset(TemplateURLParser::Parse( | |
106 SearchTermsData(), false, contents.data(), contents.length(), filter)); | |
107 } | |
108 | |
109 | |
110 // Actual tests --------------------------------------------------------------- | |
111 | |
112 TEST_F(TemplateURLParserTest, FailOnBogusURL) { | |
113 if (is_disabled()) | |
114 return; | |
115 ASSERT_NO_FATAL_FAILURE(ParseFile("bogus.xml", NULL)); | |
116 EXPECT_FALSE(template_url_.get()); | |
117 } | |
118 | |
119 TEST_F(TemplateURLParserTest, PassOnHTTPS) { | |
120 if (is_disabled()) | |
121 return; | |
122 ASSERT_NO_FATAL_FAILURE(ParseFile("https.xml", NULL)); | |
123 EXPECT_TRUE(template_url_.get()); | |
124 } | |
125 | |
126 TEST_F(TemplateURLParserTest, FailOnPost) { | |
127 if (is_disabled()) | |
128 return; | |
129 ASSERT_NO_FATAL_FAILURE(ParseFile("post.xml", NULL)); | |
130 EXPECT_FALSE(template_url_.get()); | |
131 } | |
132 | |
133 TEST_F(TemplateURLParserTest, TestDictionary) { | |
134 if (is_disabled()) | |
135 return; | |
136 ASSERT_NO_FATAL_FAILURE(ParseFile("dictionary.xml", NULL)); | |
137 ASSERT_TRUE(template_url_.get()); | |
138 EXPECT_EQ(ASCIIToUTF16("Dictionary.com"), template_url_->short_name()); | |
139 EXPECT_EQ(GURL("http://cache.lexico.com/g/d/favicon.ico"), | |
140 template_url_->favicon_url()); | |
141 EXPECT_TRUE(template_url_->url_ref().SupportsReplacement(SearchTermsData())); | |
142 EXPECT_EQ("http://dictionary.reference.com/browse/{searchTerms}?r=75", | |
143 template_url_->url()); | |
144 } | |
145 | |
146 TEST_F(TemplateURLParserTest, TestMSDN) { | |
147 if (is_disabled()) | |
148 return; | |
149 ASSERT_NO_FATAL_FAILURE(ParseFile("msdn.xml", NULL)); | |
150 ASSERT_TRUE(template_url_.get()); | |
151 EXPECT_EQ(ASCIIToUTF16("Search \" MSDN"), template_url_->short_name()); | |
152 EXPECT_EQ(GURL("http://search.msdn.microsoft.com/search/favicon.ico"), | |
153 template_url_->favicon_url()); | |
154 EXPECT_TRUE(template_url_->url_ref().SupportsReplacement(SearchTermsData())); | |
155 EXPECT_EQ("http://search.msdn.microsoft.com/search/default.aspx?" | |
156 "Query={searchTerms}&brand=msdn&locale=en-US", | |
157 template_url_->url()); | |
158 } | |
159 | |
160 TEST_F(TemplateURLParserTest, TestWikipedia) { | |
161 if (is_disabled()) | |
162 return; | |
163 ASSERT_NO_FATAL_FAILURE(ParseFile("wikipedia.xml", NULL)); | |
164 ASSERT_TRUE(template_url_.get()); | |
165 EXPECT_EQ(ASCIIToUTF16("Wikipedia (English)"), template_url_->short_name()); | |
166 EXPECT_EQ(GURL("http://en.wikipedia.org/favicon.ico"), | |
167 template_url_->favicon_url()); | |
168 EXPECT_TRUE(template_url_->url_ref().SupportsReplacement(SearchTermsData())); | |
169 EXPECT_EQ("http://en.wikipedia.org/w/index.php?" | |
170 "title=Special:Search&search={searchTerms}", | |
171 template_url_->url()); | |
172 EXPECT_TRUE(template_url_->suggestions_url_ref().SupportsReplacement( | |
173 SearchTermsData())); | |
174 EXPECT_EQ("http://en.wikipedia.org/w/api.php?" | |
175 "action=opensearch&search={searchTerms}", | |
176 template_url_->suggestions_url()); | |
177 ASSERT_EQ(2U, template_url_->input_encodings().size()); | |
178 EXPECT_EQ("UTF-8", template_url_->input_encodings()[0]); | |
179 EXPECT_EQ("Shift_JIS", template_url_->input_encodings()[1]); | |
180 } | |
181 | |
182 TEST_F(TemplateURLParserTest, NoCrashOnEmptyAttributes) { | |
183 if (is_disabled()) | |
184 return; | |
185 ASSERT_NO_FATAL_FAILURE(ParseFile("url_with_no_attributes.xml", NULL)); | |
186 } | |
187 | |
188 TEST_F(TemplateURLParserTest, TestFirefoxEbay) { | |
189 if (is_disabled()) | |
190 return; | |
191 // This file uses the Parameter extension | |
192 // (see http://www.opensearch.org/Specifications/OpenSearch/Extensions/Paramet
er/1.0) | |
193 ParamFilterImpl filter("ebay", "ebay"); | |
194 ASSERT_NO_FATAL_FAILURE(ParseFile("firefox_ebay.xml", &filter)); | |
195 ASSERT_TRUE(template_url_.get()); | |
196 EXPECT_EQ(ASCIIToUTF16("eBay"), template_url_->short_name()); | |
197 EXPECT_TRUE(template_url_->url_ref().SupportsReplacement(SearchTermsData())); | |
198 EXPECT_EQ("http://search.ebay.com/search/search.dll?query={searchTerms}&" | |
199 "MfcISAPICommand=GetResult&ht=1&srchdesc=n&maxRecordsReturned=300&" | |
200 "maxRecordsPerPage=50&SortProperty=MetaEndSort", | |
201 template_url_->url()); | |
202 ASSERT_EQ(1U, template_url_->input_encodings().size()); | |
203 EXPECT_EQ("ISO-8859-1", template_url_->input_encodings()[0]); | |
204 EXPECT_EQ(GURL("http://search.ebay.com/favicon.ico"), | |
205 template_url_->favicon_url()); | |
206 } | |
207 | |
208 TEST_F(TemplateURLParserTest, TestFirefoxWebster) { | |
209 if (is_disabled()) | |
210 return; | |
211 // This XML file uses a namespace. | |
212 ParamFilterImpl filter(std::string(), "Mozilla"); | |
213 ASSERT_NO_FATAL_FAILURE(ParseFile("firefox_webster.xml", &filter)); | |
214 ASSERT_TRUE(template_url_.get()); | |
215 EXPECT_EQ(ASCIIToUTF16("Webster"), template_url_->short_name()); | |
216 EXPECT_TRUE(template_url_->url_ref().SupportsReplacement(SearchTermsData())); | |
217 EXPECT_EQ("http://www.webster.com/cgi-bin/dictionary?va={searchTerms}", | |
218 template_url_->url()); | |
219 ASSERT_EQ(1U, template_url_->input_encodings().size()); | |
220 EXPECT_EQ("ISO-8859-1", template_url_->input_encodings()[0]); | |
221 EXPECT_EQ(GURL("http://www.webster.com/favicon.ico"), | |
222 template_url_->favicon_url()); | |
223 } | |
224 | |
225 TEST_F(TemplateURLParserTest, TestFirefoxYahoo) { | |
226 if (is_disabled()) | |
227 return; | |
228 // This XML file uses a namespace. | |
229 ParamFilterImpl filter(std::string(), "Mozilla"); | |
230 ASSERT_NO_FATAL_FAILURE(ParseFile("firefox_yahoo.xml", &filter)); | |
231 ASSERT_TRUE(template_url_.get()); | |
232 EXPECT_EQ(ASCIIToUTF16("Yahoo"), template_url_->short_name()); | |
233 EXPECT_TRUE(template_url_->url_ref().SupportsReplacement(SearchTermsData())); | |
234 EXPECT_EQ("http://ff.search.yahoo.com/gossip?" | |
235 "output=fxjson&command={searchTerms}", | |
236 template_url_->suggestions_url()); | |
237 EXPECT_EQ("http://search.yahoo.com/search?p={searchTerms}&ei=UTF-8", | |
238 template_url_->url()); | |
239 ASSERT_EQ(1U, template_url_->input_encodings().size()); | |
240 EXPECT_EQ("UTF-8", template_url_->input_encodings()[0]); | |
241 EXPECT_EQ(GURL("http://search.yahoo.com/favicon.ico"), | |
242 template_url_->favicon_url()); | |
243 } | |
244 | |
245 // Make sure we ignore POST suggestions (this is the same XML file as | |
246 // firefox_yahoo.xml, the suggestion method was just changed to POST). | |
247 TEST_F(TemplateURLParserTest, TestPostSuggestion) { | |
248 if (is_disabled()) | |
249 return; | |
250 // This XML file uses a namespace. | |
251 ParamFilterImpl filter(std::string(), "Mozilla"); | |
252 ASSERT_NO_FATAL_FAILURE(ParseFile("post_suggestion.xml", &filter)); | |
253 ASSERT_TRUE(template_url_.get()); | |
254 EXPECT_EQ(ASCIIToUTF16("Yahoo"), template_url_->short_name()); | |
255 EXPECT_TRUE(template_url_->url_ref().SupportsReplacement(SearchTermsData())); | |
256 EXPECT_TRUE(template_url_->suggestions_url().empty()); | |
257 EXPECT_EQ("http://search.yahoo.com/search?p={searchTerms}&ei=UTF-8", | |
258 template_url_->url()); | |
259 ASSERT_EQ(1U, template_url_->input_encodings().size()); | |
260 EXPECT_EQ("UTF-8", template_url_->input_encodings()[0]); | |
261 EXPECT_EQ(GURL("http://search.yahoo.com/favicon.ico"), | |
262 template_url_->favicon_url()); | |
263 } | |
OLD | NEW |