fake_speech_recognition_manager.cc revision 868fa2fe829687343ffae624259930155e16dbd8
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/strings/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
101string16 FakeSpeechRecognitionManager::GetAudioInputDeviceModel() {
102  return string16();
103}
104
105int FakeSpeechRecognitionManager::GetSession(int render_process_id,
106                                             int render_view_id,
107                                             int request_id) const {
108  return session_ctx_.render_process_id == render_process_id &&
109         session_ctx_.render_view_id == render_view_id &&
110         session_ctx_.request_id == request_id;
111}
112
113const SpeechRecognitionSessionConfig&
114    FakeSpeechRecognitionManager::GetSessionConfig(int session_id) const {
115  EXPECT_EQ(session_id, session_id_);
116  return session_config_;
117}
118
119SpeechRecognitionSessionContext FakeSpeechRecognitionManager::GetSessionContext(
120    int session_id) const {
121  EXPECT_EQ(session_id, session_id_);
122  return session_ctx_;
123}
124
125void FakeSpeechRecognitionManager::SetFakeRecognitionResult() {
126  if (!session_id_)  // Do a check in case we were cancelled..
127    return;
128
129  VLOG(1) << "Setting fake recognition result.";
130  listener_->OnAudioEnd(session_id_);
131  SpeechRecognitionResult result;
132  result.hypotheses.push_back(SpeechRecognitionHypothesis(
133      ASCIIToUTF16(kTestResult), 1.0));
134  SpeechRecognitionResults results;
135  results.push_back(result);
136  listener_->OnRecognitionResults(session_id_, results);
137  listener_->OnRecognitionEnd(session_id_);
138  session_id_ = 0;
139  listener_ = NULL;
140  VLOG(1) << "Finished setting fake recognition result.";
141}
142
143}  // namespace content
144