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.
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/common/chrome_constants.h"
15 #include "chrome/test/base/testing_profile.h"
16 #include "extensions/browser/extension_prefs.h"
17 #include "extensions/browser/uninstall_reason.h"
18 #include "extensions/common/extension_set.h"
19 #include "testing/gtest/include/gtest/gtest.h"
20 #include "ui/app_list/search_result.h"
25 const base::Time kTestCurrentTime = base::Time::FromInternalValue(1000);
27 bool MoreRelevant(const SearchResult* result1, const SearchResult* result2) {
28 return result1->relevance() > result2->relevance();
31 class AppSearchProviderTest : public AppListTestBase {
33 AppSearchProviderTest() {}
34 ~AppSearchProviderTest() override {}
36 // AppListTestBase overrides:
37 void SetUp() override {
38 AppListTestBase::SetUp();
40 app_search_.reset(new AppSearchProvider(profile_.get(), NULL));
43 std::string RunQuery(const std::string& query) {
44 app_search_->StartImpl(kTestCurrentTime, base::UTF8ToUTF16(query));
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);
53 std::string result_str;
54 for (size_t i = 0; i < sorted_results.size(); ++i) {
55 if (!result_str.empty())
58 result_str += base::UTF16ToUTF8(sorted_results[i]->title());
64 scoped_ptr<AppSearchProvider> app_search_;
66 DISALLOW_COPY_AND_ASSIGN(AppSearchProviderTest);
69 TEST_F(AppSearchProviderTest, Basic) {
70 EXPECT_EQ("", RunQuery("!@#$-,-_"));
71 EXPECT_EQ("", RunQuery("unmatched query"));
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");
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"));
86 TEST_F(AppSearchProviderTest, DisableAndEnable) {
87 EXPECT_EQ("Hosted App", RunQuery("host"));
89 service_->DisableExtension(kHostedAppId,
90 extensions::Extension::DISABLE_NONE);
91 EXPECT_EQ("Hosted App", RunQuery("host"));
93 service_->EnableExtension(kHostedAppId);
94 EXPECT_EQ("Hosted App", RunQuery("host"));
97 TEST_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),
103 EXPECT_EQ("", RunQuery("pa1"));
105 // Let uninstall code to clean up.
106 base::RunLoop().RunUntilIdle();
109 TEST_F(AppSearchProviderTest, FetchRecommendations) {
110 extensions::ExtensionPrefs* prefs =
111 extensions::ExtensionPrefs::Get(profile_.get());
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(""));
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(""));
125 } // namespace app_list