• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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