1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/basictypes.h"
6 #include "base/message_loop.h"
7 #include "base/utf_string_conversions.h"
8 #include "chrome/test/testing_browser_process_test.h"
9 #include "chrome/browser/autocomplete/autocomplete_match.h"
10 #include "chrome/browser/autocomplete/extension_app_provider.h"
11 #include "chrome/browser/history/history.h"
12 #include "chrome/browser/history/url_database.h"
13 #include "chrome/test/testing_profile.h"
14
15 class ExtensionAppProviderTest : public TestingBrowserProcessTest {
16 protected:
17 struct test_data {
18 const string16 input;
19 const size_t num_results;
20 const GURL output[3];
21 };
22
ExtensionAppProviderTest()23 ExtensionAppProviderTest() : history_service_(NULL) { }
~ExtensionAppProviderTest()24 virtual ~ExtensionAppProviderTest() { }
25
26 virtual void SetUp() OVERRIDE;
27
28 void RunTest(test_data* keyword_cases,
29 int num_cases);
30
31 protected:
32 MessageLoopForUI message_loop_;
33 scoped_refptr<ExtensionAppProvider> app_provider_;
34 scoped_ptr<TestingProfile> profile_;
35 HistoryService* history_service_;
36 };
37
SetUp()38 void ExtensionAppProviderTest::SetUp() {
39 profile_.reset(new TestingProfile());
40 profile_->CreateHistoryService(true, false);
41 profile_->BlockUntilHistoryProcessesPendingRequests();
42 history_service_ = profile_->GetHistoryService(Profile::EXPLICIT_ACCESS);
43
44 app_provider_ = new ExtensionAppProvider(NULL, profile_.get());
45
46 struct ExtensionApps {
47 std::string app_name;
48 std::string url;
49 std::string title;
50 int typed_count;
51 } kExtensionApps[] = {
52 {"COYB", "http://asdf/", "COYB", 7},
53 {"NSNO", "http://fdsa/", "NSNO", 2},
54 };
55
56 history::URLDatabase* url_db = history_service_->InMemoryDatabase();
57
58 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kExtensionApps); ++i) {
59 // Populate the Extension Apps list.
60 app_provider_->AddExtensionAppForTesting(kExtensionApps[i].app_name,
61 kExtensionApps[i].url);
62
63 // Populate the InMemoryDatabase.
64 history::URLRow info(GURL(kExtensionApps[i].url));
65 info.set_title(UTF8ToUTF16(kExtensionApps[i].title));
66 info.set_typed_count(kExtensionApps[i].typed_count);
67 url_db->AddURL(info);
68 }
69 }
70
RunTest(test_data * keyword_cases,int num_cases)71 void ExtensionAppProviderTest::RunTest(
72 test_data* keyword_cases,
73 int num_cases) {
74 ACMatches matches;
75 for (int i = 0; i < num_cases; ++i) {
76 AutocompleteInput input(keyword_cases[i].input, string16(), true,
77 false, true, AutocompleteInput::ALL_MATCHES);
78 app_provider_->Start(input, false);
79 EXPECT_TRUE(app_provider_->done());
80 matches = app_provider_->matches();
81 EXPECT_EQ(keyword_cases[i].num_results, matches.size())
82 << ASCIIToUTF16("Input was: ") + keyword_cases[i].input;
83 if (matches.size() == keyword_cases[i].num_results) {
84 for (size_t j = 0; j < keyword_cases[i].num_results; ++j)
85 EXPECT_EQ(keyword_cases[i].output[j], matches[j].destination_url);
86 }
87 }
88 }
89
TEST_F(ExtensionAppProviderTest,BasicMatching)90 TEST_F(ExtensionAppProviderTest, BasicMatching) {
91 test_data edit_cases[] = {
92 // Searching for a nonexistent value should give nothing.
93 {ASCIIToUTF16("Not Found"), 0, { GURL() }},
94
95 // The letter 'o' appears in both extension apps.
96 {ASCIIToUTF16("o"), 2, { GURL("http://asdf/"),
97 GURL("http://fdsa/") }},
98 // The string 'co' appears in one extension app.
99 {ASCIIToUTF16("co"), 1, { GURL("http://asdf/") }},
100 // Try with URL matching.
101 {ASCIIToUTF16("http://asdf/"), 1, { GURL("http://asdf/") }},
102 {ASCIIToUTF16("http://fdsa/"), 1, { GURL("http://fdsa/") }},
103 };
104
105 RunTest(edit_cases, ARRAYSIZE_UNSAFE(edit_cases));
106 }
107