12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/fake_speech_recognition_manager.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h"
89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/speech_recognition_event_listener.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/speech_recognition_result.h"
127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/test/test_utils.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kTestResult[] = "Pictures of the moon";
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RunCallback(const base::Closure recognition_started_closure) {
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  recognition_started_closure.Run();
207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content {
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FakeSpeechRecognitionManager::FakeSpeechRecognitionManager()
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : session_id_(0),
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      listener_(NULL),
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      fake_result_(kTestResult),
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      did_cancel_all_(false),
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      should_send_fake_response_(true) {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FakeSpeechRecognitionManager::~FakeSpeechRecognitionManager() {
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid FakeSpeechRecognitionManager::WaitForRecognitionStarted() {
377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<MessageLoopRunner> runner = new MessageLoopRunner;
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  recognition_started_closure_ = runner->QuitClosure();
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  runner->Run();
417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  recognition_started_closure_.Reset();
427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FakeSpeechRecognitionManager::SetFakeResult(const std::string& value) {
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  fake_result_ = value;
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int FakeSpeechRecognitionManager::CreateSession(
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const SpeechRecognitionSessionConfig& config) {
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VLOG(1) << "FAKE CreateSession invoked.";
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, session_id_);
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(NULL, listener_);
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  listener_ = config.event_listener.get();
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (config.grammars.size() > 0)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    grammar_ = config.grammars[0].url;
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  session_ctx_ = config.initial_context;
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  session_config_ = config;
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  session_id_ = 1;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return session_id_;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FakeSpeechRecognitionManager::StartSession(int session_id) {
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VLOG(1) << "FAKE StartSession invoked.";
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(session_id, session_id_);
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(listener_ != NULL);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (should_send_fake_response_) {
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Give the fake result in a short while.
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::MessageLoop::current()->PostTask(
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        FROM_HERE,
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            &FakeSpeechRecognitionManager::SetFakeRecognitionResult,
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            // This class does not need to be refcounted (typically done by
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            // PostTask) since it will outlive the test and gets released only
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            // when the test shuts down. Disabling refcounting here saves a bit
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            // of unnecessary code and the factory method can return a plain
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            // pointer below as required by the real code.
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            base::Unretained(this)));
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!recognition_started_closure_.is_null()) {
817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    BrowserThread::PostTask(
827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        BrowserThread::UI,
837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        FROM_HERE,
847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        base::Bind(&RunCallback, recognition_started_closure_));
857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FakeSpeechRecognitionManager::AbortSession(int session_id) {
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VLOG(1) << "FAKE AbortSession invoked.";
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(session_id_, session_id);
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  session_id_ = 0;
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  listener_ = NULL;
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FakeSpeechRecognitionManager::StopAudioCaptureForSession(int session_id) {
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VLOG(1) << "StopRecording invoked.";
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(session_id_, session_id);
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Nothing to do here since we aren't really recording.
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void FakeSpeechRecognitionManager::AbortAllSessionsForRenderProcess(
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    int render_process_id) {
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VLOG(1) << "CancelAllRequestsWithDelegate invoked.";
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(should_send_fake_response_ ||
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)              session_ctx_.render_process_id == render_process_id);
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  did_cancel_all_ = true;
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FakeSpeechRecognitionManager::AbortAllSessionsForRenderView(
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int render_process_id, int render_view_id) {
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED();
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool FakeSpeechRecognitionManager::HasAudioInputDevices() { return true; }
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 FakeSpeechRecognitionManager::GetAudioInputDeviceModel() {
117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return base::string16();
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int FakeSpeechRecognitionManager::GetSession(int render_process_id,
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             int render_view_id,
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             int request_id) const {
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return session_ctx_.render_process_id == render_process_id &&
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         session_ctx_.render_view_id == render_view_id &&
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         session_ctx_.request_id == request_id;
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SpeechRecognitionSessionConfig&
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeSpeechRecognitionManager::GetSessionConfig(int session_id) const {
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(session_id, session_id_);
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return session_config_;
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SpeechRecognitionSessionContext FakeSpeechRecognitionManager::GetSessionContext(
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int session_id) const {
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(session_id, session_id_);
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return session_ctx_;
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FakeSpeechRecognitionManager::SetFakeRecognitionResult() {
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!session_id_)  // Do a check in case we were cancelled..
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VLOG(1) << "Setting fake recognition result.";
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  listener_->OnAudioEnd(session_id_);
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpeechRecognitionResult result;
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result.hypotheses.push_back(SpeechRecognitionHypothesis(
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::ASCIIToUTF16(kTestResult), 1.0));
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpeechRecognitionResults results;
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  results.push_back(result);
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  listener_->OnRecognitionResults(session_id_, results);
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  listener_->OnRecognitionEnd(session_id_);
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  session_id_ = 0;
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  listener_ = NULL;
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VLOG(1) << "Finished setting fake recognition result.";
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace content
159