OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/omnibox/browser/physical_web_provider.h" | 5 #include "components/omnibox/browser/physical_web_provider.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
84 TestSchemeClassifier scheme_classifier_; | 84 TestSchemeClassifier scheme_classifier_; |
85 }; | 85 }; |
86 | 86 |
87 class PhysicalWebProviderTest : public testing::Test { | 87 class PhysicalWebProviderTest : public testing::Test { |
88 protected: | 88 protected: |
89 PhysicalWebProviderTest() : provider_(NULL) {} | 89 PhysicalWebProviderTest() : provider_(NULL) {} |
90 ~PhysicalWebProviderTest() override {} | 90 ~PhysicalWebProviderTest() override {} |
91 | 91 |
92 void SetUp() override { | 92 void SetUp() override { |
93 client_.reset(new FakeAutocompleteProviderClient()); | 93 client_.reset(new FakeAutocompleteProviderClient()); |
94 provider_ = PhysicalWebProvider::Create(client_.get()); | 94 provider_ = PhysicalWebProvider::Create(client_.get(), NULL); |
95 } | 95 } |
96 | 96 |
97 void TearDown() override { | 97 void TearDown() override { |
98 provider_ = NULL; | 98 provider_ = NULL; |
99 } | 99 } |
100 | 100 |
101 // Create a dummy metadata list with |metadata_count| items. Each item is | 101 // Create a dummy metadata list with |metadata_count| items. Each item is |
102 // populated with a unique scanned URL and page metadata. | 102 // populated with a unique scanned URL and page metadata. |
103 static std::unique_ptr<base::ListValue> CreateMetadata( | 103 static std::unique_ptr<base::ListValue> CreateMetadata( |
104 size_t metadata_count) { | 104 size_t metadata_count) { |
105 auto metadata_list = base::MakeUnique<base::ListValue>(); | 105 auto metadata_list = base::MakeUnique<base::ListValue>(); |
106 for (size_t i = 0; i < metadata_count; ++i) { | 106 for (size_t i = 0; i < metadata_count; ++i) { |
107 std::string item_id = base::SizeTToString(i); | 107 std::string item_id = base::SizeTToString(i); |
108 std::string url = "https://example.com/" + item_id; | 108 std::string url = "https://example.com/" + item_id; |
109 auto metadata_item = base::MakeUnique<base::DictionaryValue>(); | 109 auto metadata_item = base::MakeUnique<base::DictionaryValue>(); |
110 metadata_item->SetString("scannedUrl", url); | 110 metadata_item->SetString("scannedUrl", url); |
111 metadata_item->SetString("resolvedUrl", url); | 111 metadata_item->SetString("resolvedUrl", url); |
112 metadata_item->SetString("icon", url); | 112 metadata_item->SetString("icon", url); |
113 metadata_item->SetString("title", "Example title " + item_id); | 113 metadata_item->SetString("title", "Example title " + item_id); |
114 metadata_item->SetString("description", "Example description " + item_id); | 114 metadata_item->SetString("description", "Example description " + item_id); |
115 metadata_list->Append(std::move(metadata_item)); | 115 metadata_list->Append(std::move(metadata_item)); |
116 } | 116 } |
117 return metadata_list; | 117 return metadata_list; |
118 } | 118 } |
119 | 119 |
120 // Construct an AutocompleteInput to represent tapping the omnibox from the | |
121 // new tab page. | |
122 static AutocompleteInput CreateInputForNTP() { | |
123 return AutocompleteInput(base::string16(), base::string16::npos, | |
124 std::string(), GURL(), metrics::OmniboxEventProto::OTHER, | |
Mark P
2016/08/31 22:39:33
better: INSTANT_NTP_WITH_OMNIBOX_AS_STARTING_FOCUS
mattreynolds
2016/09/01 01:24:11
Done.
| |
125 true, false, true, true, true, TestSchemeClassifier()); | |
Mark P
2016/08/31 22:39:33
nit: change the first "true" to "false"; that's mo
mattreynolds
2016/09/01 01:24:11
Done.
| |
126 } | |
127 | |
128 // Construct an AutocompleteInput to represent tapping the omnibox with |url| | |
129 // as the current web page. | |
130 static AutocompleteInput CreateInputWithCurrentUrl(const std::string& url) { | |
131 return AutocompleteInput(base::ASCIIToUTF16(url), base::string16::npos, | |
132 std::string(), GURL(url), metrics::OmniboxEventProto::OTHER, | |
133 true, false, true, true, true, TestSchemeClassifier()); | |
134 } | |
135 | |
120 std::unique_ptr<FakeAutocompleteProviderClient> client_; | 136 std::unique_ptr<FakeAutocompleteProviderClient> client_; |
121 scoped_refptr<PhysicalWebProvider> provider_; | 137 scoped_refptr<PhysicalWebProvider> provider_; |
122 | 138 |
123 private: | 139 private: |
124 DISALLOW_COPY_AND_ASSIGN(PhysicalWebProviderTest); | 140 DISALLOW_COPY_AND_ASSIGN(PhysicalWebProviderTest); |
125 }; | 141 }; |
126 | 142 |
127 TEST_F(PhysicalWebProviderTest, TestEmptyMetadataListCreatesNoMatches) { | 143 TEST_F(PhysicalWebProviderTest, TestEmptyMetadataListCreatesNoMatches) { |
128 MockPhysicalWebDataSource* data_source = | 144 MockPhysicalWebDataSource* data_source = |
129 client_->GetMockPhysicalWebDataSource(); | 145 client_->GetMockPhysicalWebDataSource(); |
130 EXPECT_TRUE(data_source); | 146 EXPECT_TRUE(data_source); |
131 | 147 |
132 data_source->SetMetadata(CreateMetadata(0)); | 148 data_source->SetMetadata(CreateMetadata(0)); |
133 | 149 |
134 // Construct an AutocompleteInput representing a typical "zero-suggest" | 150 // Run the test with no text in the omnibox input to simulate NTP. |
135 // case. The provider will verify that the content of the omnibox input field | 151 provider_->Start(CreateInputForNTP(), false); |
136 // was not entered by the user. | 152 EXPECT_TRUE(provider_->matches().empty()); |
137 std::string url("http://www.cnn.com/"); | |
138 const AutocompleteInput input(base::ASCIIToUTF16(url), base::string16::npos, | |
139 std::string(), GURL(url), metrics::OmniboxEventProto::OTHER, | |
140 true, false, true, true, true, TestSchemeClassifier()); | |
141 provider_->Start(input, false); | |
142 | 153 |
154 // Run the test again with a URL in the omnibox input. | |
155 provider_->Start(CreateInputWithCurrentUrl("http://www.cnn.com"), false); | |
143 EXPECT_TRUE(provider_->matches().empty()); | 156 EXPECT_TRUE(provider_->matches().empty()); |
144 } | 157 } |
145 | 158 |
146 TEST_F(PhysicalWebProviderTest, TestSingleMetadataItemCreatesOneMatch) { | 159 TEST_F(PhysicalWebProviderTest, TestSingleMetadataItemCreatesOneMatch) { |
147 MockPhysicalWebDataSource* data_source = | 160 MockPhysicalWebDataSource* data_source = |
148 client_->GetMockPhysicalWebDataSource(); | 161 client_->GetMockPhysicalWebDataSource(); |
149 EXPECT_TRUE(data_source); | 162 EXPECT_TRUE(data_source); |
150 | 163 |
151 // Extract the URL and title before inserting the metadata into the data | 164 // Extract the URL and title before inserting the metadata into the data |
152 // source. | 165 // source. |
153 std::unique_ptr<base::ListValue> metadata_list = CreateMetadata(1); | 166 std::unique_ptr<base::ListValue> metadata_list = CreateMetadata(1); |
154 base::DictionaryValue* metadata_item; | 167 base::DictionaryValue* metadata_item; |
155 EXPECT_TRUE(metadata_list->GetDictionary(0, &metadata_item)); | 168 EXPECT_TRUE(metadata_list->GetDictionary(0, &metadata_item)); |
156 std::string resolved_url; | 169 std::string resolved_url; |
157 EXPECT_TRUE(metadata_item->GetString("resolvedUrl", &resolved_url)); | 170 EXPECT_TRUE(metadata_item->GetString("resolvedUrl", &resolved_url)); |
158 std::string title; | 171 std::string title; |
159 EXPECT_TRUE(metadata_item->GetString("title", &title)); | 172 EXPECT_TRUE(metadata_item->GetString("title", &title)); |
160 | 173 |
161 data_source->SetMetadata(std::move(metadata_list)); | 174 data_source->SetMetadata(std::move(metadata_list)); |
162 | 175 |
163 // Construct an AutocompleteInput representing a typical "zero-suggest" | 176 // Run the test with no text in the omnibox input to simulate NTP. |
164 // case. The provider will verify that the content of the omnibox input field | 177 provider_->Start(CreateInputForNTP(), false); |
165 // was not entered by the user. | |
166 std::string url("http://www.cnn.com/"); | |
167 const AutocompleteInput input(base::ASCIIToUTF16(url), base::string16::npos, | |
168 std::string(), GURL(url), metrics::OmniboxEventProto::OTHER, | |
169 true, false, true, true, true, TestSchemeClassifier()); | |
170 provider_->Start(input, false); | |
171 | 178 |
172 // Check that there is only one match item and its fields are correct. | 179 // Check that there is only one match item and its fields are correct. |
173 EXPECT_EQ(1U, provider_->matches().size()); | 180 EXPECT_EQ(1U, provider_->matches().size()); |
174 const AutocompleteMatch& metadata_match = provider_->matches().front(); | 181 const AutocompleteMatch& metadata_match = provider_->matches().front(); |
175 EXPECT_EQ(AutocompleteMatchType::PHYSICAL_WEB, metadata_match.type); | 182 EXPECT_EQ(AutocompleteMatchType::PHYSICAL_WEB, metadata_match.type); |
176 EXPECT_EQ(resolved_url, metadata_match.destination_url.spec()); | 183 EXPECT_EQ(resolved_url, metadata_match.destination_url.spec()); |
177 EXPECT_EQ(resolved_url, base::UTF16ToASCII(metadata_match.contents)); | 184 EXPECT_EQ(resolved_url, base::UTF16ToASCII(metadata_match.contents)); |
178 EXPECT_EQ(title, base::UTF16ToASCII(metadata_match.description)); | 185 EXPECT_EQ(title, base::UTF16ToASCII(metadata_match.description)); |
186 EXPECT_FALSE(metadata_match.allowed_to_be_default_match); | |
187 | |
188 // Run the test again with a URL in the omnibox input. An additional match | |
189 // should be added as a default match. | |
190 provider_->Start(CreateInputWithCurrentUrl("http://www.cnn.com"), false); | |
191 | |
192 size_t metadata_match_count = 0; | |
193 size_t default_match_count = 0; | |
194 for (size_t i = 0; i < provider_->matches().size(); i++) { | |
195 const AutocompleteMatch& match = provider_->matches()[i]; | |
196 if (match.type == AutocompleteMatchType::PHYSICAL_WEB) { | |
197 EXPECT_EQ(AutocompleteMatchType::PHYSICAL_WEB, match.type); | |
Mark P
2016/08/31 22:39:33
would it be easy (and correct) to make a copy of m
mattreynolds
2016/09/01 01:24:11
Unfortunately equality is not implemented for Auto
| |
198 EXPECT_EQ(resolved_url, match.destination_url.spec()); | |
199 EXPECT_EQ(resolved_url, base::UTF16ToASCII(match.contents)); | |
200 EXPECT_EQ(title, base::UTF16ToASCII(match.description)); | |
201 EXPECT_FALSE(match.allowed_to_be_default_match); | |
202 ++metadata_match_count; | |
203 } else { | |
204 EXPECT_TRUE(match.allowed_to_be_default_match); | |
205 ++default_match_count; | |
206 } | |
207 } | |
208 EXPECT_EQ(2U, provider_->matches().size()); | |
209 EXPECT_EQ(1U, metadata_match_count); | |
210 EXPECT_EQ(1U, default_match_count); | |
179 } | 211 } |
180 | 212 |
181 TEST_F(PhysicalWebProviderTest, TestManyMetadataItemsCreatesOverflowItem) { | 213 TEST_F(PhysicalWebProviderTest, TestManyMetadataItemsCreatesOverflowItem) { |
182 // This test is intended to verify that an overflow item is created when the | 214 // This test is intended to verify that an overflow item is created when the |
183 // number of nearby Physical Web URLs exceeds the maximum allowable matches | 215 // number of nearby Physical Web URLs exceeds the maximum allowable matches |
184 // for this provider. The actual limit for the PhysicalWebProvider may be | 216 // for this provider. The actual limit for the PhysicalWebProvider may be |
185 // changed in the future, so create enough metadata to exceed the | 217 // changed in the future, so create enough metadata to exceed the |
186 // AutocompleteProvider's limit. | 218 // AutocompleteProvider's limit. |
187 const size_t metadata_count = AutocompleteProvider::kMaxMatches + 1; | 219 const size_t metadata_count = AutocompleteProvider::kMaxMatches + 1; |
188 | 220 |
189 MockPhysicalWebDataSource* data_source = | 221 MockPhysicalWebDataSource* data_source = |
190 client_->GetMockPhysicalWebDataSource(); | 222 client_->GetMockPhysicalWebDataSource(); |
191 EXPECT_TRUE(data_source); | 223 EXPECT_TRUE(data_source); |
192 | 224 |
193 data_source->SetMetadata(CreateMetadata(metadata_count)); | 225 data_source->SetMetadata(CreateMetadata(metadata_count)); |
194 | 226 |
195 // Construct an AutocompleteInput representing a typical "zero-suggest" | 227 { |
196 // case. The provider will verify that the content of the omnibox input field | 228 // Run the test with no text in the omnibox input to simulate NTP. |
197 // was not entered by the user. | 229 provider_->Start(CreateInputForNTP(), false); |
198 std::string url("http://www.cnn.com/"); | |
199 const AutocompleteInput input(base::ASCIIToUTF16(url), base::string16::npos, | |
200 std::string(), GURL(url), metrics::OmniboxEventProto::OTHER, | |
201 true, false, true, true, true, TestSchemeClassifier()); | |
202 provider_->Start(input, false); | |
203 | 230 |
204 const size_t match_count = provider_->matches().size(); | 231 const size_t match_count = provider_->matches().size(); |
205 EXPECT_LT(match_count, metadata_count); | 232 EXPECT_LT(match_count, metadata_count); |
206 | 233 |
207 // Check that the overflow item is at the end of the match list and its fields | 234 // Check that the overflow item is present and its fields are correct. There |
208 // are correct. | 235 // may be additional match items, but none should be marked as default. |
209 const AutocompleteMatch& overflow_match = provider_->matches().back(); | 236 size_t overflow_match_count = 0; |
210 EXPECT_EQ(AutocompleteMatchType::PHYSICAL_WEB_OVERFLOW, overflow_match.type); | 237 for (size_t i = 0; i < match_count; i++) { |
211 EXPECT_EQ("chrome://physical-web/", overflow_match.destination_url.spec()); | 238 const AutocompleteMatch& match = provider_->matches()[i]; |
212 EXPECT_EQ("chrome://physical-web/", | 239 if (match.type == AutocompleteMatchType::PHYSICAL_WEB_OVERFLOW) { |
213 base::UTF16ToASCII(overflow_match.contents)); | 240 EXPECT_EQ(AutocompleteMatchType::PHYSICAL_WEB_OVERFLOW, match.type); |
Mark P
2016/08/31 22:39:33
Analogously, if AutocompletMatch equality is defin
| |
214 std::string description = l10n_util::GetPluralStringFUTF8( | 241 EXPECT_EQ("chrome://physical-web/", match.destination_url.spec()); |
215 IDS_PHYSICAL_WEB_OVERFLOW, metadata_count - match_count + 1); | 242 EXPECT_EQ("chrome://physical-web/", base::UTF16ToASCII(match.contents)); |
216 EXPECT_EQ(description, base::UTF16ToASCII(overflow_match.description)); | 243 const size_t metadata_matches = match_count - 1; |
244 std::string description = l10n_util::GetPluralStringFUTF8( | |
245 IDS_PHYSICAL_WEB_OVERFLOW, metadata_count - metadata_matches); | |
246 EXPECT_EQ(description, base::UTF16ToASCII(match.description)); | |
247 ++overflow_match_count; | |
248 } | |
249 EXPECT_FALSE(match.allowed_to_be_default_match); | |
250 } | |
251 EXPECT_EQ(1U, overflow_match_count); | |
252 } | |
253 | |
254 { | |
255 // Run the test again with a URL in the omnibox input. An additional match | |
256 // should be added as a default match. | |
257 provider_->Start(CreateInputWithCurrentUrl("http://www.cnn.com"), false); | |
258 | |
259 const size_t match_count = provider_->matches().size(); | |
260 EXPECT_LT(match_count - 1, metadata_count); | |
261 | |
262 // Check that the overflow item and default match are present and their | |
263 // fields are correct. | |
264 size_t overflow_match_count = 0; | |
265 size_t default_match_count = 0; | |
266 for (size_t i = 0; i < match_count; i++) { | |
267 const AutocompleteMatch& match = provider_->matches()[i]; | |
268 if (match.type == AutocompleteMatchType::PHYSICAL_WEB_OVERFLOW) { | |
269 EXPECT_EQ(AutocompleteMatchType::PHYSICAL_WEB_OVERFLOW, match.type); | |
270 EXPECT_EQ("chrome://physical-web/", match.destination_url.spec()); | |
271 EXPECT_EQ("chrome://physical-web/", base::UTF16ToASCII(match.contents)); | |
272 const size_t metadata_matches = match_count - 2; | |
273 std::string description = l10n_util::GetPluralStringFUTF8( | |
274 IDS_PHYSICAL_WEB_OVERFLOW, metadata_count - metadata_matches); | |
275 EXPECT_EQ(description, base::UTF16ToASCII(match.description)); | |
276 EXPECT_FALSE(match.allowed_to_be_default_match); | |
277 ++overflow_match_count; | |
278 } else if (match.allowed_to_be_default_match) { | |
279 ++default_match_count; | |
280 } | |
281 } | |
282 EXPECT_EQ(1U, overflow_match_count); | |
283 EXPECT_EQ(1U, default_match_count); | |
284 } | |
217 } | 285 } |
218 | 286 |
219 TEST_F(PhysicalWebProviderTest, TestNoMatchesWithUserInput) { | 287 TEST_F(PhysicalWebProviderTest, TestNoMatchesWithUserInput) { |
220 MockPhysicalWebDataSource* data_source = | 288 MockPhysicalWebDataSource* data_source = |
221 client_->GetMockPhysicalWebDataSource(); | 289 client_->GetMockPhysicalWebDataSource(); |
222 EXPECT_TRUE(data_source); | 290 EXPECT_TRUE(data_source); |
223 | 291 |
224 data_source->SetMetadata(CreateMetadata(1)); | 292 data_source->SetMetadata(CreateMetadata(1)); |
225 | 293 |
226 // Construct an AutocompleteInput to simulate user input in the omnibox input | 294 // Construct an AutocompleteInput to simulate user input in the omnibox input |
227 // field. The provider should not generate any matches. | 295 // field. The provider should not generate any matches. |
228 std::string text("user input"); | 296 std::string text("user input"); |
229 const AutocompleteInput input(base::ASCIIToUTF16(text), text.length(), | 297 const AutocompleteInput input(base::ASCIIToUTF16(text), text.length(), |
230 std::string(), GURL(), | 298 std::string(), GURL(), |
231 metrics::OmniboxEventProto::INSTANT_NTP_WITH_OMNIBOX_AS_STARTING_FOCUS, | 299 metrics::OmniboxEventProto::INSTANT_NTP_WITH_OMNIBOX_AS_STARTING_FOCUS, |
232 true, false, true, true, false, TestSchemeClassifier()); | 300 true, false, true, true, false, TestSchemeClassifier()); |
233 provider_->Start(input, false); | 301 provider_->Start(input, false); |
234 | 302 |
235 EXPECT_TRUE(provider_->matches().empty()); | 303 EXPECT_TRUE(provider_->matches().empty()); |
236 } | 304 } |
237 | 305 |
238 } | 306 } |
OLD | NEW |