1 // Copyright 2014 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 "chrome/browser/speech/speech_recognizer.h"
6
7 #include <stdint.h>
8
9 #include "base/command_line.h"
10 #include "base/macros.h"
11 #include "base/memory/weak_ptr.h"
12 #include "base/run_loop.h"
13 #include "base/strings/utf_string_conversions.h"
14 #include "chrome/browser/speech/speech_recognizer_delegate.h"
15 #include "chrome/browser/ui/browser.h"
16 #include "chrome/common/chrome_switches.h"
17 #include "chrome/test/base/in_process_browser_test.h"
18 #include "chrome/test/base/testing_profile.h"
19 #include "content/public/browser/browser_thread.h"
20 #include "content/public/browser/storage_partition.h"
21 #include "content/public/test/browser_test.h"
22 #include "content/public/test/fake_speech_recognition_manager.h"
23 #include "content/public/test/test_utils.h"
24 #include "testing/gmock/include/gmock/gmock.h"
25 #include "testing/gtest/include/gtest/gtest.h"
26
27 using ::testing::InvokeWithoutArgs;
28 using ::testing::Return;
29
30 class MockSpeechRecognizerDelegate : public SpeechRecognizerDelegate {
31 public:
MockSpeechRecognizerDelegate()32 MockSpeechRecognizerDelegate() {}
33
GetWeakPtr()34 base::WeakPtr<MockSpeechRecognizerDelegate> GetWeakPtr() {
35 return weak_factory_.GetWeakPtr();
36 }
37
38 MOCK_METHOD2(OnSpeechResult, void(const base::string16&, bool));
39 MOCK_METHOD1(OnSpeechSoundLevelChanged, void(int16_t));
40 MOCK_METHOD1(OnSpeechRecognitionStateChanged, void(SpeechRecognizerStatus));
41 MOCK_METHOD2(GetSpeechAuthParameters, void(std::string*, std::string*));
42
43 private:
44 base::WeakPtrFactory<MockSpeechRecognizerDelegate> weak_factory_{this};
45 };
46
47 class AppListSpeechRecognizerBrowserTest : public InProcessBrowserTest {
48 public:
AppListSpeechRecognizerBrowserTest()49 AppListSpeechRecognizerBrowserTest() {}
50
SetUpOnMainThread()51 void SetUpOnMainThread() override {
52 fake_speech_recognition_manager_.reset(
53 new content::FakeSpeechRecognitionManager());
54 fake_speech_recognition_manager_->set_should_send_fake_response(true);
55 content::SpeechRecognitionManager::SetManagerForTesting(
56 fake_speech_recognition_manager_.get());
57 mock_speech_delegate_.reset(new MockSpeechRecognizerDelegate());
58 }
59
TearDownOnMainThread()60 void TearDownOnMainThread() override {
61 content::RunAllPendingInMessageLoop(content::BrowserThread::IO);
62 }
63
64 protected:
65 std::unique_ptr<content::FakeSpeechRecognitionManager>
66 fake_speech_recognition_manager_;
67 std::unique_ptr<MockSpeechRecognizerDelegate> mock_speech_delegate_;
68
69 private:
70 DISALLOW_COPY_AND_ASSIGN(AppListSpeechRecognizerBrowserTest);
71 };
72
IN_PROC_BROWSER_TEST_F(AppListSpeechRecognizerBrowserTest,RecognizeSpeech)73 IN_PROC_BROWSER_TEST_F(AppListSpeechRecognizerBrowserTest, RecognizeSpeech) {
74 SpeechRecognizer recognizer(
75 mock_speech_delegate_->GetWeakPtr(),
76 content::BrowserContext::GetDefaultStoragePartition(browser()->profile())
77 ->GetURLLoaderFactoryForBrowserProcessIOThread(),
78 "en" /* accept_language */, "en" /* locale */);
79
80 base::RunLoop run_loop;
81 EXPECT_CALL(*mock_speech_delegate_,
82 OnSpeechResult(base::ASCIIToUTF16("Pictures of the moon"), true));
83 EXPECT_CALL(*mock_speech_delegate_,
84 OnSpeechRecognitionStateChanged(SPEECH_RECOGNIZER_READY))
85 .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
86 recognizer.Start(nullptr);
87 run_loop.Run();
88 }
89