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