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