app_search_provider_unittest.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
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.h"
12#include "chrome/browser/ui/app_list/app_list_test_util.h"
13#include "chrome/browser/ui/app_list/search/app_search_provider.h"
14#include "chrome/browser/ui/app_list/search/chrome_search_result.h"
15#include "chrome/common/chrome_constants.h"
16#include "chrome/test/base/testing_profile.h"
17#include "extensions/browser/extension_prefs.h"
18#include "extensions/browser/uninstall_reason.h"
19#include "extensions/common/extension_set.h"
20#include "testing/gtest/include/gtest/gtest.h"
21
22namespace app_list {
23namespace test {
24
25const base::Time kTestCurrentTime = base::Time::FromInternalValue(1000);
26
27bool MoreRelevant(const SearchResult* result1, const SearchResult* result2) {
28  return result1->relevance() > result2->relevance();
29}
30
31class AppSearchProviderTest : public AppListTestBase {
32 public:
33  AppSearchProviderTest() {}
34  virtual ~AppSearchProviderTest() {}
35
36  // AppListTestBase overrides:
37  virtual void SetUp() OVERRIDE {
38    AppListTestBase::SetUp();
39
40    app_search_.reset(new AppSearchProvider(profile_.get(), NULL));
41  }
42
43  std::string RunQuery(const std::string& query) {
44    app_search_->StartImpl(kTestCurrentTime, base::UTF8ToUTF16(query));
45
46    // Sort results by relevance.
47    std::vector<SearchResult*> sorted_results;
48    std::copy(app_search_->results().begin(),
49              app_search_->results().end(),
50              std::back_inserter(sorted_results));
51    std::sort(sorted_results.begin(), sorted_results.end(), &MoreRelevant);
52
53    std::string result_str;
54    for (size_t i = 0; i < sorted_results.size(); ++i) {
55      if (!result_str.empty())
56        result_str += ',';
57
58      result_str += base::UTF16ToUTF8(sorted_results[i]->title());
59    }
60    return result_str;
61  }
62
63 private:
64  scoped_ptr<AppSearchProvider> app_search_;
65
66  DISALLOW_COPY_AND_ASSIGN(AppSearchProviderTest);
67};
68
69TEST_F(AppSearchProviderTest, Basic) {
70  EXPECT_EQ("", RunQuery("!@#$-,-_"));
71  EXPECT_EQ("", RunQuery("unmatched query"));
72
73  // Search for "pa" should return both packaged app. The order is undefined
74  // because the test only considers textual relevance and the two apps end
75  // up having the same score.
76  const std::string result = RunQuery("pa");
77  EXPECT_TRUE(result == "Packaged App 1,Packaged App 2" ||
78              result == "Packaged App 2,Packaged App 1");
79
80  EXPECT_EQ("Packaged App 1", RunQuery("pa1"));
81  EXPECT_EQ("Packaged App 2", RunQuery("pa2"));
82  EXPECT_EQ("Packaged App 1", RunQuery("app1"));
83  EXPECT_EQ("Hosted App", RunQuery("host"));
84}
85
86TEST_F(AppSearchProviderTest, DisableAndEnable) {
87  EXPECT_EQ("Hosted App", RunQuery("host"));
88
89  service_->DisableExtension(kHostedAppId,
90                             extensions::Extension::DISABLE_NONE);
91  EXPECT_EQ("Hosted App", RunQuery("host"));
92
93  service_->EnableExtension(kHostedAppId);
94  EXPECT_EQ("Hosted App", RunQuery("host"));
95}
96
97TEST_F(AppSearchProviderTest, Uninstall) {
98  EXPECT_EQ("Packaged App 1", RunQuery("pa1"));
99  service_->UninstallExtension(kPackagedApp1Id,
100                               extensions::UNINSTALL_REASON_FOR_TESTING,
101                               base::Bind(&base::DoNothing),
102                               NULL);
103  EXPECT_EQ("", RunQuery("pa1"));
104
105  // Let uninstall code to clean up.
106  base::RunLoop().RunUntilIdle();
107}
108
109TEST_F(AppSearchProviderTest, FetchRecommendations) {
110  extensions::ExtensionPrefs* prefs =
111      extensions::ExtensionPrefs::Get(profile_.get());
112
113  prefs->SetLastLaunchTime(kHostedAppId, base::Time::FromInternalValue(20));
114  prefs->SetLastLaunchTime(kPackagedApp1Id, base::Time::FromInternalValue(10));
115  prefs->SetLastLaunchTime(kPackagedApp2Id, base::Time::FromInternalValue(0));
116  EXPECT_EQ("Hosted App,Packaged App 1,Packaged App 2", RunQuery(""));
117
118  prefs->SetLastLaunchTime(kHostedAppId, base::Time::FromInternalValue(0));
119  prefs->SetLastLaunchTime(kPackagedApp1Id, base::Time::FromInternalValue(10));
120  prefs->SetLastLaunchTime(kPackagedApp2Id, base::Time::FromInternalValue(20));
121  EXPECT_EQ("Packaged App 2,Packaged App 1,Hosted App", RunQuery(""));
122}
123
124}  // namespace test
125}  // namespace app_list
126