1// Copyright 2014 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 "base/prefs/pref_service.h"
6#include "chrome/browser/extensions/api/hotword_private/hotword_private_api.h"
7#include "chrome/browser/extensions/extension_apitest.h"
8#include "chrome/browser/extensions/extension_service.h"
9#include "chrome/browser/extensions/extension_test_message_listener.h"
10#include "chrome/browser/profiles/profile.h"
11#include "chrome/browser/search/hotword_client.h"
12#include "chrome/browser/search/hotword_service.h"
13#include "chrome/browser/search/hotword_service_factory.h"
14#include "chrome/common/pref_names.h"
15
16namespace {
17
18class MockHotwordService : public HotwordService {
19 public:
20  explicit MockHotwordService(Profile* profile)
21      : HotwordService(profile), service_available_(true) {};
22  virtual ~MockHotwordService() {}
23
24  virtual bool IsServiceAvailable() OVERRIDE {
25    return service_available_;
26  }
27
28  void setServiceAvailable(bool available) {
29    service_available_ = available;
30  }
31
32  static KeyedService* Build(content::BrowserContext* profile) {
33    return new MockHotwordService(static_cast<Profile*>(profile));
34  }
35
36 private:
37  bool service_available_;
38
39  DISALLOW_COPY_AND_ASSIGN(MockHotwordService);
40};
41
42class MockHotwordClient : public HotwordClient {
43 public:
44  MockHotwordClient()
45      : last_enabled_(false),
46        state_changed_count_(0),
47        recognized_count_(0) {
48  }
49
50  virtual ~MockHotwordClient() {}
51
52  virtual void OnHotwordStateChanged(bool enabled) OVERRIDE {
53    last_enabled_ = enabled;
54    state_changed_count_++;
55  }
56
57  virtual void OnHotwordRecognized() OVERRIDE {
58    recognized_count_++;
59  }
60
61  bool last_enabled() const { return last_enabled_; }
62  int state_changed_count() const { return state_changed_count_; }
63  int recognized_count() const { return recognized_count_; }
64
65 private:
66  bool last_enabled_;
67  int state_changed_count_;
68  int recognized_count_;
69
70  DISALLOW_COPY_AND_ASSIGN(MockHotwordClient);
71};
72
73class HotwordPrivateApiTest : public ExtensionApiTest {
74 public:
75  HotwordPrivateApiTest() {}
76  virtual ~HotwordPrivateApiTest() {}
77
78  virtual void SetUpOnMainThread() OVERRIDE {
79    ExtensionApiTest::SetUpOnMainThread();
80
81    test_data_dir_ = test_data_dir_.AppendASCII("hotword_private");
82
83    service_ = static_cast<MockHotwordService*>(
84        HotwordServiceFactory::GetInstance()->SetTestingFactoryAndUse(
85            profile(), MockHotwordService::Build));
86  }
87
88  MockHotwordService* service() {
89    return service_;
90  }
91
92 private:
93  MockHotwordService* service_;
94
95  DISALLOW_COPY_AND_ASSIGN(HotwordPrivateApiTest);
96};
97
98}  // anonymous namespace
99
100IN_PROC_BROWSER_TEST_F(HotwordPrivateApiTest, SetEnabled) {
101  EXPECT_FALSE(profile()->GetPrefs()->GetBoolean(prefs::kHotwordSearchEnabled));
102
103  ExtensionTestMessageListener listenerTrue("ready", false);
104  ASSERT_TRUE(RunComponentExtensionTest("setEnabledTrue")) << message_;
105  EXPECT_TRUE(listenerTrue.WaitUntilSatisfied());
106  EXPECT_TRUE(profile()->GetPrefs()->GetBoolean(prefs::kHotwordSearchEnabled));
107
108  ExtensionTestMessageListener listenerFalse("ready", false);
109  ASSERT_TRUE(RunComponentExtensionTest("setEnabledFalse")) << message_;
110  EXPECT_TRUE(listenerFalse.WaitUntilSatisfied());
111  EXPECT_FALSE(profile()->GetPrefs()->GetBoolean(prefs::kHotwordSearchEnabled));
112}
113
114IN_PROC_BROWSER_TEST_F(HotwordPrivateApiTest, SetAudioLoggingEnabled) {
115  EXPECT_FALSE(service()->IsOptedIntoAudioLogging());
116  EXPECT_TRUE(profile()->GetPrefs()->GetBoolean(
117      prefs::kHotwordAudioLoggingEnabled));
118
119  ExtensionTestMessageListener listenerTrue("ready", false);
120  ASSERT_TRUE(RunComponentExtensionTest("setAudioLoggingEnableTrue"))
121      << message_;
122  EXPECT_TRUE(listenerTrue.WaitUntilSatisfied());
123  EXPECT_TRUE(profile()->GetPrefs()->GetBoolean(
124      prefs::kHotwordAudioLoggingEnabled));
125  EXPECT_TRUE(service()->IsOptedIntoAudioLogging());
126
127  ExtensionTestMessageListener listenerFalse("ready", false);
128  ASSERT_TRUE(RunComponentExtensionTest("setAudioLoggingEnableFalse"))
129      << message_;
130  EXPECT_TRUE(listenerFalse.WaitUntilSatisfied());
131  EXPECT_FALSE(profile()->GetPrefs()->GetBoolean(
132      prefs::kHotwordAudioLoggingEnabled));
133  EXPECT_FALSE(service()->IsOptedIntoAudioLogging());
134}
135
136IN_PROC_BROWSER_TEST_F(HotwordPrivateApiTest, GetStatus) {
137  ASSERT_TRUE(RunComponentExtensionTest("getEnabled")) << message_;
138}
139
140IN_PROC_BROWSER_TEST_F(HotwordPrivateApiTest, IsAvailableTrue) {
141  service()->setServiceAvailable(true);
142  ExtensionTestMessageListener listener("available: true", false);
143  ASSERT_TRUE(RunComponentExtensionTest("isAvailable")) << message_;
144  EXPECT_TRUE(listener.WaitUntilSatisfied());
145}
146
147IN_PROC_BROWSER_TEST_F(HotwordPrivateApiTest, IsAvailableFalse) {
148  service()->setServiceAvailable(false);
149  ExtensionTestMessageListener listener("available: false", false);
150  ASSERT_TRUE(RunComponentExtensionTest("isAvailable")) << message_;
151  EXPECT_TRUE(listener.WaitUntilSatisfied());
152}
153
154IN_PROC_BROWSER_TEST_F(HotwordPrivateApiTest, OnEnabledChanged) {
155  // Trigger the pref registrar.
156  extensions::HotwordPrivateEventService::GetFactoryInstance();
157  ExtensionTestMessageListener listener("ready", false);
158  ASSERT_TRUE(
159      LoadExtensionAsComponent(test_data_dir_.AppendASCII("onEnabledChanged")));
160  EXPECT_TRUE(listener.WaitUntilSatisfied());
161
162  ExtensionTestMessageListener listenerNotification("notification", false);
163  profile()->GetPrefs()->SetBoolean(prefs::kHotwordSearchEnabled, true);
164  EXPECT_TRUE(listenerNotification.WaitUntilSatisfied());
165}
166
167IN_PROC_BROWSER_TEST_F(HotwordPrivateApiTest, HotwordSession) {
168  extensions::HotwordPrivateEventService::GetFactoryInstance();
169  ExtensionTestMessageListener listener("ready", false);
170  LoadExtensionAsComponent(
171      test_data_dir_.AppendASCII("hotwordSession"));
172  EXPECT_TRUE(listener.WaitUntilSatisfied());
173
174  ExtensionTestMessageListener listenerStopReady("stopReady", false);
175  ExtensionTestMessageListener listenerStopped("stopped", false);
176  MockHotwordClient client;
177  service()->RequestHotwordSession(&client);
178  EXPECT_TRUE(listenerStopReady.WaitUntilSatisfied());
179  service()->StopHotwordSession(&client);
180  EXPECT_TRUE(listenerStopped.WaitUntilSatisfied());
181
182  EXPECT_TRUE(client.last_enabled());
183  EXPECT_EQ(1, client.state_changed_count());
184  EXPECT_EQ(1, client.recognized_count());
185}
186