| OLD | NEW |
| 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 "content/renderer/media/media_stream_dispatcher.h" | 5 #include "content/renderer/media/media_stream_dispatcher.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <string> | 10 #include <string> |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 #include "url/origin.h" | 21 #include "url/origin.h" |
| 22 | 22 |
| 23 namespace content { | 23 namespace content { |
| 24 namespace { | 24 namespace { |
| 25 | 25 |
| 26 const int kRouteId = 0; | 26 const int kRouteId = 0; |
| 27 const int kAudioSessionId = 3; | 27 const int kAudioSessionId = 3; |
| 28 const int kVideoSessionId = 5; | 28 const int kVideoSessionId = 5; |
| 29 const int kRequestId1 = 10; | 29 const int kRequestId1 = 10; |
| 30 const int kRequestId2 = 20; | 30 const int kRequestId2 = 20; |
| 31 const int kRequestId3 = 30; | |
| 32 const int kRequestId4 = 40; | |
| 33 | 31 |
| 34 const MediaStreamType kAudioType = MEDIA_DEVICE_AUDIO_CAPTURE; | 32 const MediaStreamType kAudioType = MEDIA_DEVICE_AUDIO_CAPTURE; |
| 35 const MediaStreamType kVideoType = MEDIA_DEVICE_VIDEO_CAPTURE; | 33 const MediaStreamType kVideoType = MEDIA_DEVICE_VIDEO_CAPTURE; |
| 36 | 34 |
| 37 class MockMediaStreamDispatcherEventHandler | 35 class MockMediaStreamDispatcherEventHandler |
| 38 : public MediaStreamDispatcherEventHandler, | 36 : public MediaStreamDispatcherEventHandler, |
| 39 public base::SupportsWeakPtr<MockMediaStreamDispatcherEventHandler> { | 37 public base::SupportsWeakPtr<MockMediaStreamDispatcherEventHandler> { |
| 40 public: | 38 public: |
| 41 MockMediaStreamDispatcherEventHandler() | 39 MockMediaStreamDispatcherEventHandler() : request_id_(-1) {} |
| 42 : request_id_(-1), did_receive_devices_changed_(false) {} | |
| 43 | 40 |
| 44 void OnStreamGenerated( | 41 void OnStreamGenerated( |
| 45 int request_id, | 42 int request_id, |
| 46 const std::string& label, | 43 const std::string& label, |
| 47 const StreamDeviceInfoArray& audio_device_array, | 44 const StreamDeviceInfoArray& audio_device_array, |
| 48 const StreamDeviceInfoArray& video_device_array) override { | 45 const StreamDeviceInfoArray& video_device_array) override { |
| 49 request_id_ = request_id; | 46 request_id_ = request_id; |
| 50 label_ = label; | 47 label_ = label; |
| 51 if (audio_device_array.size()) { | 48 if (audio_device_array.size()) { |
| 52 DCHECK(audio_device_array.size() == 1); | 49 DCHECK(audio_device_array.size() == 1); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 68 const StreamDeviceInfo& device_info) override { | 65 const StreamDeviceInfo& device_info) override { |
| 69 device_stopped_label_ = label; | 66 device_stopped_label_ = label; |
| 70 if (IsVideoMediaType(device_info.device.type)) { | 67 if (IsVideoMediaType(device_info.device.type)) { |
| 71 EXPECT_TRUE(StreamDeviceInfo::IsEqual(video_device_, device_info)); | 68 EXPECT_TRUE(StreamDeviceInfo::IsEqual(video_device_, device_info)); |
| 72 } | 69 } |
| 73 if (IsAudioInputMediaType(device_info.device.type)) { | 70 if (IsAudioInputMediaType(device_info.device.type)) { |
| 74 EXPECT_TRUE(StreamDeviceInfo::IsEqual(audio_device_, device_info)); | 71 EXPECT_TRUE(StreamDeviceInfo::IsEqual(audio_device_, device_info)); |
| 75 } | 72 } |
| 76 } | 73 } |
| 77 | 74 |
| 78 void OnDevicesEnumerated(int request_id, | |
| 79 const StreamDeviceInfoArray& device_array) override { | |
| 80 request_id_ = request_id; | |
| 81 } | |
| 82 | |
| 83 void OnDeviceOpened(int request_id, | 75 void OnDeviceOpened(int request_id, |
| 84 const std::string& label, | 76 const std::string& label, |
| 85 const StreamDeviceInfo& video_device) override { | 77 const StreamDeviceInfo& video_device) override { |
| 86 request_id_ = request_id; | 78 request_id_ = request_id; |
| 87 label_ = label; | 79 label_ = label; |
| 88 } | 80 } |
| 89 | 81 |
| 90 void OnDeviceOpenFailed(int request_id) override { request_id_ = request_id; } | 82 void OnDeviceOpenFailed(int request_id) override { request_id_ = request_id; } |
| 91 | 83 |
| 92 void OnDevicesChanged() override { did_receive_devices_changed_ = true; } | |
| 93 | |
| 94 void ResetStoredParameters() { | 84 void ResetStoredParameters() { |
| 95 request_id_ = -1; | 85 request_id_ = -1; |
| 96 label_ = ""; | 86 label_ = ""; |
| 97 device_stopped_label_ = ""; | 87 device_stopped_label_ = ""; |
| 98 audio_device_ = StreamDeviceInfo(); | 88 audio_device_ = StreamDeviceInfo(); |
| 99 video_device_ = StreamDeviceInfo(); | 89 video_device_ = StreamDeviceInfo(); |
| 100 } | 90 } |
| 101 | 91 |
| 102 int request_id_; | 92 int request_id_; |
| 103 std::string label_; | 93 std::string label_; |
| 104 std::string device_stopped_label_; | 94 std::string device_stopped_label_; |
| 105 StreamDeviceInfo audio_device_; | 95 StreamDeviceInfo audio_device_; |
| 106 StreamDeviceInfo video_device_; | 96 StreamDeviceInfo video_device_; |
| 107 bool did_receive_devices_changed_; | |
| 108 }; | 97 }; |
| 109 | 98 |
| 110 class MediaStreamDispatcherUnderTest : public MediaStreamDispatcher { | 99 class MediaStreamDispatcherUnderTest : public MediaStreamDispatcher { |
| 111 public: | 100 public: |
| 112 MediaStreamDispatcherUnderTest() : MediaStreamDispatcher(NULL) {} | 101 MediaStreamDispatcherUnderTest() : MediaStreamDispatcher(NULL) {} |
| 113 | 102 |
| 114 using MediaStreamDispatcher::GetNextIpcIdForTest; | 103 using MediaStreamDispatcher::GetNextIpcIdForTest; |
| 115 using RenderFrameObserver::OnMessageReceived; | 104 using RenderFrameObserver::OnMessageReceived; |
| 116 }; | 105 }; |
| 117 | 106 |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 218 | 207 |
| 219 TEST_F(MediaStreamDispatcherTest, BasicVideoDevice) { | 208 TEST_F(MediaStreamDispatcherTest, BasicVideoDevice) { |
| 220 std::unique_ptr<MediaStreamDispatcher> dispatcher( | 209 std::unique_ptr<MediaStreamDispatcher> dispatcher( |
| 221 new MediaStreamDispatcher(NULL)); | 210 new MediaStreamDispatcher(NULL)); |
| 222 std::unique_ptr<MockMediaStreamDispatcherEventHandler> handler1( | 211 std::unique_ptr<MockMediaStreamDispatcherEventHandler> handler1( |
| 223 new MockMediaStreamDispatcherEventHandler); | 212 new MockMediaStreamDispatcherEventHandler); |
| 224 std::unique_ptr<MockMediaStreamDispatcherEventHandler> handler2( | 213 std::unique_ptr<MockMediaStreamDispatcherEventHandler> handler2( |
| 225 new MockMediaStreamDispatcherEventHandler); | 214 new MockMediaStreamDispatcherEventHandler); |
| 226 url::Origin security_origin; | 215 url::Origin security_origin; |
| 227 | 216 |
| 228 int ipc_request_id1 = dispatcher->next_ipc_id_; | |
| 229 dispatcher->EnumerateDevices( | |
| 230 kRequestId1, handler1.get()->AsWeakPtr(), | |
| 231 kVideoType, | |
| 232 security_origin); | |
| 233 int ipc_request_id2 = dispatcher->next_ipc_id_; | |
| 234 EXPECT_NE(ipc_request_id1, ipc_request_id2); | |
| 235 dispatcher->EnumerateDevices( | |
| 236 kRequestId2, handler2.get()->AsWeakPtr(), | |
| 237 kVideoType, | |
| 238 security_origin); | |
| 239 EXPECT_EQ(dispatcher->requests_.size(), size_t(2)); | |
| 240 | |
| 241 StreamDeviceInfoArray video_device_array(1); | 217 StreamDeviceInfoArray video_device_array(1); |
| 242 StreamDeviceInfo video_device_info; | 218 StreamDeviceInfo video_device_info; |
| 243 video_device_info.device.name = "Camera"; | 219 video_device_info.device.name = "Camera"; |
| 244 video_device_info.device.id = "device_path"; | 220 video_device_info.device.id = "device_path"; |
| 245 video_device_info.device.type = kVideoType; | 221 video_device_info.device.type = kVideoType; |
| 246 video_device_info.session_id = kVideoSessionId; | 222 video_device_info.session_id = kVideoSessionId; |
| 247 video_device_array[0] = video_device_info; | 223 video_device_array[0] = video_device_info; |
| 248 | 224 |
| 249 // Complete the first enumeration request. | 225 EXPECT_EQ(dispatcher->requests_.size(), size_t(0)); |
| 250 dispatcher->OnMessageReceived(MediaStreamMsg_DevicesEnumerated( | |
| 251 kRouteId, ipc_request_id1, video_device_array)); | |
| 252 EXPECT_EQ(handler1->request_id_, kRequestId1); | |
| 253 | |
| 254 dispatcher->OnMessageReceived(MediaStreamMsg_DevicesEnumerated( | |
| 255 kRouteId, ipc_request_id2, video_device_array)); | |
| 256 EXPECT_EQ(handler2->request_id_, kRequestId2); | |
| 257 | |
| 258 EXPECT_EQ(dispatcher->requests_.size(), size_t(2)); | |
| 259 EXPECT_EQ(dispatcher->label_stream_map_.size(), size_t(0)); | 226 EXPECT_EQ(dispatcher->label_stream_map_.size(), size_t(0)); |
| 260 | 227 |
| 261 int ipc_request_id3 = dispatcher->next_ipc_id_; | 228 int ipc_request_id1 = dispatcher->next_ipc_id_; |
| 262 dispatcher->OpenDevice(kRequestId3, handler1.get()->AsWeakPtr(), | 229 dispatcher->OpenDevice(kRequestId1, handler1.get()->AsWeakPtr(), |
| 263 video_device_info.device.id, | 230 video_device_info.device.id, kVideoType, |
| 264 kVideoType, | |
| 265 security_origin); | 231 security_origin); |
| 266 int ipc_request_id4 = dispatcher->next_ipc_id_; | 232 int ipc_request_id2 = dispatcher->next_ipc_id_; |
| 267 EXPECT_NE(ipc_request_id3, ipc_request_id4); | 233 EXPECT_NE(ipc_request_id1, ipc_request_id2); |
| 268 dispatcher->OpenDevice(kRequestId4, handler1.get()->AsWeakPtr(), | 234 dispatcher->OpenDevice(kRequestId2, handler1.get()->AsWeakPtr(), |
| 269 video_device_info.device.id, | 235 video_device_info.device.id, kVideoType, |
| 270 kVideoType, | |
| 271 security_origin); | 236 security_origin); |
| 272 EXPECT_EQ(dispatcher->requests_.size(), size_t(4)); | 237 EXPECT_EQ(dispatcher->requests_.size(), size_t(2)); |
| 273 | 238 |
| 274 // Complete the OpenDevice of request 1. | 239 // Complete the OpenDevice of request 1. |
| 275 std::string stream_label1 = std::string("stream1"); | 240 std::string stream_label1 = std::string("stream1"); |
| 276 dispatcher->OnMessageReceived(MediaStreamMsg_DeviceOpened( | 241 dispatcher->OnMessageReceived(MediaStreamMsg_DeviceOpened( |
| 277 kRouteId, ipc_request_id3, stream_label1, video_device_info)); | 242 kRouteId, ipc_request_id1, stream_label1, video_device_info)); |
| 278 EXPECT_EQ(handler1->request_id_, kRequestId3); | 243 EXPECT_EQ(handler1->request_id_, kRequestId1); |
| 279 | 244 |
| 280 // Complete the OpenDevice of request 2. | 245 // Complete the OpenDevice of request 2. |
| 281 std::string stream_label2 = std::string("stream2"); | 246 std::string stream_label2 = std::string("stream2"); |
| 282 dispatcher->OnMessageReceived(MediaStreamMsg_DeviceOpened( | 247 dispatcher->OnMessageReceived(MediaStreamMsg_DeviceOpened( |
| 283 kRouteId, ipc_request_id4, stream_label2, video_device_info)); | 248 kRouteId, ipc_request_id2, stream_label2, video_device_info)); |
| 284 EXPECT_EQ(handler1->request_id_, kRequestId4); | 249 EXPECT_EQ(handler1->request_id_, kRequestId2); |
| 285 | 250 |
| 286 EXPECT_EQ(dispatcher->requests_.size(), size_t(2)); | 251 EXPECT_EQ(dispatcher->requests_.size(), size_t(0)); |
| 287 EXPECT_EQ(dispatcher->label_stream_map_.size(), size_t(2)); | 252 EXPECT_EQ(dispatcher->label_stream_map_.size(), size_t(2)); |
| 288 | 253 |
| 289 // Check the video_session_id. | 254 // Check the video_session_id. |
| 290 EXPECT_EQ(dispatcher->video_session_id(stream_label1, 0), kVideoSessionId); | 255 EXPECT_EQ(dispatcher->video_session_id(stream_label1, 0), kVideoSessionId); |
| 291 EXPECT_EQ(dispatcher->video_session_id(stream_label2, 0), kVideoSessionId); | 256 EXPECT_EQ(dispatcher->video_session_id(stream_label2, 0), kVideoSessionId); |
| 292 | 257 |
| 293 // Close the device from request 2. | 258 // Close the device from request 2. |
| 294 dispatcher->CloseDevice(stream_label2); | 259 dispatcher->CloseDevice(stream_label2); |
| 295 EXPECT_EQ(dispatcher->video_session_id(stream_label2, 0), | 260 EXPECT_EQ(dispatcher->video_session_id(stream_label2, 0), |
| 296 StreamDeviceInfo::kNoId); | 261 StreamDeviceInfo::kNoId); |
| 297 | 262 |
| 298 // Close the device from request 1. | 263 // Close the device from request 1. |
| 299 dispatcher->CloseDevice(stream_label1); | 264 dispatcher->CloseDevice(stream_label1); |
| 300 EXPECT_EQ(dispatcher->video_session_id(stream_label1, 0), | 265 EXPECT_EQ(dispatcher->video_session_id(stream_label1, 0), |
| 301 StreamDeviceInfo::kNoId); | 266 StreamDeviceInfo::kNoId); |
| 302 EXPECT_EQ(dispatcher->label_stream_map_.size(), size_t(0)); | 267 EXPECT_EQ(dispatcher->label_stream_map_.size(), size_t(0)); |
| 303 | 268 |
| 304 // Verify that the request have been completed. | 269 // Verify that the request have been completed. |
| 305 EXPECT_EQ(dispatcher->label_stream_map_.size(), size_t(0)); | 270 EXPECT_EQ(dispatcher->label_stream_map_.size(), size_t(0)); |
| 306 EXPECT_EQ(dispatcher->requests_.size(), size_t(2)); | 271 EXPECT_EQ(dispatcher->requests_.size(), size_t(0)); |
| 307 } | 272 } |
| 308 | 273 |
| 309 TEST_F(MediaStreamDispatcherTest, TestFailure) { | 274 TEST_F(MediaStreamDispatcherTest, TestFailure) { |
| 310 std::unique_ptr<MediaStreamDispatcher> dispatcher( | 275 std::unique_ptr<MediaStreamDispatcher> dispatcher( |
| 311 new MediaStreamDispatcher(NULL)); | 276 new MediaStreamDispatcher(NULL)); |
| 312 std::unique_ptr<MockMediaStreamDispatcherEventHandler> handler( | 277 std::unique_ptr<MockMediaStreamDispatcherEventHandler> handler( |
| 313 new MockMediaStreamDispatcherEventHandler); | 278 new MockMediaStreamDispatcherEventHandler); |
| 314 StreamControls components(true, true); | 279 StreamControls components(true, true); |
| 315 url::Origin security_origin; | 280 url::Origin security_origin; |
| 316 | 281 |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 406 | 371 |
| 407 dispatcher_->OnMessageReceived( | 372 dispatcher_->OnMessageReceived( |
| 408 MediaStreamMsg_DeviceStopped(kRouteId, label, handler_->video_device_)); | 373 MediaStreamMsg_DeviceStopped(kRouteId, label, handler_->video_device_)); |
| 409 // Verify that MediaStreamDispatcherEventHandler::OnDeviceStopped has been | 374 // Verify that MediaStreamDispatcherEventHandler::OnDeviceStopped has been |
| 410 // called. | 375 // called. |
| 411 EXPECT_EQ(label, handler_->device_stopped_label_); | 376 EXPECT_EQ(label, handler_->device_stopped_label_); |
| 412 EXPECT_EQ(dispatcher_->video_session_id(label, 0), | 377 EXPECT_EQ(dispatcher_->video_session_id(label, 0), |
| 413 StreamDeviceInfo::kNoId); | 378 StreamDeviceInfo::kNoId); |
| 414 } | 379 } |
| 415 | 380 |
| 416 // Test that the MediaStreamDispatcherEventHandler is notified when the message | |
| 417 // MediaStreamMsg_DevicesChanged is received. | |
| 418 TEST_F(MediaStreamDispatcherTest, DevicesChanged) { | |
| 419 std::unique_ptr<MockMediaStreamDispatcherEventHandler> handler1( | |
| 420 new MockMediaStreamDispatcherEventHandler); | |
| 421 std::unique_ptr<MockMediaStreamDispatcherEventHandler> handler2( | |
| 422 new MockMediaStreamDispatcherEventHandler); | |
| 423 dispatcher_->SubscribeToDeviceChangeNotifications(handler1->AsWeakPtr(), | |
| 424 security_origin_); | |
| 425 dispatcher_->SubscribeToDeviceChangeNotifications(handler2->AsWeakPtr(), | |
| 426 security_origin_); | |
| 427 dispatcher_->OnMessageReceived(MediaStreamMsg_DevicesChanged(kRouteId)); | |
| 428 dispatcher_->CancelDeviceChangeNotifications(handler1->AsWeakPtr()); | |
| 429 dispatcher_->CancelDeviceChangeNotifications(handler2->AsWeakPtr()); | |
| 430 | |
| 431 EXPECT_TRUE(handler1->did_receive_devices_changed_); | |
| 432 EXPECT_TRUE(handler2->did_receive_devices_changed_); | |
| 433 } | |
| 434 | |
| 435 } // namespace content | 381 } // namespace content |
| OLD | NEW |