File: shortcuts_provider_test_util.cc

package info (click to toggle)
chromium 139.0.7258.138-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 6,120,676 kB
  • sloc: cpp: 35,100,869; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (143 lines) | stat: -rw-r--r-- 5,538 bytes parent folder | download | duplicates (6)
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;
  }
}