app_search_provider_unittest.cc revision 3551c9c881056c480085172ff9840cab31610854
1// Copyright 2013 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 <string>
6
7#include "base/basictypes.h"
8#include "base/memory/scoped_ptr.h"
9#include "base/run_loop.h"
10#include "base/strings/utf_string_conversions.h"
11#include "chrome/browser/extensions/extension_service_unittest.h"
12#include "chrome/browser/ui/app_list/search/app_search_provider.h"
13#include "chrome/browser/ui/app_list/search/chrome_search_result.h"
14#include "chrome/test/base/testing_profile.h"
15#include "testing/gtest/include/gtest/gtest.h"
16
17namespace app_list {
18namespace test {
19
20const char kHostedAppId[] = "dceacbkfkmllgmjmbhgkpjegnodmildf";
21const char kPackagedApp1Id[] = "emfkafnhnpcmabnnkckkchdilgeoekbo";
22const char kPackagedApp2Id[] = "jlklkagmeajbjiobondfhiekepofmljl";
23
24class AppSearchProviderTest : public ExtensionServiceTestBase {
25 public:
26  AppSearchProviderTest() {}
27  virtual ~AppSearchProviderTest() {}
28
29  // ExtensionServiceTestBase overrides:
30  virtual void SetUp() OVERRIDE {
31    ExtensionServiceTestBase::SetUp();
32
33    // Load "app_list" extensions test profile.
34    // The test profile has 4 extensions:
35    // 1 dummy extension, 2 packaged extension apps and 1 hosted extension app.
36    base::FilePath source_install_dir = data_dir_
37        .AppendASCII("app_list")
38        .AppendASCII("Extensions");
39    base::FilePath pref_path = source_install_dir
40        .DirName()
41        .AppendASCII("Preferences");
42    InitializeInstalledExtensionService(pref_path, source_install_dir);
43    service_->Init();
44
45    // There should be 4 extensions in the test profile.
46    const ExtensionSet* extensions = service_->extensions();
47    ASSERT_EQ(static_cast<size_t>(4),  extensions->size());
48
49    app_search_.reset(new AppSearchProvider(profile_.get(), NULL));
50  }
51
52  std::string RunQuery(const std::string& query) {
53    app_search_->Start(UTF8ToUTF16(query));
54    app_search_->Stop();
55
56    std::string result_str;
57    const SearchProvider::Results& results = app_search_->results();
58    for (size_t i = 0; i < results.size(); ++i) {
59      if (!result_str.empty())
60        result_str += ',';
61
62      result_str += UTF16ToUTF8(results[i]->title());
63    }
64    return result_str;
65  }
66
67 private:
68  scoped_ptr<AppSearchProvider> app_search_;
69
70  DISALLOW_COPY_AND_ASSIGN(AppSearchProviderTest);
71};
72
73TEST_F(AppSearchProviderTest, Basic) {
74  EXPECT_EQ("", RunQuery(""));
75  EXPECT_EQ("", RunQuery("!@#$-,-_"));
76  EXPECT_EQ("", RunQuery("unmatched query"));
77
78  // Search for "pa" should return both packaged app. The order is undefined
79  // because the test only considers textual relevance and the two apps end
80  // up having the same score.
81  const std::string result = RunQuery("pa");
82  EXPECT_TRUE(result == "Packaged App 1,Packaged App 2" ||
83              result == "Packaged App 2,Packaged App 1");
84
85  EXPECT_EQ("Packaged App 1", RunQuery("pa1"));
86  EXPECT_EQ("Packaged App 2", RunQuery("pa2"));
87  EXPECT_EQ("Packaged App 1", RunQuery("app1"));
88  EXPECT_EQ("Hosted App", RunQuery("host"));
89}
90
91TEST_F(AppSearchProviderTest, DisableAndEnable) {
92  EXPECT_EQ("Hosted App", RunQuery("host"));
93
94  service_->DisableExtension(kHostedAppId,
95                             extensions::Extension::DISABLE_NONE);
96  EXPECT_EQ("Hosted App", RunQuery("host"));
97
98  service_->EnableExtension(kHostedAppId);
99  EXPECT_EQ("Hosted App", RunQuery("host"));
100}
101
102TEST_F(AppSearchProviderTest, Uninstall) {
103  EXPECT_EQ("Packaged App 1", RunQuery("pa1"));
104  service_->UninstallExtension(kPackagedApp1Id, false, NULL);
105  EXPECT_EQ("", RunQuery("pa1"));
106
107  // Let uninstall code to clean up.
108  base::RunLoop().RunUntilIdle();
109}
110
111}  // namespace test
112}  // namespace app_list
113