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