| Index: chrome/browser/extensions/speech_input/extension_speech_input_apitest.cc
|
| diff --git a/chrome/browser/extensions/speech_input/extension_speech_input_apitest.cc b/chrome/browser/extensions/speech_input/extension_speech_input_apitest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..780212b84342034c4e5ae1b29a6ff0446f79693c
|
| --- /dev/null
|
| +++ b/chrome/browser/extensions/speech_input/extension_speech_input_apitest.cc
|
| @@ -0,0 +1,195 @@
|
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/command_line.h"
|
| +#include "base/utf_string_conversions.h"
|
| +#include "chrome/browser/extensions/extension_apitest.h"
|
| +#include "chrome/browser/extensions/speech_input/extension_speech_input_api.h"
|
| +#include "chrome/browser/extensions/speech_input/extension_speech_input_manager.h"
|
| +#include "chrome/browser/ui/browser.h"
|
| +#include "chrome/common/chrome_notification_types.h"
|
| +#include "chrome/common/chrome_switches.h"
|
| +#include "content/browser/speech/speech_recognizer.h"
|
| +#include "content/common/speech_input_result.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace net {
|
| +class URLRequestContextGetter;
|
| +}
|
| +
|
| +// Mock class used to test the extension speech input API.
|
| +class ExtensionSpeechInputApiTest : public ExtensionApiTest,
|
| + public ExtensionSpeechInterface {
|
| + public:
|
| + ExtensionSpeechInputApiTest();
|
| + virtual ~ExtensionSpeechInputApiTest();
|
| +
|
| + void SetRecordingDevicesAvailable(bool available) {
|
| + recording_devices_available_ = available;
|
| + }
|
| +
|
| + void SetRecognitionError(speech_input::SpeechInputError error) {
|
| + next_error_ = error;
|
| + }
|
| +
|
| + void SetRecognitionResult(const speech_input::SpeechInputResult& result) {
|
| + next_result_ = result;
|
| + }
|
| +
|
| + void SetRecognitionDelay(int result_delay_ms) {
|
| + result_delay_ms_ = result_delay_ms;
|
| + }
|
| +
|
| + // Used as delay when the corresponding call should not be dispatched.
|
| + static const int kDontDispatchCall = -1;
|
| +
|
| + // ExtensionApiTest methods.
|
| + virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
|
| + ExtensionApiTest::SetUpCommandLine(command_line);
|
| + command_line->AppendSwitch(switches::kEnableExperimentalExtensionApis);
|
| + }
|
| +
|
| + // ExtensionSpeechInterface methods.
|
| + virtual bool HasAudioInputDevices() OVERRIDE {
|
| + return recording_devices_available_;
|
| + }
|
| +
|
| + virtual bool IsRecordingInProcess() OVERRIDE {
|
| + // Only the mock recognizer is supposed to be recording during testing.
|
| + return HasValidRecognizer();
|
| + }
|
| +
|
| + virtual bool HasValidRecognizer() OVERRIDE {
|
| + return recognizer_is_valid_;
|
| + }
|
| +
|
| + virtual void StartRecording(
|
| + speech_input::SpeechRecognizerDelegate* delegate,
|
| + net::URLRequestContextGetter* context_getter,
|
| + int caller_id,
|
| + const std::string& language,
|
| + const std::string& grammar,
|
| + bool filter_profanities) OVERRIDE;
|
| +
|
| + virtual void StopRecording(bool recognition_failed) OVERRIDE;
|
| +
|
| + ExtensionSpeechInputManager* GetManager() {
|
| + return ExtensionSpeechInputManager::GetForProfile(browser()->profile());
|
| + }
|
| +
|
| + // Auxiliary class used to hook the API manager into the test during its
|
| + // lifetime. Required since browser() is not available during the set up
|
| + // or tear down callbacks, or during the test class construction.
|
| + class AutoManagerHook {
|
| + public:
|
| + explicit AutoManagerHook(ExtensionSpeechInputApiTest* test)
|
| + : test_(test) {
|
| + test_->GetManager()->SetExtensionSpeechInterface(test_);
|
| + }
|
| +
|
| + ~AutoManagerHook() {
|
| + test_->GetManager()->SetExtensionSpeechInterface(NULL);
|
| + }
|
| +
|
| + private:
|
| + ExtensionSpeechInputApiTest* test_;
|
| + };
|
| +
|
| + private:
|
| + void ProvideResults(int caller_id);
|
| +
|
| + bool recording_devices_available_;
|
| + bool recognizer_is_valid_;
|
| + speech_input::SpeechInputError next_error_;
|
| + speech_input::SpeechInputResult next_result_;
|
| + int result_delay_ms_;
|
| +};
|
| +
|
| +ExtensionSpeechInputApiTest::ExtensionSpeechInputApiTest()
|
| + : recording_devices_available_(true),
|
| + recognizer_is_valid_(false),
|
| + next_error_(speech_input::kErrorNone),
|
| + result_delay_ms_(0) {
|
| +}
|
| +
|
| +ExtensionSpeechInputApiTest::~ExtensionSpeechInputApiTest() {
|
| +}
|
| +
|
| +void ExtensionSpeechInputApiTest::StartRecording(
|
| + speech_input::SpeechRecognizerDelegate* delegate,
|
| + net::URLRequestContextGetter* context_getter,
|
| + int caller_id,
|
| + const std::string& language,
|
| + const std::string& grammar,
|
| + bool filter_profanities) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| + recognizer_is_valid_ = true;
|
| +
|
| + // Notify that recording started.
|
| + MessageLoop::current()->PostDelayedTask(FROM_HERE,
|
| + base::Bind(&ExtensionSpeechInputManager::DidStartReceivingAudio,
|
| + GetManager(), caller_id), 0);
|
| +
|
| + // Notify sound start in the input device.
|
| + MessageLoop::current()->PostDelayedTask(FROM_HERE,
|
| + base::Bind(&ExtensionSpeechInputManager::DidStartReceivingSpeech,
|
| + GetManager(), caller_id), 0);
|
| +
|
| + if (result_delay_ms_ != kDontDispatchCall) {
|
| + // Dispatch the recognition results.
|
| + MessageLoop::current()->PostDelayedTask(FROM_HERE,
|
| + base::Bind(&ExtensionSpeechInputApiTest::ProvideResults, this,
|
| + caller_id), result_delay_ms_);
|
| + }
|
| +}
|
| +
|
| +void ExtensionSpeechInputApiTest::StopRecording(bool recognition_failed) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| + recognizer_is_valid_ = false;
|
| +}
|
| +
|
| +void ExtensionSpeechInputApiTest::ProvideResults(int caller_id) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| +
|
| + if (next_error_ != speech_input::kErrorNone) {
|
| + GetManager()->OnRecognizerError(caller_id, next_error_);
|
| + return;
|
| + }
|
| +
|
| + GetManager()->DidStopReceivingSpeech(caller_id);
|
| + GetManager()->SetRecognitionResult(caller_id, next_result_);
|
| +}
|
| +
|
| +// Every test should leave the manager in the idle state when finished.
|
| +IN_PROC_BROWSER_TEST_F(ExtensionSpeechInputApiTest, StartStopTest) {
|
| + AutoManagerHook hook(this);
|
| +
|
| + SetRecognitionDelay(kDontDispatchCall);
|
| + ASSERT_TRUE(RunExtensionTest("speech_input/start_stop")) << message_;
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(ExtensionSpeechInputApiTest, NoDevicesAvailable) {
|
| + AutoManagerHook hook(this);
|
| +
|
| + SetRecordingDevicesAvailable(false);
|
| + ASSERT_TRUE(RunExtensionTest("speech_input/start_error")) << message_;
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(ExtensionSpeechInputApiTest, RecognitionSuccessful) {
|
| + AutoManagerHook hook(this);
|
| +
|
| + speech_input::SpeechInputResult result;
|
| + result.hypotheses.push_back(
|
| + speech_input::SpeechInputHypothesis(UTF8ToUTF16("this is a test"), 0.99));
|
| + SetRecognitionResult(result);
|
| + ASSERT_TRUE(RunExtensionTest("speech_input/recognition")) << message_;
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(ExtensionSpeechInputApiTest, RecognitionError) {
|
| + AutoManagerHook hook(this);
|
| +
|
| + SetRecognitionError(speech_input::kErrorNetwork);
|
| + ASSERT_TRUE(RunExtensionTest("speech_input/recognition_error")) << message_;
|
| +}
|
|
|