fake_speech_recognition_manager.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
1// Copyright (c) 2013 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 "content/public/test/fake_speech_recognition_manager.h"
6
7#include "base/bind.h"
8#include "base/message_loop.h"
9#include "base/utf_string_conversions.h"
10#include "content/public/browser/speech_recognition_event_listener.h"
11#include "content/public/common/speech_recognition_result.h"
12#include "testing/gtest/include/gtest/gtest.h"
13
14namespace {
15const char kTestResult[] = "Pictures of the moon";
16}  // namespace
17
18namespace content {
19
20FakeSpeechRecognitionManager::FakeSpeechRecognitionManager()
21    : session_id_(0),
22      listener_(NULL),
23      fake_result_(kTestResult),
24      did_cancel_all_(false),
25      should_send_fake_response_(true),
26      recognition_started_event_(false, false) {
27}
28
29FakeSpeechRecognitionManager::~FakeSpeechRecognitionManager() {
30}
31
32void FakeSpeechRecognitionManager::SetFakeResult(const std::string& value) {
33  fake_result_ = value;
34}
35
36int FakeSpeechRecognitionManager::CreateSession(
37    const SpeechRecognitionSessionConfig& config) {
38  VLOG(1) << "FAKE CreateSession invoked.";
39  EXPECT_EQ(0, session_id_);
40  EXPECT_EQ(NULL, listener_);
41  listener_ = config.event_listener;
42  if (config.grammars.size() > 0)
43    grammar_ = config.grammars[0].url;
44  session_ctx_ = config.initial_context;
45  session_config_ = config;
46  session_id_ = 1;
47  return session_id_;
48}
49
50void FakeSpeechRecognitionManager::StartSession(int session_id) {
51  VLOG(1) << "FAKE StartSession invoked.";
52  EXPECT_EQ(session_id, session_id_);
53  EXPECT_TRUE(listener_ != NULL);
54
55  if (should_send_fake_response_) {
56    // Give the fake result in a short while.
57    base::MessageLoop::current()->PostTask(
58        FROM_HERE,
59        base::Bind(
60            &FakeSpeechRecognitionManager::SetFakeRecognitionResult,
61            // This class does not need to be refcounted (typically done by
62            // PostTask) since it will outlive the test and gets released only
63            // when the test shuts down. Disabling refcounting here saves a bit
64            // of unnecessary code and the factory method can return a plain
65            // pointer below as required by the real code.
66            base::Unretained(this)));
67  }
68  recognition_started_event_.Signal();
69}
70
71void FakeSpeechRecognitionManager::AbortSession(int session_id) {
72  VLOG(1) << "FAKE AbortSession invoked.";
73  EXPECT_EQ(session_id_, session_id);
74  session_id_ = 0;
75  listener_ = NULL;
76}
77
78void FakeSpeechRecognitionManager::StopAudioCaptureForSession(int session_id) {
79  VLOG(1) << "StopRecording invoked.";
80  EXPECT_EQ(session_id_, session_id);
81  // Nothing to do here since we aren't really recording.
82}
83
84void FakeSpeechRecognitionManager::AbortAllSessionsForListener(
85    SpeechRecognitionEventListener* listener) {
86  VLOG(1) << "CancelAllRequestsWithDelegate invoked.";
87  // listener_ is set to NULL if a fake result was received (see below), so
88  // check that listener_ matches the incoming parameter only when there is
89  // no fake result sent.
90  EXPECT_TRUE(should_send_fake_response_ || listener_ == listener);
91  did_cancel_all_ = true;
92}
93
94void FakeSpeechRecognitionManager::AbortAllSessionsForRenderView(
95    int render_process_id, int render_view_id) {
96  NOTREACHED();
97}
98
99bool FakeSpeechRecognitionManager::HasAudioInputDevices() { return true; }
100
101bool FakeSpeechRecognitionManager::IsCapturingAudio() { return true; }
102
103string16 FakeSpeechRecognitionManager::GetAudioInputDeviceModel() {
104  return string16();
105}
106
107int FakeSpeechRecognitionManager::GetSession(int render_process_id,
108                                             int render_view_id,
109                                             int request_id) const {
110  return session_ctx_.render_process_id == render_process_id &&
111         session_ctx_.render_view_id == render_view_id &&
112         session_ctx_.request_id == request_id;
113}
114
115const SpeechRecognitionSessionConfig&
116    FakeSpeechRecognitionManager::GetSessionConfig(int session_id) const {
117  EXPECT_EQ(session_id, session_id_);
118  return session_config_;
119}
120
121SpeechRecognitionSessionContext FakeSpeechRecognitionManager::GetSessionContext(
122    int session_id) const {
123  EXPECT_EQ(session_id, session_id_);
124  return session_ctx_;
125}
126
127void FakeSpeechRecognitionManager::SetFakeRecognitionResult() {
128  if (!session_id_)  // Do a check in case we were cancelled..
129    return;
130
131  VLOG(1) << "Setting fake recognition result.";
132  listener_->OnAudioEnd(session_id_);
133  SpeechRecognitionResult result;
134  result.hypotheses.push_back(SpeechRecognitionHypothesis(
135      ASCIIToUTF16(kTestResult), 1.0));
136  SpeechRecognitionResults results;
137  results.push_back(result);
138  listener_->OnRecognitionResults(session_id_, results);
139  listener_->OnRecognitionEnd(session_id_);
140  session_id_ = 0;
141  listener_ = NULL;
142  VLOG(1) << "Finished setting fake recognition result.";
143}
144
145}  // namespace content
146