Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(798)

Side by Side Diff: components/omnibox/browser/physical_web_provider_unittest.cc

Issue 2266083002: Avoid DCHECK failure for chrome:// URLs in autocomplete suggestions (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: add missing default match check Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698