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)