Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(172)

Side by Side Diff: content/browser/speech/speech_recognizer_impl_unittest.cc

Issue 9835049: Speech refactoring: Reimplemented speech_recognizer as a FSM. (CL1.5) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed according to Satish review. Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <vector> 5 #include <vector>
6 6
7 #include "content/browser/browser_thread_impl.h" 7 #include "content/browser/browser_thread_impl.h"
8 #include "content/browser/speech/google_one_shot_remote_engine.h" 8 #include "content/browser/speech/google_one_shot_remote_engine.h"
9 #include "content/browser/speech/speech_recognizer_impl.h" 9 #include "content/browser/speech/speech_recognizer_impl.h"
10 #include "content/public/browser/speech_recognition_event_listener.h" 10 #include "content/public/browser/speech_recognition_event_listener.h"
11 #include "content/test/test_url_fetcher_factory.h" 11 #include "content/test/test_url_fetcher_factory.h"
12 #include "media/audio/audio_manager.h" 12 #include "media/audio/audio_manager.h"
13 #include "media/audio/fake_audio_input_stream.h" 13 #include "media/audio/fake_audio_input_stream.h"
14 #include "media/audio/fake_audio_output_stream.h" 14 #include "media/audio/fake_audio_output_stream.h"
15 #include "media/audio/test_audio_input_controller_factory.h" 15 #include "media/audio/test_audio_input_controller_factory.h"
16 #include "net/base/net_errors.h" 16 #include "net/base/net_errors.h"
17 #include "net/url_request/url_request_status.h" 17 #include "net/url_request/url_request_status.h"
18 #include "testing/gtest/include/gtest/gtest.h" 18 #include "testing/gtest/include/gtest/gtest.h"
19 19
20 using base::MessageLoopProxy;
20 using content::BrowserThread; 21 using content::BrowserThread;
21 using content::BrowserThreadImpl; 22 using content::BrowserThreadImpl;
22 using media::AudioInputController; 23 using media::AudioInputController;
23 using media::AudioInputStream; 24 using media::AudioInputStream;
24 using media::AudioManager; 25 using media::AudioManager;
25 using media::AudioOutputStream; 26 using media::AudioOutputStream;
26 using media::AudioParameters; 27 using media::AudioParameters;
27 using media::TestAudioInputController; 28 using media::TestAudioInputController;
28 using media::TestAudioInputControllerFactory; 29 using media::TestAudioInputControllerFactory;
29 30
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 91
91 92
92 namespace speech { 93 namespace speech {
93 94
94 class SpeechRecognizerImplTest : public content::SpeechRecognitionEventListener, 95 class SpeechRecognizerImplTest : public content::SpeechRecognitionEventListener,
95 public testing::Test { 96 public testing::Test {
96 public: 97 public:
97 SpeechRecognizerImplTest() 98 SpeechRecognizerImplTest()
98 : io_thread_(BrowserThread::IO, &message_loop_), 99 : io_thread_(BrowserThread::IO, &message_loop_),
99 audio_manager_(new MockAudioManager()), 100 audio_manager_(new MockAudioManager()),
100 audio_ended_(false), 101 recognition_started_(false),
101 recognition_ended_(false), 102 recognition_ended_(false),
102 result_received_(false), 103 result_received_(false),
103 audio_started_(false), 104 audio_started_(false),
105 audio_ended_(false),
106 sound_started_(false),
107 sound_ended_(false),
104 error_(content::SPEECH_RECOGNITION_ERROR_NONE), 108 error_(content::SPEECH_RECOGNITION_ERROR_NONE),
105 volume_(-1.0f) { 109 volume_(-1.0f) {
106 recognizer_ = new SpeechRecognizerImpl( 110 // SpeechRecognizerImpl takes ownership of sr_engine.
bulach 2012/04/12 16:20:16 there was a thread on chromium-dev to un-inline co
jam 2012/04/12 16:21:50 please don't do this unless you feel strongly incl
bulach 2012/04/12 16:26:50 ahn, thanks for the clarification jam! :) it wasn'
107 this, 1, std::string(), std::string(), NULL, false, std::string(), 111 GoogleOneShotRemoteEngine* sr_engine =
108 std::string()); 112 new GoogleOneShotRemoteEngine(NULL /* URLRequestContextGetter */);
113 GoogleOneShotRemoteEngineConfig config;
114 config.audio_num_bits_per_sample =
115 SpeechRecognizerImpl::kNumBitsPerAudioSample;
116 config.audio_sample_rate = SpeechRecognizerImpl::kAudioSampleRate;
117 config.filter_profanities = false;
118 sr_engine->SetConfig(config);
119
120 recognizer_ = new SpeechRecognizerImpl(this, 1, sr_engine);
109 recognizer_->SetAudioManagerForTesting(audio_manager_.get()); 121 recognizer_->SetAudioManagerForTesting(audio_manager_.get());
122
110 int audio_packet_length_bytes = 123 int audio_packet_length_bytes =
111 (SpeechRecognizerImpl::kAudioSampleRate * 124 (SpeechRecognizerImpl::kAudioSampleRate *
112 GoogleOneShotRemoteEngine::kAudioPacketIntervalMs * 125 GoogleOneShotRemoteEngine::kAudioPacketIntervalMs *
113 ChannelLayoutToChannelCount(SpeechRecognizerImpl::kChannelLayout) * 126 ChannelLayoutToChannelCount(SpeechRecognizerImpl::kChannelLayout) *
114 SpeechRecognizerImpl::kNumBitsPerAudioSample) / (8 * 1000); 127 SpeechRecognizerImpl::kNumBitsPerAudioSample) / (8 * 1000);
115 audio_packet_.resize(audio_packet_length_bytes); 128 audio_packet_.resize(audio_packet_length_bytes);
116 } 129 }
117 130
131 void CheckEventsConsistency() {
132 // Note: "!x || y" == "x implies y".
133 EXPECT_TRUE(!recognition_ended_ || recognition_started_);
134 EXPECT_TRUE(!audio_ended_ || audio_started_);
135 EXPECT_TRUE(!sound_ended_ || sound_started_);
136 EXPECT_TRUE(!audio_started_ || recognition_started_);
137 EXPECT_TRUE(!sound_started_ || audio_started_);
138 EXPECT_TRUE(!audio_ended_ || (sound_ended_ || !sound_started_));
139 EXPECT_TRUE(!recognition_ended_ || (audio_ended_ || !audio_started_));
140 }
141
142 void CheckFinalEventsConsistency() {
143 // Note: "!(x ^ y)" == "(x && y) || (!x && !x)".
144 EXPECT_FALSE(recognition_started_ ^ recognition_ended_);
145 EXPECT_FALSE(audio_started_ ^ audio_ended_);
146 EXPECT_FALSE(sound_started_ ^ sound_ended_);
147 }
148
118 // Overridden from content::SpeechRecognitionEventListener: 149 // Overridden from content::SpeechRecognitionEventListener:
119 virtual void OnAudioStart(int caller_id) OVERRIDE { 150 virtual void OnAudioStart(int caller_id) OVERRIDE {
120 audio_started_ = true; 151 audio_started_ = true;
152 CheckEventsConsistency();
121 } 153 }
122 154
123 virtual void OnAudioEnd(int caller_id) OVERRIDE { 155 virtual void OnAudioEnd(int caller_id) OVERRIDE {
124 audio_ended_ = true; 156 audio_ended_ = true;
157 CheckEventsConsistency();
125 } 158 }
126 159
127 virtual void OnRecognitionResult( 160 virtual void OnRecognitionResult(
128 int caller_id, const content::SpeechRecognitionResult& result) OVERRIDE { 161 int caller_id, const content::SpeechRecognitionResult& result) OVERRIDE {
129 result_received_ = true; 162 result_received_ = true;
130 } 163 }
131 164
132 virtual void OnRecognitionError( 165 virtual void OnRecognitionError(
133 int caller_id, 166 int caller_id, const content::SpeechRecognitionError& error) OVERRIDE {
134 const content::SpeechRecognitionError& error) OVERRIDE { 167 EXPECT_TRUE(recognition_started_);
168 EXPECT_FALSE(recognition_ended_);
135 error_ = error.code; 169 error_ = error.code;
136 } 170 }
137 171
138 virtual void OnAudioLevelsChange(int caller_id, float volume, 172 virtual void OnAudioLevelsChange(int caller_id, float volume,
139 float noise_volume) OVERRIDE { 173 float noise_volume) OVERRIDE {
140 volume_ = volume; 174 volume_ = volume;
141 noise_volume_ = noise_volume; 175 noise_volume_ = noise_volume;
142 } 176 }
143 177
144 virtual void OnRecognitionEnd(int caller_id) OVERRIDE { 178 virtual void OnRecognitionEnd(int caller_id) OVERRIDE {
145 recognition_ended_ = true; 179 recognition_ended_ = true;
180 CheckEventsConsistency();
146 } 181 }
147 182
148 virtual void OnRecognitionStart(int caller_id) OVERRIDE {} 183 virtual void OnRecognitionStart(int caller_id) OVERRIDE {
184 recognition_started_ = true;
185 CheckEventsConsistency();
186 }
187
149 virtual void OnEnvironmentEstimationComplete(int caller_id) OVERRIDE {} 188 virtual void OnEnvironmentEstimationComplete(int caller_id) OVERRIDE {}
150 virtual void OnSoundStart(int caller_id) OVERRIDE {} 189
151 virtual void OnSoundEnd(int caller_id) OVERRIDE {} 190 virtual void OnSoundStart(int caller_id) OVERRIDE {
191 sound_started_ = true;
192 CheckEventsConsistency();
193 }
194
195 virtual void OnSoundEnd(int caller_id) OVERRIDE {
196 sound_ended_ = true;
197 CheckEventsConsistency();
198 }
152 199
153 // testing::Test methods. 200 // testing::Test methods.
154 virtual void SetUp() OVERRIDE { 201 virtual void SetUp() OVERRIDE {
155 AudioInputController::set_factory_for_testing( 202 AudioInputController::set_factory_for_testing(
156 &audio_input_controller_factory_); 203 &audio_input_controller_factory_);
157 } 204 }
158 205
159 virtual void TearDown() OVERRIDE { 206 virtual void TearDown() OVERRIDE {
160 AudioInputController::set_factory_for_testing(NULL); 207 AudioInputController::set_factory_for_testing(NULL);
161 } 208 }
(...skipping 11 matching lines...) Expand all
173 value += factor; 220 value += factor;
174 audio_packet_[i] = value % 100; 221 audio_packet_[i] = value % 100;
175 } 222 }
176 } 223 }
177 224
178 protected: 225 protected:
179 MessageLoopForIO message_loop_; 226 MessageLoopForIO message_loop_;
180 BrowserThreadImpl io_thread_; 227 BrowserThreadImpl io_thread_;
181 scoped_refptr<SpeechRecognizerImpl> recognizer_; 228 scoped_refptr<SpeechRecognizerImpl> recognizer_;
182 scoped_ptr<AudioManager> audio_manager_; 229 scoped_ptr<AudioManager> audio_manager_;
183 bool audio_ended_; 230 bool recognition_started_;
184 bool recognition_ended_; 231 bool recognition_ended_;
185 bool result_received_; 232 bool result_received_;
186 bool audio_started_; 233 bool audio_started_;
234 bool audio_ended_;
235 bool sound_started_;
236 bool sound_ended_;
187 content::SpeechRecognitionErrorCode error_; 237 content::SpeechRecognitionErrorCode error_;
188 TestURLFetcherFactory url_fetcher_factory_; 238 TestURLFetcherFactory url_fetcher_factory_;
189 TestAudioInputControllerFactory audio_input_controller_factory_; 239 TestAudioInputControllerFactory audio_input_controller_factory_;
190 std::vector<uint8> audio_packet_; 240 std::vector<uint8> audio_packet_;
191 float volume_; 241 float volume_;
192 float noise_volume_; 242 float noise_volume_;
193 }; 243 };
194 244
195 TEST_F(SpeechRecognizerImplTest, StopNoData) { 245 TEST_F(SpeechRecognizerImplTest, StopNoData) {
196 // Check for callbacks when stopping record before any audio gets recorded. 246 // Check for callbacks when stopping record before any audio gets recorded.
197 recognizer_->StartRecognition(); 247 recognizer_->StartRecognition();
198 recognizer_->AbortRecognition(); 248 recognizer_->AbortRecognition();
199 EXPECT_FALSE(audio_ended_); 249 MessageLoop::current()->RunAllPending();
200 EXPECT_FALSE(recognition_ended_); 250 EXPECT_TRUE(recognition_started_);
251 EXPECT_FALSE(audio_started_);
201 EXPECT_FALSE(result_received_); 252 EXPECT_FALSE(result_received_);
202 EXPECT_FALSE(audio_started_);
203 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_NONE, error_); 253 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_NONE, error_);
254 CheckFinalEventsConsistency();
204 } 255 }
205 256
206 TEST_F(SpeechRecognizerImplTest, CancelNoData) { 257 TEST_F(SpeechRecognizerImplTest, CancelNoData) {
207 // Check for callbacks when canceling recognition before any audio gets 258 // Check for callbacks when canceling recognition before any audio gets
208 // recorded. 259 // recorded.
209 recognizer_->StartRecognition(); 260 recognizer_->StartRecognition();
210 recognizer_->StopAudioCapture(); 261 recognizer_->StopAudioCapture();
211 EXPECT_TRUE(audio_ended_); 262 MessageLoop::current()->RunAllPending();
212 EXPECT_TRUE(recognition_ended_); 263 EXPECT_TRUE(recognition_started_);
264 EXPECT_FALSE(audio_started_);
213 EXPECT_FALSE(result_received_); 265 EXPECT_FALSE(result_received_);
214 EXPECT_FALSE(audio_started_);
215 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_NONE, error_); 266 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_NONE, error_);
267 CheckFinalEventsConsistency();
216 } 268 }
217 269
218 TEST_F(SpeechRecognizerImplTest, StopWithData) { 270 TEST_F(SpeechRecognizerImplTest, StopWithData) {
219 // Start recording, give some data and then stop. This should wait for the 271 // Start recording, give some data and then stop. This should wait for the
220 // network callback to arrive before completion. 272 // network callback to arrive before completion.
221 recognizer_->StartRecognition(); 273 recognizer_->StartRecognition();
274 MessageLoop::current()->RunAllPending();
222 TestAudioInputController* controller = 275 TestAudioInputController* controller =
223 audio_input_controller_factory_.controller(); 276 audio_input_controller_factory_.controller();
224 ASSERT_TRUE(controller); 277 ASSERT_TRUE(controller);
225 278
226 // Try sending 5 chunks of mock audio data and verify that each of them 279 // Try sending 5 chunks of mock audio data and verify that each of them
227 // resulted immediately in a packet sent out via the network. This verifies 280 // resulted immediately in a packet sent out via the network. This verifies
228 // that we are streaming out encoded data as chunks without waiting for the 281 // that we are streaming out encoded data as chunks without waiting for the
229 // full recording to complete. 282 // full recording to complete.
230 const size_t kNumChunks = 5; 283 const size_t kNumChunks = 5;
231 for (size_t i = 0; i < kNumChunks; ++i) { 284 for (size_t i = 0; i < kNumChunks; ++i) {
232 controller->event_handler()->OnData(controller, &audio_packet_[0], 285 controller->event_handler()->OnData(controller, &audio_packet_[0],
233 audio_packet_.size()); 286 audio_packet_.size());
234 MessageLoop::current()->RunAllPending(); 287 MessageLoop::current()->RunAllPending();
235 TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); 288 TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0);
236 ASSERT_TRUE(fetcher); 289 ASSERT_TRUE(fetcher);
237 EXPECT_EQ(i + 1, fetcher->upload_chunks().size()); 290 EXPECT_EQ(i + 1, fetcher->upload_chunks().size());
238 } 291 }
239 292
240 recognizer_->StopAudioCapture(); 293 recognizer_->StopAudioCapture();
294 MessageLoop::current()->RunAllPending();
241 EXPECT_TRUE(audio_started_); 295 EXPECT_TRUE(audio_started_);
242 EXPECT_TRUE(audio_ended_); 296 EXPECT_TRUE(audio_ended_);
243 EXPECT_FALSE(recognition_ended_); 297 EXPECT_FALSE(recognition_ended_);
244 EXPECT_FALSE(result_received_); 298 EXPECT_FALSE(result_received_);
245 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_NONE, error_); 299 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_NONE, error_);
246 300
247 // Issue the network callback to complete the process. 301 // Issue the network callback to complete the process.
248 TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); 302 TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0);
249 ASSERT_TRUE(fetcher); 303 ASSERT_TRUE(fetcher);
250 304
251 fetcher->set_url(fetcher->GetOriginalURL()); 305 fetcher->set_url(fetcher->GetOriginalURL());
252 net::URLRequestStatus status; 306 net::URLRequestStatus status;
253 status.set_status(net::URLRequestStatus::SUCCESS); 307 status.set_status(net::URLRequestStatus::SUCCESS);
254 fetcher->set_status(status); 308 fetcher->set_status(status);
255 fetcher->set_response_code(200); 309 fetcher->set_response_code(200);
256 fetcher->SetResponseString( 310 fetcher->SetResponseString(
257 "{\"status\":0,\"hypotheses\":[{\"utterance\":\"123\"}]}"); 311 "{\"status\":0,\"hypotheses\":[{\"utterance\":\"123\"}]}");
258 fetcher->delegate()->OnURLFetchComplete(fetcher); 312 fetcher->delegate()->OnURLFetchComplete(fetcher);
259 313 MessageLoop::current()->RunAllPending();
260 EXPECT_TRUE(recognition_ended_); 314 EXPECT_TRUE(recognition_ended_);
261 EXPECT_TRUE(result_received_); 315 EXPECT_TRUE(result_received_);
262 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_NONE, error_); 316 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_NONE, error_);
317 CheckFinalEventsConsistency();
263 } 318 }
264 319
265 TEST_F(SpeechRecognizerImplTest, CancelWithData) { 320 TEST_F(SpeechRecognizerImplTest, CancelWithData) {
266 // Start recording, give some data and then cancel. This should create 321 // Start recording, give some data and then cancel.
267 // a network request but give no callbacks.
268 recognizer_->StartRecognition(); 322 recognizer_->StartRecognition();
323 MessageLoop::current()->RunAllPending();
269 TestAudioInputController* controller = 324 TestAudioInputController* controller =
270 audio_input_controller_factory_.controller(); 325 audio_input_controller_factory_.controller();
271 ASSERT_TRUE(controller); 326 ASSERT_TRUE(controller);
272 controller->event_handler()->OnData(controller, &audio_packet_[0], 327 controller->event_handler()->OnData(controller, &audio_packet_[0],
273 audio_packet_.size()); 328 audio_packet_.size());
274 MessageLoop::current()->RunAllPending(); 329 MessageLoop::current()->RunAllPending();
275 recognizer_->AbortRecognition(); 330 recognizer_->AbortRecognition();
331 MessageLoop::current()->RunAllPending();
276 ASSERT_TRUE(url_fetcher_factory_.GetFetcherByID(0)); 332 ASSERT_TRUE(url_fetcher_factory_.GetFetcherByID(0));
333 EXPECT_TRUE(recognition_started_);
277 EXPECT_TRUE(audio_started_); 334 EXPECT_TRUE(audio_started_);
278 EXPECT_FALSE(audio_ended_);
279 EXPECT_FALSE(recognition_ended_);
280 EXPECT_FALSE(result_received_); 335 EXPECT_FALSE(result_received_);
281 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_NONE, error_); 336 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_NONE, error_);
337 CheckFinalEventsConsistency();
282 } 338 }
283 339
284 TEST_F(SpeechRecognizerImplTest, ConnectionError) { 340 TEST_F(SpeechRecognizerImplTest, ConnectionError) {
285 // Start recording, give some data and then stop. Issue the network callback 341 // Start recording, give some data and then stop. Issue the network callback
286 // with a connection error and verify that the recognizer bubbles the error up 342 // with a connection error and verify that the recognizer bubbles the error up
287 recognizer_->StartRecognition(); 343 recognizer_->StartRecognition();
344 MessageLoop::current()->RunAllPending();
288 TestAudioInputController* controller = 345 TestAudioInputController* controller =
289 audio_input_controller_factory_.controller(); 346 audio_input_controller_factory_.controller();
290 ASSERT_TRUE(controller); 347 ASSERT_TRUE(controller);
291 controller->event_handler()->OnData(controller, &audio_packet_[0], 348 controller->event_handler()->OnData(controller, &audio_packet_[0],
292 audio_packet_.size()); 349 audio_packet_.size());
293 MessageLoop::current()->RunAllPending(); 350 MessageLoop::current()->RunAllPending();
294 TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); 351 TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0);
295 ASSERT_TRUE(fetcher); 352 ASSERT_TRUE(fetcher);
296 353
297 recognizer_->StopAudioCapture(); 354 recognizer_->StopAudioCapture();
355 MessageLoop::current()->RunAllPending();
298 EXPECT_TRUE(audio_started_); 356 EXPECT_TRUE(audio_started_);
299 EXPECT_TRUE(audio_ended_); 357 EXPECT_TRUE(audio_ended_);
300 EXPECT_FALSE(recognition_ended_); 358 EXPECT_FALSE(recognition_ended_);
301 EXPECT_FALSE(result_received_); 359 EXPECT_FALSE(result_received_);
302 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_NONE, error_); 360 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_NONE, error_);
303 361
304 // Issue the network callback to complete the process. 362 // Issue the network callback to complete the process.
305 fetcher->set_url(fetcher->GetOriginalURL()); 363 fetcher->set_url(fetcher->GetOriginalURL());
306 net::URLRequestStatus status; 364 net::URLRequestStatus status;
307 status.set_status(net::URLRequestStatus::FAILED); 365 status.set_status(net::URLRequestStatus::FAILED);
308 status.set_error(net::ERR_CONNECTION_REFUSED); 366 status.set_error(net::ERR_CONNECTION_REFUSED);
309 fetcher->set_status(status); 367 fetcher->set_status(status);
310 fetcher->set_response_code(0); 368 fetcher->set_response_code(0);
311 fetcher->SetResponseString(""); 369 fetcher->SetResponseString("");
312 fetcher->delegate()->OnURLFetchComplete(fetcher); 370 fetcher->delegate()->OnURLFetchComplete(fetcher);
313 371 MessageLoop::current()->RunAllPending();
314 EXPECT_FALSE(recognition_ended_); 372 EXPECT_TRUE(recognition_ended_);
315 EXPECT_FALSE(result_received_); 373 EXPECT_FALSE(result_received_);
316 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_NETWORK, error_); 374 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_NETWORK, error_);
375 CheckFinalEventsConsistency();
317 } 376 }
318 377
319 TEST_F(SpeechRecognizerImplTest, ServerError) { 378 TEST_F(SpeechRecognizerImplTest, ServerError) {
320 // Start recording, give some data and then stop. Issue the network callback 379 // Start recording, give some data and then stop. Issue the network callback
321 // with a 500 error and verify that the recognizer bubbles the error up 380 // with a 500 error and verify that the recognizer bubbles the error up
322 recognizer_->StartRecognition(); 381 recognizer_->StartRecognition();
382 MessageLoop::current()->RunAllPending();
323 TestAudioInputController* controller = 383 TestAudioInputController* controller =
324 audio_input_controller_factory_.controller(); 384 audio_input_controller_factory_.controller();
325 ASSERT_TRUE(controller); 385 ASSERT_TRUE(controller);
326 controller->event_handler()->OnData(controller, &audio_packet_[0], 386 controller->event_handler()->OnData(controller, &audio_packet_[0],
327 audio_packet_.size()); 387 audio_packet_.size());
328 MessageLoop::current()->RunAllPending(); 388 MessageLoop::current()->RunAllPending();
329 TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); 389 TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0);
330 ASSERT_TRUE(fetcher); 390 ASSERT_TRUE(fetcher);
331 391
332 recognizer_->StopAudioCapture(); 392 recognizer_->StopAudioCapture();
393 MessageLoop::current()->RunAllPending();
333 EXPECT_TRUE(audio_started_); 394 EXPECT_TRUE(audio_started_);
334 EXPECT_TRUE(audio_ended_); 395 EXPECT_TRUE(audio_ended_);
335 EXPECT_FALSE(recognition_ended_); 396 EXPECT_FALSE(recognition_ended_);
336 EXPECT_FALSE(result_received_); 397 EXPECT_FALSE(result_received_);
337 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_NONE, error_); 398 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_NONE, error_);
338 399
339 // Issue the network callback to complete the process. 400 // Issue the network callback to complete the process.
340 fetcher->set_url(fetcher->GetOriginalURL()); 401 fetcher->set_url(fetcher->GetOriginalURL());
341 net::URLRequestStatus status; 402 net::URLRequestStatus status;
342 status.set_status(net::URLRequestStatus::SUCCESS); 403 status.set_status(net::URLRequestStatus::SUCCESS);
343 fetcher->set_status(status); 404 fetcher->set_status(status);
344 fetcher->set_response_code(500); 405 fetcher->set_response_code(500);
345 fetcher->SetResponseString("Internal Server Error"); 406 fetcher->SetResponseString("Internal Server Error");
346 fetcher->delegate()->OnURLFetchComplete(fetcher); 407 fetcher->delegate()->OnURLFetchComplete(fetcher);
347 408 MessageLoop::current()->RunAllPending();
348 EXPECT_FALSE(recognition_ended_); 409 EXPECT_TRUE(recognition_ended_);
349 EXPECT_FALSE(result_received_); 410 EXPECT_FALSE(result_received_);
350 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_NETWORK, error_); 411 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_NETWORK, error_);
412 CheckFinalEventsConsistency();
351 } 413 }
352 414
353 TEST_F(SpeechRecognizerImplTest, AudioControllerErrorNoData) { 415 TEST_F(SpeechRecognizerImplTest, AudioControllerErrorNoData) {
354 // Check if things tear down properly if AudioInputController threw an error. 416 // Check if things tear down properly if AudioInputController threw an error.
355 recognizer_->StartRecognition(); 417 recognizer_->StartRecognition();
418 MessageLoop::current()->RunAllPending();
356 TestAudioInputController* controller = 419 TestAudioInputController* controller =
357 audio_input_controller_factory_.controller(); 420 audio_input_controller_factory_.controller();
358 ASSERT_TRUE(controller); 421 ASSERT_TRUE(controller);
359 controller->event_handler()->OnError(controller, 0); 422 controller->event_handler()->OnError(controller, 0);
360 MessageLoop::current()->RunAllPending(); 423 MessageLoop::current()->RunAllPending();
424 EXPECT_TRUE(recognition_started_);
361 EXPECT_FALSE(audio_started_); 425 EXPECT_FALSE(audio_started_);
362 EXPECT_FALSE(audio_ended_);
363 EXPECT_FALSE(recognition_ended_);
364 EXPECT_FALSE(result_received_); 426 EXPECT_FALSE(result_received_);
365 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_AUDIO, error_); 427 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_AUDIO, error_);
428 CheckFinalEventsConsistency();
366 } 429 }
367 430
368 TEST_F(SpeechRecognizerImplTest, AudioControllerErrorWithData) { 431 TEST_F(SpeechRecognizerImplTest, AudioControllerErrorWithData) {
369 // Check if things tear down properly if AudioInputController threw an error 432 // Check if things tear down properly if AudioInputController threw an error
370 // after giving some audio data. 433 // after giving some audio data.
371 recognizer_->StartRecognition(); 434 recognizer_->StartRecognition();
435 MessageLoop::current()->RunAllPending();
372 TestAudioInputController* controller = 436 TestAudioInputController* controller =
373 audio_input_controller_factory_.controller(); 437 audio_input_controller_factory_.controller();
374 ASSERT_TRUE(controller); 438 ASSERT_TRUE(controller);
375 controller->event_handler()->OnData(controller, &audio_packet_[0], 439 controller->event_handler()->OnData(controller, &audio_packet_[0],
376 audio_packet_.size()); 440 audio_packet_.size());
377 controller->event_handler()->OnError(controller, 0); 441 controller->event_handler()->OnError(controller, 0);
378 MessageLoop::current()->RunAllPending(); 442 MessageLoop::current()->RunAllPending();
379 ASSERT_TRUE(url_fetcher_factory_.GetFetcherByID(0)); 443 ASSERT_TRUE(url_fetcher_factory_.GetFetcherByID(0));
444 EXPECT_TRUE(recognition_started_);
380 EXPECT_TRUE(audio_started_); 445 EXPECT_TRUE(audio_started_);
381 EXPECT_FALSE(audio_ended_);
382 EXPECT_FALSE(recognition_ended_);
383 EXPECT_FALSE(result_received_); 446 EXPECT_FALSE(result_received_);
384 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_AUDIO, error_); 447 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_AUDIO, error_);
448 CheckFinalEventsConsistency();
385 } 449 }
386 450
387 TEST_F(SpeechRecognizerImplTest, NoSpeechCallbackIssued) { 451 TEST_F(SpeechRecognizerImplTest, NoSpeechCallbackIssued) {
388 // Start recording and give a lot of packets with audio samples set to zero. 452 // Start recording and give a lot of packets with audio samples set to zero.
389 // This should trigger the no-speech detector and issue a callback. 453 // This should trigger the no-speech detector and issue a callback.
390 recognizer_->StartRecognition(); 454 recognizer_->StartRecognition();
455 MessageLoop::current()->RunAllPending();
391 TestAudioInputController* controller = 456 TestAudioInputController* controller =
392 audio_input_controller_factory_.controller(); 457 audio_input_controller_factory_.controller();
393 ASSERT_TRUE(controller); 458 ASSERT_TRUE(controller);
394 controller = audio_input_controller_factory_.controller();
395 ASSERT_TRUE(controller);
396 459
397 int num_packets = (SpeechRecognizerImpl::kNoSpeechTimeoutMs) / 460 int num_packets = (SpeechRecognizerImpl::kNoSpeechTimeoutMs) /
398 GoogleOneShotRemoteEngine::kAudioPacketIntervalMs; 461 GoogleOneShotRemoteEngine::kAudioPacketIntervalMs + 1;
399 // The vector is already filled with zero value samples on create. 462 // The vector is already filled with zero value samples on create.
400 for (int i = 0; i < num_packets; ++i) { 463 for (int i = 0; i < num_packets; ++i) {
401 controller->event_handler()->OnData(controller, &audio_packet_[0], 464 controller->event_handler()->OnData(controller, &audio_packet_[0],
402 audio_packet_.size()); 465 audio_packet_.size());
403 } 466 }
404 MessageLoop::current()->RunAllPending(); 467 MessageLoop::current()->RunAllPending();
468 EXPECT_TRUE(recognition_started_);
405 EXPECT_TRUE(audio_started_); 469 EXPECT_TRUE(audio_started_);
406 EXPECT_FALSE(audio_ended_);
407 EXPECT_FALSE(recognition_ended_);
408 EXPECT_FALSE(result_received_); 470 EXPECT_FALSE(result_received_);
409 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_NO_SPEECH, error_); 471 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_NO_SPEECH, error_);
472 CheckFinalEventsConsistency();
410 } 473 }
411 474
412 TEST_F(SpeechRecognizerImplTest, NoSpeechCallbackNotIssued) { 475 TEST_F(SpeechRecognizerImplTest, NoSpeechCallbackNotIssued) {
413 // Start recording and give a lot of packets with audio samples set to zero 476 // Start recording and give a lot of packets with audio samples set to zero
414 // and then some more with reasonably loud audio samples. This should be 477 // and then some more with reasonably loud audio samples. This should be
415 // treated as normal speech input and the no-speech detector should not get 478 // treated as normal speech input and the no-speech detector should not get
416 // triggered. 479 // triggered.
417 recognizer_->StartRecognition(); 480 recognizer_->StartRecognition();
481 MessageLoop::current()->RunAllPending();
418 TestAudioInputController* controller = 482 TestAudioInputController* controller =
419 audio_input_controller_factory_.controller(); 483 audio_input_controller_factory_.controller();
420 ASSERT_TRUE(controller); 484 ASSERT_TRUE(controller);
421 controller = audio_input_controller_factory_.controller(); 485 controller = audio_input_controller_factory_.controller();
422 ASSERT_TRUE(controller); 486 ASSERT_TRUE(controller);
423 487
424 int num_packets = (SpeechRecognizerImpl::kNoSpeechTimeoutMs) / 488 int num_packets = (SpeechRecognizerImpl::kNoSpeechTimeoutMs) /
425 GoogleOneShotRemoteEngine::kAudioPacketIntervalMs; 489 GoogleOneShotRemoteEngine::kAudioPacketIntervalMs;
426 490
427 // The vector is already filled with zero value samples on create. 491 // The vector is already filled with zero value samples on create.
428 for (int i = 0; i < num_packets / 2; ++i) { 492 for (int i = 0; i < num_packets / 2; ++i) {
429 controller->event_handler()->OnData(controller, &audio_packet_[0], 493 controller->event_handler()->OnData(controller, &audio_packet_[0],
430 audio_packet_.size()); 494 audio_packet_.size());
431 } 495 }
432 496
433 FillPacketWithTestWaveform(); 497 FillPacketWithTestWaveform();
434 for (int i = 0; i < num_packets / 2; ++i) { 498 for (int i = 0; i < num_packets / 2; ++i) {
435 controller->event_handler()->OnData(controller, &audio_packet_[0], 499 controller->event_handler()->OnData(controller, &audio_packet_[0],
436 audio_packet_.size()); 500 audio_packet_.size());
437 } 501 }
438 502
439 MessageLoop::current()->RunAllPending(); 503 MessageLoop::current()->RunAllPending();
440 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_NONE, error_); 504 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_NONE, error_);
441 EXPECT_TRUE(audio_started_); 505 EXPECT_TRUE(audio_started_);
442 EXPECT_FALSE(audio_ended_); 506 EXPECT_FALSE(audio_ended_);
443 EXPECT_FALSE(recognition_ended_); 507 EXPECT_FALSE(recognition_ended_);
444 recognizer_->AbortRecognition(); 508 recognizer_->AbortRecognition();
509 MessageLoop::current()->RunAllPending();
510 CheckFinalEventsConsistency();
445 } 511 }
446 512
447 TEST_F(SpeechRecognizerImplTest, SetInputVolumeCallback) { 513 TEST_F(SpeechRecognizerImplTest, SetInputVolumeCallback) {
448 // Start recording and give a lot of packets with audio samples set to zero 514 // Start recording and give a lot of packets with audio samples set to zero
449 // and then some more with reasonably loud audio samples. Check that we don't 515 // and then some more with reasonably loud audio samples. Check that we don't
450 // get the callback during estimation phase, then get zero for the silence 516 // get the callback during estimation phase, then get zero for the silence
451 // samples and proper volume for the loud audio. 517 // samples and proper volume for the loud audio.
452 recognizer_->StartRecognition(); 518 recognizer_->StartRecognition();
519 MessageLoop::current()->RunAllPending();
453 TestAudioInputController* controller = 520 TestAudioInputController* controller =
454 audio_input_controller_factory_.controller(); 521 audio_input_controller_factory_.controller();
455 ASSERT_TRUE(controller); 522 ASSERT_TRUE(controller);
456 controller = audio_input_controller_factory_.controller(); 523 controller = audio_input_controller_factory_.controller();
457 ASSERT_TRUE(controller); 524 ASSERT_TRUE(controller);
458 525
459 // Feed some samples to begin with for the endpointer to do noise estimation. 526 // Feed some samples to begin with for the endpointer to do noise estimation.
460 int num_packets = SpeechRecognizerImpl::kEndpointerEstimationTimeMs / 527 int num_packets = SpeechRecognizerImpl::kEndpointerEstimationTimeMs /
461 GoogleOneShotRemoteEngine::kAudioPacketIntervalMs; 528 GoogleOneShotRemoteEngine::kAudioPacketIntervalMs;
462 FillPacketWithNoise(); 529 FillPacketWithNoise();
(...skipping 14 matching lines...) Expand all
477 controller->event_handler()->OnData(controller, &audio_packet_[0], 544 controller->event_handler()->OnData(controller, &audio_packet_[0],
478 audio_packet_.size()); 545 audio_packet_.size());
479 MessageLoop::current()->RunAllPending(); 546 MessageLoop::current()->RunAllPending();
480 EXPECT_FLOAT_EQ(0.89926866f, volume_); 547 EXPECT_FLOAT_EQ(0.89926866f, volume_);
481 EXPECT_FLOAT_EQ(0.75071919f, noise_volume_); 548 EXPECT_FLOAT_EQ(0.75071919f, noise_volume_);
482 549
483 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_NONE, error_); 550 EXPECT_EQ(content::SPEECH_RECOGNITION_ERROR_NONE, error_);
484 EXPECT_FALSE(audio_ended_); 551 EXPECT_FALSE(audio_ended_);
485 EXPECT_FALSE(recognition_ended_); 552 EXPECT_FALSE(recognition_ended_);
486 recognizer_->AbortRecognition(); 553 recognizer_->AbortRecognition();
554 MessageLoop::current()->RunAllPending();
555 CheckFinalEventsConsistency();
487 } 556 }
488 557
489 } // namespace speech 558 } // namespace speech
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698