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

Side by Side Diff: device/bluetooth/bluetooth_audio_sink_chromeos_unittest.cc

Issue 993273002: device/bluetooth: Add I/O watcher for audio data retrieval triggered by state change. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 9 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
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/memory/ref_counted.h" 9 #include "base/memory/ref_counted.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
(...skipping 16 matching lines...) Expand all
27 using device::BluetoothAdapterFactory; 27 using device::BluetoothAdapterFactory;
28 using device::BluetoothAudioSink; 28 using device::BluetoothAudioSink;
29 29
30 namespace chromeos { 30 namespace chromeos {
31 31
32 class TestAudioSinkObserver : public BluetoothAudioSink::Observer { 32 class TestAudioSinkObserver : public BluetoothAudioSink::Observer {
33 public: 33 public:
34 explicit TestAudioSinkObserver(scoped_refptr<BluetoothAudioSink> audio_sink) 34 explicit TestAudioSinkObserver(scoped_refptr<BluetoothAudioSink> audio_sink)
35 : state_changed_count_(0), 35 : state_changed_count_(0),
36 volume_changed_count_(0), 36 volume_changed_count_(0),
37 total_read_(0),
37 state_(audio_sink->GetState()), 38 state_(audio_sink->GetState()),
38 audio_sink_(audio_sink) { 39 audio_sink_(audio_sink) {
39 audio_sink_->AddObserver(this); 40 audio_sink_->AddObserver(this);
40 } 41 }
41 42
42 ~TestAudioSinkObserver() override { audio_sink_->RemoveObserver(this); } 43 ~TestAudioSinkObserver() override { audio_sink_->RemoveObserver(this); }
43 44
44 void BluetoothAudioSinkStateChanged( 45 void BluetoothAudioSinkStateChanged(
45 BluetoothAudioSink* audio_sink, 46 BluetoothAudioSink* audio_sink,
46 BluetoothAudioSink::State state) override { 47 BluetoothAudioSink::State state) override {
48 if (state == BluetoothAudioSink::STATE_IDLE)
49 total_read_ = 0;
50
47 ++state_changed_count_; 51 ++state_changed_count_;
48 } 52 }
49 53
50 void BluetoothAudioSinkVolumeChanged(BluetoothAudioSink* audio_sink, 54 void BluetoothAudioSinkVolumeChanged(BluetoothAudioSink* audio_sink,
51 uint16_t volume) override { 55 uint16_t volume) override {
52 ++volume_changed_count_; 56 ++volume_changed_count_;
53 } 57 }
54 58
59 void BluetoothAudioSinkDataAvailable(BluetoothAudioSink* audio_sink,
60 char* data,
61 size_t size) override {
62 total_read_ += size;
63 }
64
55 int state_changed_count_; 65 int state_changed_count_;
56 int volume_changed_count_; 66 int volume_changed_count_;
67 int data_available_count_;
68 size_t total_read_;
57 BluetoothAudioSink::State state_; 69 BluetoothAudioSink::State state_;
58 70
59 private: 71 private:
60 scoped_refptr<BluetoothAudioSink> audio_sink_; 72 scoped_refptr<BluetoothAudioSink> audio_sink_;
61 }; 73 };
62 74
63 class BluetoothAudioSinkChromeOSTest : public testing::Test { 75 class BluetoothAudioSinkChromeOSTest : public testing::Test {
64 public: 76 public:
65 void SetUp() override { 77 void SetUp() override {
66 DBusThreadManager::Initialize(); 78 DBusThreadManager::Initialize();
67 79
68 callback_count_ = 0; 80 callback_count_ = 0;
69 error_callback_count_ = 0; 81 error_callback_count_ = 0;
70 82
83 fake_media_ = static_cast<FakeBluetoothMediaClient*>(
84 DBusThreadManager::Get()->GetBluetoothMediaClient());
85 fake_transport_ = static_cast<FakeBluetoothMediaTransportClient*>(
86 DBusThreadManager::Get()->GetBluetoothMediaTransportClient());
87
71 // Initiates Delegate::TransportProperties with default values. 88 // Initiates Delegate::TransportProperties with default values.
72 properties_.device = 89 properties_.device =
73 ObjectPath(FakeBluetoothMediaTransportClient::kTransportDevicePath); 90 ObjectPath(FakeBluetoothMediaTransportClient::kTransportDevicePath);
74 properties_.uuid = BluetoothMediaClient::kBluetoothAudioSinkUUID; 91 properties_.uuid = BluetoothMediaClient::kBluetoothAudioSinkUUID;
75 properties_.codec = FakeBluetoothMediaTransportClient::kTransportCodec; 92 properties_.codec = FakeBluetoothMediaTransportClient::kTransportCodec;
76 properties_.configuration = 93 properties_.configuration =
77 FakeBluetoothMediaTransportClient::kTransportConfiguration; 94 FakeBluetoothMediaTransportClient::kTransportConfiguration;
78 properties_.state = BluetoothMediaTransportClient::kStateIdle; 95 properties_.state = BluetoothMediaTransportClient::kStateIdle;
79 properties_.delay.reset( 96 properties_.delay.reset(
80 new uint16_t(FakeBluetoothMediaTransportClient::kTransportDelay)); 97 new uint16_t(FakeBluetoothMediaTransportClient::kTransportDelay));
81 properties_.volume.reset( 98 properties_.volume.reset(
82 new uint16_t(FakeBluetoothMediaTransportClient::kTransportVolume)); 99 new uint16_t(FakeBluetoothMediaTransportClient::kTransportVolume));
83 100
84 media_ = static_cast<FakeBluetoothMediaClient*>(
85 DBusThreadManager::Get()->GetBluetoothMediaClient());
86 transport_ = static_cast<FakeBluetoothMediaTransportClient*>(
87 DBusThreadManager::Get()->GetBluetoothMediaTransportClient());
88
89 GetAdapter(); 101 GetAdapter();
90 } 102 }
91 103
92 void TearDown() override { 104 void TearDown() override {
93 callback_count_ = 0; 105 callback_count_ = 0;
94 error_callback_count_ = 0; 106 error_callback_count_ = 0;
95 observer_.reset(); 107 observer_.reset();
96 108
97 media_->SetVisible(true); 109 fake_media_->SetVisible(true);
98 110
99 // The adapter should outlive audio sink. 111 // The adapter should outlive audio sink.
100 audio_sink_ = nullptr; 112 audio_sink_ = nullptr;
101 adapter_ = nullptr; 113 adapter_ = nullptr;
102 DBusThreadManager::Shutdown(); 114 DBusThreadManager::Shutdown();
103 } 115 }
104 116
105 // Gets the existing Bluetooth adapter. 117 // Gets the existing Bluetooth adapter.
106 void GetAdapter() { 118 void GetAdapter() {
107 BluetoothAdapterFactory::GetAdapter( 119 BluetoothAdapterFactory::GetAdapter(
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 } 177 }
166 178
167 // Called whenever RegisterAudioSink is completed successfully. 179 // Called whenever RegisterAudioSink is completed successfully.
168 void RegisterCallback( 180 void RegisterCallback(
169 scoped_refptr<BluetoothAudioSink> audio_sink) { 181 scoped_refptr<BluetoothAudioSink> audio_sink) {
170 ++callback_count_; 182 ++callback_count_;
171 audio_sink_ = audio_sink; 183 audio_sink_ = audio_sink;
172 184
173 GetFakeMediaEndpoint(); 185 GetFakeMediaEndpoint();
174 ASSERT_NE(media_endpoint_, nullptr); 186 ASSERT_NE(media_endpoint_, nullptr);
175 media_->SetEndpointRegistered(media_endpoint_, true); 187 fake_media_->SetEndpointRegistered(media_endpoint_, true);
176 188
177 ASSERT_NE(audio_sink_.get(), nullptr); 189 ASSERT_NE(audio_sink_.get(), nullptr);
178 ASSERT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED); 190 ASSERT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
179 } 191 }
180 192
181 // Called whenever RegisterAudioSink failed. 193 // Called whenever RegisterAudioSink failed.
182 void RegisterErrorCallback(BluetoothAudioSink::ErrorCode error_code) { 194 void RegisterErrorCallback(BluetoothAudioSink::ErrorCode error_code) {
183 ++error_callback_count_; 195 ++error_callback_count_;
184 EXPECT_EQ(error_code, BluetoothAudioSink::ERROR_NOT_REGISTERED); 196 EXPECT_EQ(error_code, BluetoothAudioSink::ERROR_NOT_REGISTERED);
185 } 197 }
(...skipping 18 matching lines...) Expand all
204 } 216 }
205 217
206 void ErrorCallback() { 218 void ErrorCallback() {
207 ++error_callback_count_; 219 ++error_callback_count_;
208 } 220 }
209 221
210 protected: 222 protected:
211 int callback_count_; 223 int callback_count_;
212 int error_callback_count_; 224 int error_callback_count_;
213 225
214 base::MessageLoop message_loop_; 226 base::MessageLoopForIO message_loop_;
215 227
216 FakeBluetoothMediaClient* media_; 228 FakeBluetoothMediaClient* fake_media_;
217 FakeBluetoothMediaTransportClient* transport_; 229 FakeBluetoothMediaTransportClient* fake_transport_;
218 FakeBluetoothMediaEndpointServiceProvider* media_endpoint_; 230 FakeBluetoothMediaEndpointServiceProvider* media_endpoint_;
219 scoped_ptr<TestAudioSinkObserver> observer_; 231 scoped_ptr<TestAudioSinkObserver> observer_;
220 scoped_refptr<BluetoothAdapter> adapter_; 232 scoped_refptr<BluetoothAdapter> adapter_;
221 scoped_refptr<BluetoothAudioSink> audio_sink_; 233 scoped_refptr<BluetoothAudioSink> audio_sink_;
222 234
223 // The default property set used while calling SetConfiguration on a media 235 // The default property set used while calling SetConfiguration on a media
224 // endpoint object. 236 // endpoint object.
225 BluetoothMediaEndpointServiceProvider::Delegate::TransportProperties 237 BluetoothMediaEndpointServiceProvider::Delegate::TransportProperties
226 properties_; 238 properties_;
227 }; 239 };
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
288 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED); 300 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
289 EXPECT_EQ(callback_count_, 2); 301 EXPECT_EQ(callback_count_, 2);
290 EXPECT_EQ(error_callback_count_, 0); 302 EXPECT_EQ(error_callback_count_, 0);
291 EXPECT_EQ(observer_->state_changed_count_, 0); 303 EXPECT_EQ(observer_->state_changed_count_, 0);
292 EXPECT_EQ(observer_->volume_changed_count_, 0); 304 EXPECT_EQ(observer_->volume_changed_count_, 0);
293 305
294 // Simulates calling SetConfiguration on the media endpoint object owned by 306 // Simulates calling SetConfiguration on the media endpoint object owned by
295 // |audio_sink_| with a fake transport path and a 307 // |audio_sink_| with a fake transport path and a
296 // Delegate::TransportProperties structure. 308 // Delegate::TransportProperties structure.
297 media_endpoint_->SetConfiguration( 309 media_endpoint_->SetConfiguration(
298 transport_->GetTransportPath(media_endpoint_->object_path()), 310 fake_transport_->GetTransportPath(media_endpoint_->object_path()),
299 properties_); 311 properties_);
300 312
301 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE); 313 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
302 EXPECT_EQ(callback_count_, 2); 314 EXPECT_EQ(callback_count_, 2);
303 EXPECT_EQ(error_callback_count_, 0); 315 EXPECT_EQ(error_callback_count_, 0);
304 EXPECT_EQ(observer_->state_changed_count_, 1); 316 EXPECT_EQ(observer_->state_changed_count_, 1);
305 EXPECT_EQ(observer_->volume_changed_count_, 1); 317 EXPECT_EQ(observer_->volume_changed_count_, 1);
306 } 318 }
307 319
308 TEST_F(BluetoothAudioSinkChromeOSTest, SetConfigurationWithUnexpectedState) { 320 TEST_F(BluetoothAudioSinkChromeOSTest, SetConfigurationWithUnexpectedState) {
309 GetAudioSink(); 321 GetAudioSink();
310 322
311 media_endpoint_->SelectConfiguration( 323 media_endpoint_->SelectConfiguration(
312 std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}), 324 std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}),
313 base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback, 325 base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
314 base::Unretained(this))); 326 base::Unretained(this)));
315 327
316 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED); 328 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
317 EXPECT_EQ(callback_count_, 2); 329 EXPECT_EQ(callback_count_, 2);
318 EXPECT_EQ(error_callback_count_, 0); 330 EXPECT_EQ(error_callback_count_, 0);
319 EXPECT_EQ(observer_->state_changed_count_, 0); 331 EXPECT_EQ(observer_->state_changed_count_, 0);
320 EXPECT_EQ(observer_->volume_changed_count_, 0); 332 EXPECT_EQ(observer_->volume_changed_count_, 0);
321 333
322 // Set state of Delegate::TransportProperties with an unexpected value. 334 // Set state of Delegate::TransportProperties with an unexpected value.
323 properties_.state = "pending"; 335 properties_.state = "pending";
324 336
325 media_endpoint_->SetConfiguration( 337 media_endpoint_->SetConfiguration(
326 transport_->GetTransportPath(media_endpoint_->object_path()), 338 fake_transport_->GetTransportPath(media_endpoint_->object_path()),
327 properties_); 339 properties_);
328 340
329 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED); 341 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
330 EXPECT_EQ(callback_count_, 2); 342 EXPECT_EQ(callback_count_, 2);
331 EXPECT_EQ(error_callback_count_, 0); 343 EXPECT_EQ(error_callback_count_, 0);
332 EXPECT_EQ(observer_->state_changed_count_, 0); 344 EXPECT_EQ(observer_->state_changed_count_, 0);
333 EXPECT_EQ(observer_->volume_changed_count_, 0); 345 EXPECT_EQ(observer_->volume_changed_count_, 0);
334 } 346 }
335 347
336 // TODO(mcchou): Adds test on media-removed events for STATE_PENDING and
337 // STATE_ACTIVE.
338 // Checks if the observer is notified on media-removed event when the state of 348 // Checks if the observer is notified on media-removed event when the state of
339 // |audio_sink_| is STATE_DISCONNECTED. Once the media object is removed, the 349 // |audio_sink_| is STATE_DISCONNECTED. Once the media object is removed, the
340 // audio sink is no longer valid. 350 // audio sink is no longer valid.
341 TEST_F(BluetoothAudioSinkChromeOSTest, MediaRemovedDuringDisconnectedState) { 351 TEST_F(BluetoothAudioSinkChromeOSTest, MediaRemovedDuringDisconnectedState) {
342 GetAudioSink(); 352 GetAudioSink();
343 353
344 // Gets the media object and makes it invisible to see if the state of the 354 // Gets the media object and makes it invisible to see if the state of the
345 // audio sink changes accordingly. 355 // audio sink changes accordingly.
346 media_->SetVisible(false); 356 fake_media_->SetVisible(false);
347 357
348 GetFakeMediaEndpoint(); 358 GetFakeMediaEndpoint();
349 359
350 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_INVALID); 360 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_INVALID);
351 EXPECT_EQ(media_endpoint_, nullptr); 361 EXPECT_EQ(media_endpoint_, nullptr);
352 EXPECT_EQ(observer_->state_changed_count_, 1); 362 EXPECT_EQ(observer_->state_changed_count_, 1);
353 EXPECT_EQ(observer_->volume_changed_count_, 0); 363 EXPECT_EQ(observer_->volume_changed_count_, 0);
354 } 364 }
355 365
356 // Checks if the observer is notified on media-removed event when the state of 366 // Checks if the observer is notified on media-removed event when the state of
357 // |audio_sink_| is STATE_IDLE. Once the media object is removed, the audio sink 367 // |audio_sink_| is STATE_IDLE. Once the media object is removed, the audio sink
358 // is no longer valid. 368 // is no longer valid.
359 TEST_F(BluetoothAudioSinkChromeOSTest, MediaRemovedDuringIdleState) { 369 TEST_F(BluetoothAudioSinkChromeOSTest, MediaRemovedDuringIdleState) {
360 GetAudioSink(); 370 GetAudioSink();
361 371
362 media_endpoint_->SelectConfiguration( 372 media_endpoint_->SelectConfiguration(
363 std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}), 373 std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}),
364 base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback, 374 base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
365 base::Unretained(this))); 375 base::Unretained(this)));
366 376
367 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED); 377 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
368 EXPECT_EQ(callback_count_, 2); 378 EXPECT_EQ(callback_count_, 2);
369 EXPECT_EQ(error_callback_count_, 0); 379 EXPECT_EQ(error_callback_count_, 0);
370 EXPECT_EQ(observer_->state_changed_count_, 0); 380 EXPECT_EQ(observer_->state_changed_count_, 0);
371 EXPECT_EQ(observer_->volume_changed_count_, 0); 381 EXPECT_EQ(observer_->volume_changed_count_, 0);
372 382
373 media_endpoint_->SetConfiguration( 383 media_endpoint_->SetConfiguration(
374 transport_->GetTransportPath(media_endpoint_->object_path()), 384 fake_transport_->GetTransportPath(media_endpoint_->object_path()),
375 properties_); 385 properties_);
376 386
377 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE); 387 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
378 EXPECT_EQ(callback_count_, 2); 388 EXPECT_EQ(callback_count_, 2);
379 EXPECT_EQ(error_callback_count_, 0); 389 EXPECT_EQ(error_callback_count_, 0);
380 EXPECT_EQ(observer_->state_changed_count_, 1); 390 EXPECT_EQ(observer_->state_changed_count_, 1);
381 EXPECT_EQ(observer_->volume_changed_count_, 1); 391 EXPECT_EQ(observer_->volume_changed_count_, 1);
382 392
383 // Gets the media object and makes it invisible to see if the state of the 393 // Gets the media object and makes it invisible to see if the state of the
384 // audio sink changes accordingly. 394 // audio sink changes accordingly.
385 media_->SetVisible(false); 395 fake_media_->SetVisible(false);
386 396
387 GetFakeMediaEndpoint(); 397 GetFakeMediaEndpoint();
388 398
389 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_INVALID); 399 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_INVALID);
390 EXPECT_EQ(media_endpoint_, nullptr); 400 EXPECT_EQ(media_endpoint_, nullptr);
391 401
392 // The state becomes disconnted and then invalid, since the removal of 402 // The state becomes disconnted and then invalid, since the removal of
393 // transport object should happend before media becomes invisible. 403 // transport object should happend before media becomes invisible.
394 // State: STATE_IDLE -> STATE_DISCONNECTED -> STATE_INVALID 404 // State: STATE_IDLE -> STATE_DISCONNECTED -> STATE_INVALID
395 EXPECT_EQ(observer_->state_changed_count_, 3); 405 EXPECT_EQ(observer_->state_changed_count_, 3);
396 EXPECT_EQ(observer_->volume_changed_count_, 2); 406 EXPECT_EQ(observer_->volume_changed_count_, 2);
397 } 407 }
398 408
399 // TODO(mcchou): Add tests on transport-removed event for STATE_PENDING and 409 TEST_F(BluetoothAudioSinkChromeOSTest, MediaRemovedDuringActiveState) {
400 // STATE_ACTIVE. 410 GetAudioSink();
411
412 media_endpoint_->SelectConfiguration(
413 std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}),
414 base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
415 base::Unretained(this)));
416
417 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
418 EXPECT_EQ(callback_count_, 2);
419 EXPECT_EQ(error_callback_count_, 0);
420 EXPECT_EQ(observer_->state_changed_count_, 0);
421 EXPECT_EQ(observer_->volume_changed_count_, 0);
422
423 media_endpoint_->SetConfiguration(
424 fake_transport_->GetTransportPath(media_endpoint_->object_path()),
425 properties_);
426
427 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
428 EXPECT_EQ(callback_count_, 2);
429 EXPECT_EQ(error_callback_count_, 0);
430 EXPECT_EQ(observer_->state_changed_count_, 1);
431 EXPECT_EQ(observer_->volume_changed_count_, 1);
432
433 fake_transport_->SetState(media_endpoint_->object_path(), "pending");
434
435 message_loop_.RunUntilIdle();
436
437 // Acquire is called when the state of |audio_sink_| becomes STATE_PENDING,
438 // and Acquire will trigger state change. Therefore, the state will be
439 // STATE_ACTIVE right after STATE_PENDING.
440 // State: STATE_IDLE -> STATE_PENDING -> STATE_ACTIVE
441 EXPECT_EQ(observer_->state_changed_count_, 3);
442
443 // Gets the media object and makes it invisible to see if the state of the
444 // audio sink changes accordingly.
445 fake_media_->SetVisible(false);
446
447 GetFakeMediaEndpoint();
448
449 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_INVALID);
450 EXPECT_EQ(media_endpoint_, nullptr);
451
452 // The state becomes disconnted and then invalid, since the removal of
453 // transport object should happend before media becomes invisible.
454 // State: STATE_ACTIVE -> STATE_DISCONNECTED -> STATE_INVALID
455 EXPECT_EQ(observer_->state_changed_count_, 5);
456 EXPECT_EQ(observer_->volume_changed_count_, 2);
457 }
458
401 // Checks if the observer is notified on transport-removed event when the state 459 // Checks if the observer is notified on transport-removed event when the state
402 // of |audio_sink_| is STATE_IDEL. Once the media transport object is removed, 460 // of |audio_sink_| is STATE_IDEL. Once the media transport object is removed,
403 // the audio sink is disconnected. 461 // the audio sink is disconnected.
404 TEST_F(BluetoothAudioSinkChromeOSTest, TransportRemovedDuringIdleState) { 462 TEST_F(BluetoothAudioSinkChromeOSTest, TransportRemovedDuringIdleState) {
405 GetAudioSink(); 463 GetAudioSink();
406 464
407 media_endpoint_->SelectConfiguration( 465 media_endpoint_->SelectConfiguration(
408 std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}), 466 std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}),
409 base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback, 467 base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
410 base::Unretained(this))); 468 base::Unretained(this)));
411 469
412 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED); 470 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
413 EXPECT_EQ(callback_count_, 2); 471 EXPECT_EQ(callback_count_, 2);
414 EXPECT_EQ(error_callback_count_, 0); 472 EXPECT_EQ(error_callback_count_, 0);
415 EXPECT_EQ(observer_->state_changed_count_, 0); 473 EXPECT_EQ(observer_->state_changed_count_, 0);
416 EXPECT_EQ(observer_->volume_changed_count_, 0); 474 EXPECT_EQ(observer_->volume_changed_count_, 0);
417 475
418 media_endpoint_->SetConfiguration( 476 media_endpoint_->SetConfiguration(
419 transport_->GetTransportPath(media_endpoint_->object_path()), 477 fake_transport_->GetTransportPath(media_endpoint_->object_path()),
420 properties_); 478 properties_);
421 479
422 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE); 480 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
423 EXPECT_EQ(callback_count_, 2); 481 EXPECT_EQ(callback_count_, 2);
424 EXPECT_EQ(error_callback_count_, 0); 482 EXPECT_EQ(error_callback_count_, 0);
425 EXPECT_EQ(observer_->state_changed_count_, 1); 483 EXPECT_EQ(observer_->state_changed_count_, 1);
426 EXPECT_EQ(observer_->volume_changed_count_, 1); 484 EXPECT_EQ(observer_->volume_changed_count_, 1);
427 485
428 // Makes the transport object invalid to see if the state of the audio sink 486 // Makes the transport object invalid to see if the state of the audio sink
429 // changes accordingly. 487 // changes accordingly.
430 transport_->SetValid(media_endpoint_, false); 488 fake_transport_->SetValid(media_endpoint_, false);
431 489
432 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED); 490 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
433 EXPECT_NE(media_endpoint_, nullptr); 491 EXPECT_NE(media_endpoint_, nullptr);
434 EXPECT_EQ(observer_->state_changed_count_, 2); 492 EXPECT_EQ(observer_->state_changed_count_, 2);
435 EXPECT_EQ(observer_->volume_changed_count_, 2); 493 EXPECT_EQ(observer_->volume_changed_count_, 2);
436 } 494 }
437 495
496 TEST_F(BluetoothAudioSinkChromeOSTest, TransportRemovedDuringActiveState) {
497 GetAudioSink();
498
499 media_endpoint_->SelectConfiguration(
500 std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}),
501 base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
502 base::Unretained(this)));
503
504 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
505 EXPECT_EQ(callback_count_, 2);
506 EXPECT_EQ(error_callback_count_, 0);
507 EXPECT_EQ(observer_->state_changed_count_, 0);
508 EXPECT_EQ(observer_->volume_changed_count_, 0);
509
510 media_endpoint_->SetConfiguration(
511 fake_transport_->GetTransportPath(media_endpoint_->object_path()),
512 properties_);
513
514 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
515 EXPECT_EQ(callback_count_, 2);
516 EXPECT_EQ(error_callback_count_, 0);
517 EXPECT_EQ(observer_->state_changed_count_, 1);
518 EXPECT_EQ(observer_->volume_changed_count_, 1);
519
520 fake_transport_->SetState(media_endpoint_->object_path(), "pending");
521
522 message_loop_.RunUntilIdle();
523
524 // Acquire is called when the state of |audio_sink_| becomes STATE_PENDING,
525 // and Acquire will trigger state change. Therefore, the state will be
526 // STATE_ACTIVE right after STATE_PENDING.
527 // State: STATE_IDLE -> STATE_PENDING -> STATE_ACTIVE
528 EXPECT_EQ(observer_->state_changed_count_, 3);
529
530 // Makes the transport object invalid to see if the state of the audio sink
531 // changes accordingly.
532 fake_transport_->SetValid(media_endpoint_, false);
533
534 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
535 EXPECT_NE(media_endpoint_, nullptr);
536 EXPECT_EQ(observer_->state_changed_count_, 4);
537 EXPECT_EQ(observer_->volume_changed_count_, 2);
538 }
539
438 TEST_F(BluetoothAudioSinkChromeOSTest, 540 TEST_F(BluetoothAudioSinkChromeOSTest,
439 AdapterPoweredChangedDuringDisconnectedState) { 541 AdapterPoweredChangedDuringDisconnectedState) {
440 GetAudioSink(); 542 GetAudioSink();
441 543
442 adapter_->SetPowered( 544 adapter_->SetPowered(
443 false, 545 false,
444 base::Bind(&BluetoothAudioSinkChromeOSTest::Callback, 546 base::Bind(&BluetoothAudioSinkChromeOSTest::Callback,
445 base::Unretained(this)), 547 base::Unretained(this)),
446 base::Bind(&BluetoothAudioSinkChromeOSTest::ErrorCallback, 548 base::Bind(&BluetoothAudioSinkChromeOSTest::ErrorCallback,
447 base::Unretained(this))); 549 base::Unretained(this)));
(...skipping 30 matching lines...) Expand all
478 base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback, 580 base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
479 base::Unretained(this))); 581 base::Unretained(this)));
480 582
481 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED); 583 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
482 EXPECT_EQ(callback_count_, 2); 584 EXPECT_EQ(callback_count_, 2);
483 EXPECT_EQ(error_callback_count_, 0); 585 EXPECT_EQ(error_callback_count_, 0);
484 EXPECT_EQ(observer_->state_changed_count_, 0); 586 EXPECT_EQ(observer_->state_changed_count_, 0);
485 EXPECT_EQ(observer_->volume_changed_count_, 0); 587 EXPECT_EQ(observer_->volume_changed_count_, 0);
486 588
487 media_endpoint_->SetConfiguration( 589 media_endpoint_->SetConfiguration(
488 transport_->GetTransportPath(media_endpoint_->object_path()), 590 fake_transport_->GetTransportPath(media_endpoint_->object_path()),
489 properties_); 591 properties_);
490 592
491 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE); 593 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
492 EXPECT_EQ(callback_count_, 2); 594 EXPECT_EQ(callback_count_, 2);
493 EXPECT_EQ(error_callback_count_, 0); 595 EXPECT_EQ(error_callback_count_, 0);
494 EXPECT_EQ(observer_->state_changed_count_, 1); 596 EXPECT_EQ(observer_->state_changed_count_, 1);
495 EXPECT_EQ(observer_->volume_changed_count_, 1); 597 EXPECT_EQ(observer_->volume_changed_count_, 1);
496 598
497 adapter_->SetPowered( 599 adapter_->SetPowered(
498 false, 600 false,
499 base::Bind(&BluetoothAudioSinkChromeOSTest::Callback, 601 base::Bind(&BluetoothAudioSinkChromeOSTest::Callback,
500 base::Unretained(this)), 602 base::Unretained(this)),
501 base::Bind(&BluetoothAudioSinkChromeOSTest::ErrorCallback, 603 base::Bind(&BluetoothAudioSinkChromeOSTest::ErrorCallback,
502 base::Unretained(this))); 604 base::Unretained(this)));
503 GetFakeMediaEndpoint(); 605 GetFakeMediaEndpoint();
504 606
505 EXPECT_TRUE(adapter_->IsPresent()); 607 EXPECT_TRUE(adapter_->IsPresent());
506 EXPECT_FALSE(adapter_->IsPowered()); 608 EXPECT_FALSE(adapter_->IsPowered());
507 EXPECT_NE(media_endpoint_, nullptr); 609 EXPECT_NE(media_endpoint_, nullptr);
508 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED); 610 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
509 EXPECT_EQ(callback_count_, 3); 611 EXPECT_EQ(callback_count_, 3);
510 EXPECT_EQ(error_callback_count_, 0); 612 EXPECT_EQ(error_callback_count_, 0);
511 EXPECT_EQ(observer_->state_changed_count_, 2); 613 EXPECT_EQ(observer_->state_changed_count_, 2);
512 EXPECT_EQ(observer_->volume_changed_count_, 2); 614 EXPECT_EQ(observer_->volume_changed_count_, 2);
513 } 615 }
514 616
515 // TODO(mcchou): Add tests on UnregisterAudioSink for STATE_PENDING and
516 // STATE_ACTIVE.
517
518 TEST_F(BluetoothAudioSinkChromeOSTest, 617 TEST_F(BluetoothAudioSinkChromeOSTest,
519 UnregisterAudioSinkDuringDisconnectedState) { 618 UnregisterAudioSinkDuringDisconnectedState) {
520 GetAudioSink(); 619 GetAudioSink();
521 620
522 audio_sink_->Unregister( 621 audio_sink_->Unregister(
523 base::Bind(&BluetoothAudioSinkChromeOSTest::Callback, 622 base::Bind(&BluetoothAudioSinkChromeOSTest::Callback,
524 base::Unretained(this)), 623 base::Unretained(this)),
525 base::Bind(&BluetoothAudioSinkChromeOSTest::UnregisterErrorCallback, 624 base::Bind(&BluetoothAudioSinkChromeOSTest::UnregisterErrorCallback,
526 base::Unretained(this))); 625 base::Unretained(this)));
527 626
(...skipping 12 matching lines...) Expand all
540 base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback, 639 base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
541 base::Unretained(this))); 640 base::Unretained(this)));
542 641
543 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED); 642 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
544 EXPECT_EQ(callback_count_, 2); 643 EXPECT_EQ(callback_count_, 2);
545 EXPECT_EQ(error_callback_count_, 0); 644 EXPECT_EQ(error_callback_count_, 0);
546 EXPECT_EQ(observer_->state_changed_count_, 0); 645 EXPECT_EQ(observer_->state_changed_count_, 0);
547 EXPECT_EQ(observer_->volume_changed_count_, 0); 646 EXPECT_EQ(observer_->volume_changed_count_, 0);
548 647
549 media_endpoint_->SetConfiguration( 648 media_endpoint_->SetConfiguration(
550 transport_->GetTransportPath(media_endpoint_->object_path()), 649 fake_transport_->GetTransportPath(media_endpoint_->object_path()),
551 properties_); 650 properties_);
552 651
553 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE); 652 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
554 EXPECT_EQ(callback_count_, 2); 653 EXPECT_EQ(callback_count_, 2);
555 EXPECT_EQ(error_callback_count_, 0); 654 EXPECT_EQ(error_callback_count_, 0);
556 EXPECT_EQ(observer_->state_changed_count_, 1); 655 EXPECT_EQ(observer_->state_changed_count_, 1);
557 EXPECT_EQ(observer_->volume_changed_count_, 1); 656 EXPECT_EQ(observer_->volume_changed_count_, 1);
558 657
559 audio_sink_->Unregister( 658 audio_sink_->Unregister(
560 base::Bind(&BluetoothAudioSinkChromeOSTest::Callback, 659 base::Bind(&BluetoothAudioSinkChromeOSTest::Callback,
561 base::Unretained(this)), 660 base::Unretained(this)),
562 base::Bind(&BluetoothAudioSinkChromeOSTest::UnregisterErrorCallback, 661 base::Bind(&BluetoothAudioSinkChromeOSTest::UnregisterErrorCallback,
563 base::Unretained(this))); 662 base::Unretained(this)));
564 663
565 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_INVALID); 664 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_INVALID);
566 EXPECT_EQ(callback_count_, 3); 665 EXPECT_EQ(callback_count_, 3);
567 EXPECT_EQ(error_callback_count_, 0); 666 EXPECT_EQ(error_callback_count_, 0);
568 667
569 // The state becomes disconnted and then invalid, since the removal of 668 // The state becomes disconnted and then invalid, since the removal of
570 // transport object should happend before the unregistration of endpoint. 669 // transport object should happend before the unregistration of endpoint.
571 // State: STATE_IDLE -> STATE_DISCONNECTED -> STATE_INVALID 670 // State: STATE_IDLE -> STATE_DISCONNECTED -> STATE_INVALID
572 EXPECT_EQ(observer_->state_changed_count_, 3); 671 EXPECT_EQ(observer_->state_changed_count_, 3);
573 EXPECT_EQ(observer_->volume_changed_count_, 2); 672 EXPECT_EQ(observer_->volume_changed_count_, 2);
574 } 673 }
575 674
675 TEST_F(BluetoothAudioSinkChromeOSTest, UnregisterAudioSinkDuringActiveState) {
676 GetAudioSink();
677
678 media_endpoint_->SelectConfiguration(
679 std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}),
680 base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
681 base::Unretained(this)));
682
683 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
684 EXPECT_EQ(callback_count_, 2);
685 EXPECT_EQ(error_callback_count_, 0);
686 EXPECT_EQ(observer_->state_changed_count_, 0);
687 EXPECT_EQ(observer_->volume_changed_count_, 0);
688
689 media_endpoint_->SetConfiguration(
690 fake_transport_->GetTransportPath(media_endpoint_->object_path()),
691 properties_);
692
693 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
694 EXPECT_EQ(callback_count_, 2);
695 EXPECT_EQ(error_callback_count_, 0);
696 EXPECT_EQ(observer_->state_changed_count_, 1);
697 EXPECT_EQ(observer_->volume_changed_count_, 1);
698
699 fake_transport_->SetState(media_endpoint_->object_path(), "pending");
700
701 message_loop_.RunUntilIdle();
702
703 // Acquire is called when the state of |audio_sink_| becomes STATE_PENDING,
704 // and Acquire will trigger state change. Therefore, the state will be
705 // STATE_ACTIVE right after STATE_PENDING.
706 // State: STATE_IDLE -> STATE_PENDING -> STATE_ACTIVE
707 EXPECT_EQ(observer_->state_changed_count_, 3);
708
709 audio_sink_->Unregister(
710 base::Bind(&BluetoothAudioSinkChromeOSTest::Callback,
711 base::Unretained(this)),
712 base::Bind(&BluetoothAudioSinkChromeOSTest::UnregisterErrorCallback,
713 base::Unretained(this)));
714
715 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_INVALID);
716 EXPECT_EQ(callback_count_, 3);
717 EXPECT_EQ(error_callback_count_, 0);
718 EXPECT_EQ(observer_->state_changed_count_, 5);
719 EXPECT_EQ(observer_->volume_changed_count_, 2);
720 }
721
576 TEST_F(BluetoothAudioSinkChromeOSTest, StateChanged) { 722 TEST_F(BluetoothAudioSinkChromeOSTest, StateChanged) {
577 GetAudioSink(); 723 GetAudioSink();
578 724
579 media_endpoint_->SelectConfiguration( 725 media_endpoint_->SelectConfiguration(
580 std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}), 726 std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}),
581 base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback, 727 base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
582 base::Unretained(this))); 728 base::Unretained(this)));
583 729
584 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED); 730 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
585 EXPECT_EQ(callback_count_, 2); 731 EXPECT_EQ(callback_count_, 2);
586 EXPECT_EQ(error_callback_count_, 0); 732 EXPECT_EQ(error_callback_count_, 0);
587 EXPECT_EQ(observer_->state_changed_count_, 0); 733 EXPECT_EQ(observer_->state_changed_count_, 0);
588 EXPECT_EQ(observer_->volume_changed_count_, 0); 734 EXPECT_EQ(observer_->volume_changed_count_, 0);
589 735
590 media_endpoint_->SetConfiguration( 736 media_endpoint_->SetConfiguration(
591 transport_->GetTransportPath(media_endpoint_->object_path()), 737 fake_transport_->GetTransportPath(media_endpoint_->object_path()),
592 properties_); 738 properties_);
593 739
594 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE); 740 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
595 EXPECT_EQ(callback_count_, 2); 741 EXPECT_EQ(callback_count_, 2);
596 EXPECT_EQ(error_callback_count_, 0); 742 EXPECT_EQ(error_callback_count_, 0);
597 EXPECT_EQ(observer_->state_changed_count_, 1); 743 EXPECT_EQ(observer_->state_changed_count_, 1);
598 EXPECT_EQ(observer_->volume_changed_count_, 1); 744 EXPECT_EQ(observer_->volume_changed_count_, 1);
599 745
600 // Changes the current state of transport to pending. 746 // Changes the current state of transport to pending.
601 transport_->SetState(media_endpoint_->object_path(), "pending"); 747 fake_transport_->SetState(media_endpoint_->object_path(), "pending");
602 748
603 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_PENDING); 749 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_PENDING);
604 EXPECT_EQ(observer_->state_changed_count_, 2); 750 EXPECT_EQ(observer_->state_changed_count_, 3);
605 EXPECT_EQ(observer_->volume_changed_count_, 1); 751 EXPECT_EQ(observer_->volume_changed_count_, 1);
606 } 752 }
607 753
608 TEST_F(BluetoothAudioSinkChromeOSTest, VolumeChanged) { 754 TEST_F(BluetoothAudioSinkChromeOSTest, VolumeChanged) {
609 GetAudioSink(); 755 GetAudioSink();
610 756
611 media_endpoint_->SelectConfiguration( 757 media_endpoint_->SelectConfiguration(
612 std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}), 758 std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}),
613 base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback, 759 base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
614 base::Unretained(this))); 760 base::Unretained(this)));
615 761
616 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED); 762 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
617 EXPECT_EQ(callback_count_, 2); 763 EXPECT_EQ(callback_count_, 2);
618 EXPECT_EQ(error_callback_count_, 0); 764 EXPECT_EQ(error_callback_count_, 0);
619 EXPECT_EQ(observer_->state_changed_count_, 0); 765 EXPECT_EQ(observer_->state_changed_count_, 0);
620 EXPECT_EQ(observer_->volume_changed_count_, 0); 766 EXPECT_EQ(observer_->volume_changed_count_, 0);
621 767
622 media_endpoint_->SetConfiguration( 768 media_endpoint_->SetConfiguration(
623 transport_->GetTransportPath(media_endpoint_->object_path()), 769 fake_transport_->GetTransportPath(media_endpoint_->object_path()),
624 properties_); 770 properties_);
625 771
626 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE); 772 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
627 EXPECT_EQ(callback_count_, 2); 773 EXPECT_EQ(callback_count_, 2);
628 EXPECT_EQ(error_callback_count_, 0); 774 EXPECT_EQ(error_callback_count_, 0);
629 EXPECT_EQ(observer_->state_changed_count_, 1); 775 EXPECT_EQ(observer_->state_changed_count_, 1);
630 EXPECT_EQ(observer_->volume_changed_count_, 1); 776 EXPECT_EQ(observer_->volume_changed_count_, 1);
631 777
632 // |kTransportVolume| is the initial volume of the transport, and this 778 // |kTransportVolume| is the initial volume of the transport, and this
633 // value is propagated to the audio sink via SetConfiguration. 779 // value is propagated to the audio sink via SetConfiguration.
634 EXPECT_EQ(audio_sink_->GetVolume(), 780 EXPECT_EQ(audio_sink_->GetVolume(),
635 FakeBluetoothMediaTransportClient::kTransportVolume); 781 FakeBluetoothMediaTransportClient::kTransportVolume);
636 782
637 // Changes volume to a valid level. 783 // Changes volume to a valid level.
638 transport_->SetVolume(media_endpoint_->object_path(), 100); 784 fake_transport_->SetVolume(media_endpoint_->object_path(), 100);
639 785
640 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE); 786 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
641 EXPECT_EQ(observer_->state_changed_count_, 1); 787 EXPECT_EQ(observer_->state_changed_count_, 1);
642 EXPECT_EQ(observer_->volume_changed_count_, 2); 788 EXPECT_EQ(observer_->volume_changed_count_, 2);
643 EXPECT_EQ(audio_sink_->GetVolume(), 100); 789 EXPECT_EQ(audio_sink_->GetVolume(), 100);
644 790
645 // Changes volume to an invalid level. 791 // Changes volume to an invalid level.
646 transport_->SetVolume(media_endpoint_->object_path(), 200); 792 fake_transport_->SetVolume(media_endpoint_->object_path(), 200);
647 793
648 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE); 794 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
649 EXPECT_EQ(observer_->state_changed_count_, 1); 795 EXPECT_EQ(observer_->state_changed_count_, 1);
650 EXPECT_EQ(observer_->volume_changed_count_, 3); 796 EXPECT_EQ(observer_->volume_changed_count_, 3);
651 EXPECT_EQ(audio_sink_->GetVolume(), BluetoothAudioSink::kInvalidVolume); 797 EXPECT_EQ(audio_sink_->GetVolume(), BluetoothAudioSink::kInvalidVolume);
652 } 798 }
653 799
800 TEST_F(BluetoothAudioSinkChromeOSTest, AcquireFD) {
801 GetAudioSink();
802
803 media_endpoint_->SelectConfiguration(
804 std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}),
805 base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
806 base::Unretained(this)));
807
808 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
809 EXPECT_EQ(callback_count_, 2);
810 EXPECT_EQ(error_callback_count_, 0);
811 EXPECT_EQ(observer_->state_changed_count_, 0);
812 EXPECT_EQ(observer_->volume_changed_count_, 0);
813
814 media_endpoint_->SetConfiguration(
815 fake_transport_->GetTransportPath(media_endpoint_->object_path()),
816 properties_);
817
818 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
819 EXPECT_EQ(callback_count_, 2);
820 EXPECT_EQ(error_callback_count_, 0);
821 EXPECT_EQ(observer_->state_changed_count_, 1);
822 EXPECT_EQ(observer_->volume_changed_count_, 1);
823
824 fake_transport_->SetState(media_endpoint_->object_path(), "pending");
825
826 std::vector<char> data_one({0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
827 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f});
828 fake_transport_->WriteData(media_endpoint_->object_path(), data_one);
829
830 message_loop_.RunUntilIdle();
831
832 // Acquire is called when the state of |audio_sink_| becomes STATE_PENDING,
833 // and Acquire will trigger state change. Therefore, the state will be
834 // STATE_ACTIVE right after STATE_PENDING.
835 // State: STATE_IDLE -> STATE_PENDING -> STATE_ACTIVE
836 EXPECT_EQ(observer_->state_changed_count_, 3);
837 EXPECT_EQ(observer_->total_read_, data_one.size());
armansito 2015/03/12 03:42:55 It would be cool if you could also check that the
Miao 2015/03/12 22:33:32 Added!
838 }
839
840 // Tests the case where the remote device pauses and resume audio streaming.
841 TEST_F(BluetoothAudioSinkChromeOSTest, PauseAndResume) {
842 GetAudioSink();
843
844 media_endpoint_->SelectConfiguration(
845 std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}),
846 base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
847 base::Unretained(this)));
848
849 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
850 EXPECT_EQ(callback_count_, 2);
851 EXPECT_EQ(error_callback_count_, 0);
852 EXPECT_EQ(observer_->state_changed_count_, 0);
853 EXPECT_EQ(observer_->volume_changed_count_, 0);
854
855 media_endpoint_->SetConfiguration(
856 fake_transport_->GetTransportPath(media_endpoint_->object_path()),
857 properties_);
858
859 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
860 EXPECT_EQ(callback_count_, 2);
861 EXPECT_EQ(error_callback_count_, 0);
862 EXPECT_EQ(observer_->state_changed_count_, 1);
863 EXPECT_EQ(observer_->volume_changed_count_, 1);
864
865 fake_transport_->SetState(media_endpoint_->object_path(), "pending");
866
867 std::vector<char> data_one(16, 0x12);
868 fake_transport_->WriteData(media_endpoint_->object_path(), data_one);
869
870 message_loop_.RunUntilIdle();
871
872 EXPECT_EQ(observer_->state_changed_count_, 3);
873 EXPECT_EQ(observer_->total_read_, data_one.size());
874
875 // Simulates the situation where the remote device pauses and resume audio
876 // streaming.
877 fake_transport_->SetState(media_endpoint_->object_path(), "idle");
878
879 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
880 EXPECT_EQ(observer_->state_changed_count_, 4);
881
882 fake_transport_->SetState(media_endpoint_->object_path(), "pending");
883
884 std::vector<char> data_two(8, 0x10);
885 fake_transport_->WriteData(media_endpoint_->object_path(), data_two);
886
887 message_loop_.RunUntilIdle();
888
889 EXPECT_EQ(observer_->state_changed_count_, 6);
890 EXPECT_EQ(observer_->total_read_, data_two.size());
891 }
892
893 TEST_F(BluetoothAudioSinkChromeOSTest, ContinuouslyStreaming) {
894 GetAudioSink();
895
896 media_endpoint_->SelectConfiguration(
897 std::vector<uint8_t>({0x21, 0x15, 0x33, 0x2C}),
898 base::Bind(&BluetoothAudioSinkChromeOSTest::SelectConfigurationCallback,
899 base::Unretained(this)));
900
901 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_DISCONNECTED);
902 EXPECT_EQ(callback_count_, 2);
903 EXPECT_EQ(error_callback_count_, 0);
904 EXPECT_EQ(observer_->state_changed_count_, 0);
905 EXPECT_EQ(observer_->volume_changed_count_, 0);
906
907 media_endpoint_->SetConfiguration(
908 fake_transport_->GetTransportPath(media_endpoint_->object_path()),
909 properties_);
910
911 EXPECT_EQ(audio_sink_->GetState(), BluetoothAudioSink::STATE_IDLE);
912 EXPECT_EQ(callback_count_, 2);
913 EXPECT_EQ(error_callback_count_, 0);
914 EXPECT_EQ(observer_->state_changed_count_, 1);
915 EXPECT_EQ(observer_->volume_changed_count_, 1);
916
917 fake_transport_->SetState(media_endpoint_->object_path(), "pending");
918
919 std::vector<char> data_one(16, 0x12);
920 fake_transport_->WriteData(media_endpoint_->object_path(), data_one);
921
922 message_loop_.RunUntilIdle();
923
924 EXPECT_EQ(observer_->state_changed_count_, 3);
925 EXPECT_EQ(observer_->total_read_, data_one.size());
926
927 std::vector<char> data_two(8, 0x10);
928 fake_transport_->WriteData(media_endpoint_->object_path(), data_two);
929
930 message_loop_.RunUntilIdle();
931
932 EXPECT_EQ(observer_->state_changed_count_, 3);
933 EXPECT_EQ(observer_->total_read_, data_one.size() + data_two.size());
934 }
935
654 } // namespace chromeos 936 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698