1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/autocomplete_input.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "components/metrics/proto/omnibox_event.pb.h"
126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "components/metrics/proto/omnibox_input_type.pb.h"
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/test_scheme_classifier.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/url_parse.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)using metrics::OmniboxEventProto;
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(AutocompleteInputTest, InputType) {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct test_data {
22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16 input;
236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const metrics::OmniboxInputType::Type type;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } input_cases[] = {
25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { base::string16(), metrics::OmniboxInputType::INVALID },
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("?"), metrics::OmniboxInputType::FORCED_QUERY },
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("?foo"), metrics::OmniboxInputType::FORCED_QUERY },
28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("?foo bar"), metrics::OmniboxInputType::FORCED_QUERY },
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    { ASCIIToUTF16("?http://foo.com/bar"),
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      metrics::OmniboxInputType::FORCED_QUERY },
31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("foo"), metrics::OmniboxInputType::UNKNOWN },
32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("localhost"), metrics::OmniboxInputType::URL },
33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("foo.c"), metrics::OmniboxInputType::UNKNOWN },
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("foo.com"), metrics::OmniboxInputType::URL },
35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("-foo.com"), metrics::OmniboxInputType::URL },
36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("foo-.com"), metrics::OmniboxInputType::URL },
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("foo_.com"), metrics::OmniboxInputType::UNKNOWN },
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("foo.-com"), metrics::OmniboxInputType::QUERY },
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("foo/"), metrics::OmniboxInputType::URL },
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("foo/bar"), metrics::OmniboxInputType::UNKNOWN },
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("foo/bar%00"), metrics::OmniboxInputType::QUERY },
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("foo/bar/"), metrics::OmniboxInputType::URL },
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("foo/bar baz\\"), metrics::OmniboxInputType::URL },
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("foo.com/bar"), metrics::OmniboxInputType::URL },
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("foo;bar"), metrics::OmniboxInputType::UNKNOWN },
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("foo/bar baz"), metrics::OmniboxInputType::UNKNOWN },
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("foo bar.com"), metrics::OmniboxInputType::QUERY },
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("foo bar"), metrics::OmniboxInputType::QUERY },
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("foo+bar"), metrics::OmniboxInputType::QUERY },
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("foo+bar.com"), metrics::OmniboxInputType::UNKNOWN },
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("\"foo:bar\""), metrics::OmniboxInputType::QUERY },
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("link:foo.com"), metrics::OmniboxInputType::UNKNOWN },
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("foo:81"), metrics::OmniboxInputType::URL },
54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("localhost:8080"), metrics::OmniboxInputType::URL },
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("www.foo.com:81"), metrics::OmniboxInputType::URL },
56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("foo.com:123456"), metrics::OmniboxInputType::QUERY },
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("foo.com:abc"), metrics::OmniboxInputType::QUERY },
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("1.2.3.4:abc"), metrics::OmniboxInputType::QUERY },
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("user@foo.com"), metrics::OmniboxInputType::UNKNOWN },
60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("user@foo/z"), metrics::OmniboxInputType::URL },
61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("user@foo/z z"), metrics::OmniboxInputType::URL },
62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("user@foo.com/z"), metrics::OmniboxInputType::URL },
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("user:pass@"), metrics::OmniboxInputType::UNKNOWN },
64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("user:pass@!foo.com"), metrics::OmniboxInputType::UNKNOWN },
65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("user:pass@foo"), metrics::OmniboxInputType::URL },
66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("user:pass@foo.c"), metrics::OmniboxInputType::URL },
67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("user:pass@foo.com"), metrics::OmniboxInputType::URL },
68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("user:pass@foo.com:81"), metrics::OmniboxInputType::URL },
69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("user:pass@foo:81"), metrics::OmniboxInputType::URL },
70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("1.2"), metrics::OmniboxInputType::UNKNOWN },
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("1.2/45"), metrics::OmniboxInputType::UNKNOWN },
72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("1.2:45"), metrics::OmniboxInputType::UNKNOWN },
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("user@1.2:45"), metrics::OmniboxInputType::URL },
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("user@foo:45"), metrics::OmniboxInputType::URL },
75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("user:pass@1.2:45"), metrics::OmniboxInputType::URL },
76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("host?query"), metrics::OmniboxInputType::UNKNOWN },
77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("host#ref"), metrics::OmniboxInputType::UNKNOWN },
78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("host/path?query"), metrics::OmniboxInputType::URL },
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("host/path#ref"), metrics::OmniboxInputType::URL },
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("en.wikipedia.org/wiki/Jim Beam"),
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      metrics::OmniboxInputType::URL },
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // In Chrome itself, mailto: will get handled by ShellExecute, but in
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // unittest mode, we don't have the data loaded in the external protocol
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // handler to know this.
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    // { ASCIIToUTF16("mailto:abuse@foo.com"), metrics::OmniboxInputType::URL },
86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("view-source:http://www.foo.com/"),
87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      metrics::OmniboxInputType::URL },
88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("javascript:alert(\"Hi there\");"),
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      metrics::OmniboxInputType::URL },
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("C:\\Program Files"), metrics::OmniboxInputType::URL },
92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("\\\\Server\\Folder\\File"),
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      metrics::OmniboxInputType::URL },
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_WIN)
95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("http:foo"), metrics::OmniboxInputType::URL },
96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("http://foo"), metrics::OmniboxInputType::URL },
97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("http://foo.c"), metrics::OmniboxInputType::URL },
98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("http://foo.com"), metrics::OmniboxInputType::URL },
99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("http://foo_bar.com"), metrics::OmniboxInputType::URL },
100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("http://foo/bar%00"), metrics::OmniboxInputType::QUERY },
101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("http://foo/bar baz"), metrics::OmniboxInputType::URL },
102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("http://-foo.com"), metrics::OmniboxInputType::URL },
103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("http://foo-.com"), metrics::OmniboxInputType::URL },
104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("http://foo_.com"), metrics::OmniboxInputType::UNKNOWN },
105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("http://foo.-com"), metrics::OmniboxInputType::UNKNOWN },
106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("http://_foo_.com"), metrics::OmniboxInputType::UNKNOWN },
107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("http://foo.com:abc"), metrics::OmniboxInputType::QUERY },
108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("http://foo.com:123456"), metrics::OmniboxInputType::QUERY },
109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("http://1.2.3.4:abc"), metrics::OmniboxInputType::QUERY },
110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("http:user@foo.com"), metrics::OmniboxInputType::URL },
111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("http://user@foo.com"), metrics::OmniboxInputType::URL },
112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("http:user:pass@foo.com"), metrics::OmniboxInputType::URL },
113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("http://user:pass@foo.com"),
114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      metrics::OmniboxInputType::URL },
115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("http://1.2"), metrics::OmniboxInputType::URL },
116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("http://1.2/45"), metrics::OmniboxInputType::URL },
117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("http:ps/2 games"), metrics::OmniboxInputType::URL },
118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("https://foo.com"), metrics::OmniboxInputType::URL },
119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("127.0.0.1"), metrics::OmniboxInputType::URL },
120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("127.0.1"), metrics::OmniboxInputType::UNKNOWN },
121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("127.0.1/"), metrics::OmniboxInputType::URL },
122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("browser.tabs.closeButtons"),
123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      metrics::OmniboxInputType::UNKNOWN },
124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { base::WideToUTF16(L"\u6d4b\u8bd5"), metrics::OmniboxInputType::UNKNOWN },
125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("[2001:]"), metrics::OmniboxInputType::QUERY },
126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("[2001:dB8::1]"), metrics::OmniboxInputType::URL },
127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("192.168.0.256"), metrics::OmniboxInputType::QUERY },
128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("[foo.com]"), metrics::OmniboxInputType::QUERY },
129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("filesystem:http://a.com/t/bar"),
130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      metrics::OmniboxInputType::URL },
131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("filesystem:http://a.com/"),
132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      metrics::OmniboxInputType::QUERY },
133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("filesystem:file://"), metrics::OmniboxInputType::QUERY },
134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("filesystem:http"), metrics::OmniboxInputType::QUERY },
135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("filesystem:"), metrics::OmniboxInputType::QUERY },
136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("chrome-search://"), metrics::OmniboxInputType::QUERY },
137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("chrome-devtools:"), metrics::OmniboxInputType::QUERY },
138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("about://f;"), metrics::OmniboxInputType::QUERY },
139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("://w"), metrics::OmniboxInputType::QUERY },
140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16(":w"), metrics::OmniboxInputType::QUERY },
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(input_cases); ++i) {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE(input_cases[i].input);
145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    AutocompleteInput input(input_cases[i].input, base::string16::npos,
146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            base::string16(), GURL(),
1476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                            OmniboxEventProto::INVALID_SPEC, true, false, true,
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            true, TestSchemeClassifier());
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(input_cases[i].type, input.type());
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(AutocompleteInputTest, InputTypeWithDesiredTLD) {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct test_data {
155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16 input;
1566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const metrics::OmniboxInputType::Type type;
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string spec;  // Unused if not a URL.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } input_cases[] = {
159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("401k"), metrics::OmniboxInputType::URL,
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        std::string("http://www.401k.com/") },
161f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("999999999999999"), metrics::OmniboxInputType::URL,
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        std::string("http://www.999999999999999.com/") },
163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("x@y"), metrics::OmniboxInputType::URL,
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        std::string("http://x@www.y.com/") },
165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("y/z z"), metrics::OmniboxInputType::URL,
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        std::string("http://www.y.com/z%20z") },
167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("abc.com"), metrics::OmniboxInputType::URL,
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        std::string("http://abc.com/") },
169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { ASCIIToUTF16("foo bar"), metrics::OmniboxInputType::QUERY,
170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        std::string() },
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(input_cases); ++i) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE(input_cases[i].input);
175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    AutocompleteInput input(input_cases[i].input, base::string16::npos,
176d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                            ASCIIToUTF16("com"), GURL(),
1776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                            OmniboxEventProto::INVALID_SPEC, true, false, true,
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            true, TestSchemeClassifier());
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(input_cases[i].type, input.type());
180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (input_cases[i].type == metrics::OmniboxInputType::URL)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(input_cases[i].spec, input.canonicalized_url().spec());
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests for a regression where certain input in the omnibox caused us to
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// crash. As long as the test completes without crashing, we're fine.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(AutocompleteInputTest, InputCrash) {
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AutocompleteInput input(base::WideToUTF16(L"\uff65@s"), base::string16::npos,
189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                          base::string16(), GURL(),
1906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                          OmniboxEventProto::INVALID_SPEC, true, false,
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          true, true, TestSchemeClassifier());
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(AutocompleteInputTest, ParseForEmphasizeComponent) {
1955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  using url::Component;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Component kInvalidComponent(0, -1);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct test_data {
198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16 input;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Component scheme;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Component host;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } input_cases[] = {
202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    { base::string16(), kInvalidComponent, kInvalidComponent },
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { ASCIIToUTF16("?"), kInvalidComponent, kInvalidComponent },
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { ASCIIToUTF16("?http://foo.com/bar"), kInvalidComponent,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kInvalidComponent },
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { ASCIIToUTF16("foo/bar baz"), kInvalidComponent, Component(0, 3) },
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { ASCIIToUTF16("http://foo/bar baz"), Component(0, 4), Component(7, 3) },
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { ASCIIToUTF16("link:foo.com"), Component(0, 4), kInvalidComponent },
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { ASCIIToUTF16("www.foo.com:81"), kInvalidComponent, Component(0, 11) },
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    { base::WideToUTF16(L"\u6d4b\u8bd5"), kInvalidComponent, Component(0, 2) },
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { ASCIIToUTF16("view-source:http://www.foo.com/"), Component(12, 4),
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Component(19, 11) },
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { ASCIIToUTF16("view-source:https://example.com/"),
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Component(12, 5), Component(20, 11) },
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { ASCIIToUTF16("view-source:www.foo.com"), kInvalidComponent,
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Component(12, 11) },
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { ASCIIToUTF16("view-source:"), Component(0, 11), kInvalidComponent },
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { ASCIIToUTF16("view-source:garbage"), kInvalidComponent,
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Component(12, 7) },
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { ASCIIToUTF16("view-source:http://http://foo"), Component(12, 4),
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Component(19, 4) },
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { ASCIIToUTF16("view-source:view-source:http://example.com/"),
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Component(12, 11), kInvalidComponent }
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(input_cases); ++i) {
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE(input_cases[i].input);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Component scheme, host;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutocompleteInput::ParseForEmphasizeComponents(input_cases[i].input,
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                   TestSchemeClassifier(),
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   &scheme,
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   &host);
233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    AutocompleteInput input(input_cases[i].input, base::string16::npos,
234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            base::string16(), GURL(),
2356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                            OmniboxEventProto::INVALID_SPEC, true,
236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            false, true, true, TestSchemeClassifier());
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(input_cases[i].scheme.begin, scheme.begin);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(input_cases[i].scheme.len, scheme.len);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(input_cases[i].host.begin, host.begin);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(input_cases[i].host.len, host.len);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(AutocompleteInputTest, InputTypeWithCursorPosition) {
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct test_data {
246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16 input;
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size_t cursor_position;
248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16 normalized_input;
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size_t normalized_cursor_position;
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } input_cases[] = {
251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    { ASCIIToUTF16("foo bar"), base::string16::npos,
252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      ASCIIToUTF16("foo bar"), base::string16::npos },
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // regular case, no changes.
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ASCIIToUTF16("foo bar"), 3, ASCIIToUTF16("foo bar"), 3 },
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // extra leading space.
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ASCIIToUTF16("  foo bar"), 3, ASCIIToUTF16("foo bar"), 1 },
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ASCIIToUTF16("      foo bar"), 3, ASCIIToUTF16("foo bar"), 0 },
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ASCIIToUTF16("      foo bar   "), 2, ASCIIToUTF16("foo bar   "), 0 },
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // forced query.
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ASCIIToUTF16("?foo bar"), 2, ASCIIToUTF16("foo bar"), 1 },
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ASCIIToUTF16("  ?foo bar"), 4, ASCIIToUTF16("foo bar"), 1 },
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ASCIIToUTF16("?  foo bar"), 4, ASCIIToUTF16("foo bar"), 1 },
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ASCIIToUTF16("  ?  foo bar"), 6, ASCIIToUTF16("foo bar"), 1 },
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(input_cases); ++i) {
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SCOPED_TRACE(input_cases[i].input);
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AutocompleteInput input(input_cases[i].input,
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            input_cases[i].cursor_position,
273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            base::string16(), GURL(),
2746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                            OmniboxEventProto::INVALID_SPEC,
275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            true, false, true, true, TestSchemeClassifier());
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(input_cases[i].normalized_input, input.text());
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(input_cases[i].normalized_cursor_position,
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              input.cursor_position());
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
281