1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifdef UNSAFE_BUFFERS_BUILD
// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
#pragma allow_unsafe_buffers
#endif
#include "components/omnibox/browser/shortcuts_provider_test_util.h"
#include <algorithm>
#include "base/run_loop.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "components/omnibox/browser/autocomplete_match.h"
#include "components/omnibox/browser/shortcuts_backend.h"
#include "components/omnibox/browser/shortcuts_provider.h"
#include "components/omnibox/browser/test_scheme_classifier.h"
#include "testing/gtest/include/gtest/gtest.h"
TestShortcutData::TestShortcutData(
std::string guid,
std::string text,
std::string fill_into_edit,
std::string destination_url,
AutocompleteMatch::DocumentType document_type,
std::string contents,
std::string contents_class,
std::string description,
std::string description_class,
ui::PageTransition transition,
AutocompleteMatch::Type type,
std::string keyword,
int days_from_now,
int number_of_hits) {
this->guid = guid;
this->text = text;
this->fill_into_edit = fill_into_edit;
this->destination_url = destination_url;
this->document_type = document_type;
this->contents = contents;
this->contents_class = contents_class;
this->description = description;
this->description_class = description_class;
this->transition = transition;
this->type = type;
this->keyword = keyword;
this->days_from_now = days_from_now;
this->number_of_hits = number_of_hits;
}
TestShortcutData::~TestShortcutData() = default;
void PopulateShortcutsBackendWithTestData(
scoped_refptr<ShortcutsBackend> backend,
TestShortcutData* db,
size_t db_size) {
size_t expected_size = backend->shortcuts_map().size() + db_size;
for (size_t i = 0; i < db_size; ++i) {
const TestShortcutData& cur = db[i];
ShortcutsDatabase::Shortcut shortcut(
cur.guid, base::ASCIIToUTF16(cur.text),
ShortcutsDatabase::Shortcut::MatchCore(
base::ASCIIToUTF16(cur.fill_into_edit), GURL(cur.destination_url),
cur.document_type, base::ASCIIToUTF16(cur.contents),
cur.contents_class, base::ASCIIToUTF16(cur.description),
cur.description_class, cur.transition, cur.type,
base::ASCIIToUTF16(cur.keyword)),
base::Time::Now() - base::Days(cur.days_from_now), cur.number_of_hits);
backend->AddShortcut(shortcut);
}
EXPECT_EQ(expected_size, backend->shortcuts_map().size());
}
void RunShortcutsProviderTest(
scoped_refptr<ShortcutsProvider> provider,
const std::u16string text,
bool prevent_inline_autocomplete,
const std::vector<ExpectedURLAndAllowedToBeDefault>& expected_urls,
std::string expected_top_result,
std::u16string top_result_inline_autocompletion) {
AutocompleteInput input(text, metrics::OmniboxEventProto::OTHER,
TestSchemeClassifier());
input.set_prevent_inline_autocomplete(prevent_inline_autocomplete);
RunShortcutsProviderTest(provider, input, expected_urls, expected_top_result,
top_result_inline_autocompletion);
}
void RunShortcutsProviderTest(
scoped_refptr<ShortcutsProvider> provider,
const AutocompleteInput& input,
const std::vector<ExpectedURLAndAllowedToBeDefault>& expected_urls,
std::string expected_top_result,
std::u16string top_result_inline_autocompletion) {
base::RunLoop().RunUntilIdle();
provider->Start(input, false);
EXPECT_TRUE(provider->done());
ACMatches ac_matches = provider->matches();
std::string debug =
base::StringPrintf("Input [%s], prevent inline [%d], matches:\n",
base::UTF16ToUTF8(input.text()).c_str(),
input.prevent_inline_autocomplete());
for (auto match : ac_matches) {
debug += base::StringPrintf(" URL [%s], default [%d]\n",
match.destination_url.spec().c_str(),
match.allowed_to_be_default_match);
}
// We should have gotten back at most
// AutocompleteProvider::provider_max_matches().
EXPECT_LE(ac_matches.size(), provider->provider_max_matches()) << debug;
// If the number of expected and actual matches aren't equal then we need
// test no further, but let's do anyway so that we know which URLs failed.
EXPECT_EQ(expected_urls.size(), ac_matches.size()) << debug;
for (const auto& expected_url : expected_urls) {
EXPECT_TRUE(std::ranges::any_of(
ac_matches,
[&expected_url](const AutocompleteMatch& match) {
return expected_url.first == match.destination_url.spec() &&
expected_url.second == match.allowed_to_be_default_match;
}))
<< debug
<< base::StringPrintf("Expected URL [%s], default [%d]\n",
expected_url.first.c_str(), expected_url.second);
}
// See if we got the expected top scorer.
if (!ac_matches.empty()) {
std::partial_sort(ac_matches.begin(), ac_matches.begin() + 1,
ac_matches.end(), AutocompleteMatch::MoreRelevant);
EXPECT_EQ(expected_top_result, ac_matches[0].destination_url.spec())
<< debug;
EXPECT_EQ(top_result_inline_autocompletion,
ac_matches[0].inline_autocompletion)
<< debug;
}
}
|