mixer_unittest.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2013 The Chromium Authors. All rights reserved. 2a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// found in the LICENSE file. 4a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <string> 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/scoped_vector.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/strings/string16.h" 9a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "base/strings/stringprintf.h" 106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/browser/ui/app_list/search/chrome_search_result.h" 12a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chrome/browser/ui/app_list/search/history_types.h" 13a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chrome/browser/ui/app_list/search/mixer.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/app_list/app_list_model.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/app_list/search_provider.h" 17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace app_list { 193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace test { 20a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass TestSearchResult : public ChromeSearchResult { 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TestSearchResult(const std::string& id, double relevance) { 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci set_id(id); 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci set_title(base::UTF8ToUTF16(id)); 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci set_relevance(relevance); 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~TestSearchResult() {} 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // ChromeSearchResult overides: 32a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void Open(int event_flags) OVERRIDE {} 33a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void InvokeAction(int action_index, int event_flags) OVERRIDE {} 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual scoped_ptr<ChromeSearchResult> Duplicate() OVERRIDE { 35a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return scoped_ptr<ChromeSearchResult>( 36a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) new TestSearchResult(id(), relevance())).Pass(); 37a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 38a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual ChromeSearchResultType GetType() OVERRIDE { 39a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return SEARCH_RESULT_TYPE_BOUNDARY; 40a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 41a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(TestSearchResult); 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 44a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class TestSearchProvider : public SearchProvider { 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) explicit TestSearchProvider(const std::string& prefix) 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : prefix_(prefix), 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) count_(0) {} 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual ~TestSearchProvider() {} 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // SearchProvider overrides: 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void Start(const base::string16& query) OVERRIDE { 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ClearResults(); 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for (size_t i = 0; i < count_; ++i) { 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string id = 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::StringPrintf("%s%d", prefix_.c_str(), static_cast<int>(i)); 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const double relevance = 1.0 - i / 10.0; 59a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) Add(scoped_ptr<SearchResult>(new TestSearchResult(id, relevance)).Pass()); 604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void Stop() OVERRIDE {} 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void set_prefix(const std::string& prefix) { prefix_ = prefix; } 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void set_count(size_t count) { count_ = count; } 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string prefix_; 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t count_; 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 71a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestSearchProvider); 72a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}; 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class MixerTest : public testing::Test { 75a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) public: 76a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) MixerTest() {} 77a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual ~MixerTest() {} 78a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // testing::Test overrides: 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void SetUp() OVERRIDE { 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci results_.reset(new AppListModel::SearchResults); 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) providers_.push_back(new TestSearchProvider("app")); 84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch providers_.push_back(new TestSearchProvider("omnibox")); 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) providers_.push_back(new TestSearchProvider("webstore")); 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) providers_.push_back(new TestSearchProvider("people")); 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mixer_.reset(new Mixer(results_.get())); 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mixer_->Init(); 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mixer_->AddProviderToGroup(Mixer::MAIN_GROUP, providers_[0]); 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mixer_->AddProviderToGroup(Mixer::OMNIBOX_GROUP, providers_[1]); 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mixer_->AddProviderToGroup(Mixer::WEBSTORE_GROUP, providers_[2]); 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mixer_->AddProviderToGroup(Mixer::PEOPLE_GROUP, providers_[3]); 94a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 95a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 96a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) void RunQuery() { 97a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const base::string16 query; 98a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (size_t i = 0; i < providers_.size(); ++i) { 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci providers_[i]->Start(query); 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci providers_[i]->Stop(); 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mixer_->MixAndPublish(KnownResults()); 105a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 106a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 107a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) std::string GetResults() const { 108a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) std::string result; 109a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) for (size_t i = 0; i < results_->item_count(); ++i) { 110a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!result.empty()) 111a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) result += ','; 112a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 113a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) result += base::UTF16ToUTF8(results_->GetItemAt(i)->title()); 114a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result; 117a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 118a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 119a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) Mixer* mixer() { return mixer_.get(); } 120a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) TestSearchProvider* app_provider() { return providers_[0]; } 121a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) TestSearchProvider* omnibox_provider() { return providers_[1]; } 122a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) TestSearchProvider* webstore_provider() { return providers_[2]; } 123a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 124a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) private: 125a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scoped_ptr<Mixer> mixer_; 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<AppListModel::SearchResults> results_; 127a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 128a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ScopedVector<TestSearchProvider> providers_; 129a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 130a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MixerTest); 131a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}; 132a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 133a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(MixerTest, Basic) { 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci struct TestCase { 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const size_t app_results; 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const size_t omnibox_results; 137a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const size_t webstore_results; 138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const char* expected; 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } kTestCases[] = { 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {0, 0, 0, ""}, 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {4, 6, 2, "app0,app1,app2,app3,omnibox0,webstore0"}, 142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {10, 10, 10, "app0,app1,app2,app3,omnibox0,webstore0"}, 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {0, 10, 0, "omnibox0,omnibox1,omnibox2,omnibox3,omnibox4,omnibox5"}, 144a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) {0, 10, 1, "omnibox0,omnibox1,omnibox2,omnibox3,omnibox4,webstore0"}, 145a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) {0, 10, 2, "omnibox0,omnibox1,omnibox2,omnibox3,webstore0,webstore1"}, 146a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) {1, 10, 0, "app0,omnibox0,omnibox1,omnibox2,omnibox3,omnibox4"}, 147a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) {2, 10, 0, "app0,app1,omnibox0,omnibox1,omnibox2,omnibox3"}, 148a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) {2, 10, 1, "app0,app1,omnibox0,omnibox1,omnibox2,webstore0"}, 149a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) {2, 10, 2, "app0,app1,omnibox0,omnibox1,webstore0,webstore1"}, 150a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) {2, 0, 2, "app0,app1,webstore0,webstore1"}, 151a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) {0, 0, 0, ""}, 152a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) }; 153a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 154a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); ++i) { 155a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) app_provider()->set_count(kTestCases[i].app_results); 156a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) omnibox_provider()->set_count(kTestCases[i].omnibox_results); 157a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) webstore_provider()->set_count(kTestCases[i].webstore_results); 158a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunQuery(); 1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 160a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(kTestCases[i].expected, GetResults()) << "Case " << i; 161a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 162a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 164a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(MixerTest, RemoveDuplicates) { 165a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const std::string dup = "dup"; 166424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 167424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // This gives "dup0,dup1,dup2". 168a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch app_provider()->set_prefix(dup); 1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) app_provider()->set_count(3); 170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 171424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // This gives "dup0,dup1". 172424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) omnibox_provider()->set_prefix(dup); 173a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) omnibox_provider()->set_count(2); 174a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 175a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // This gives "dup0". 176a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) webstore_provider()->set_prefix(dup); 177a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) webstore_provider()->set_count(1); 178a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 179a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunQuery(); 180a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Only three results with unique id are kept. 182a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ("dup0,dup1,dup2", GetResults()); 183a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 184a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace test 186a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} // namespace app_list 187a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)