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