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