diff options
author | perkj@google.com <perkj@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-28 12:10:20 +0000 |
---|---|---|
committer | perkj@google.com <perkj@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-28 12:10:20 +0000 |
commit | 47126547f951dc36455dce1551e6f893fc30045a (patch) | |
tree | c03116e98e827f357e48a76e6202f011f3a30c5d /content/renderer/media/media_stream_dispatcher_unittest.cc | |
parent | 4bdba60a7f44c1659173d97f425c5d2e616daeb3 (diff) | |
download | chromium_src-47126547f951dc36455dce1551e6f893fc30045a.zip chromium_src-47126547f951dc36455dce1551e6f893fc30045a.tar.gz chromium_src-47126547f951dc36455dce1551e6f893fc30045a.tar.bz2 |
MediaStreamDispatcher
This is the second Chromium patch needed to support media streams
http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#video-conferencing-and-peer-to-peer-communication. The first patch is here http://codereview.chromium.org/7192007/.
The patch contain types needed in both the render and browser process and MediaStreamDispatcher that is used for sending request from the render process to the browser process for granting a webpage access to audio input and video capture devices.
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/7184010
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@90752 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/renderer/media/media_stream_dispatcher_unittest.cc')
-rw-r--r-- | content/renderer/media/media_stream_dispatcher_unittest.cc | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/content/renderer/media/media_stream_dispatcher_unittest.cc b/content/renderer/media/media_stream_dispatcher_unittest.cc new file mode 100644 index 0000000..c765d81 --- /dev/null +++ b/content/renderer/media/media_stream_dispatcher_unittest.cc @@ -0,0 +1,201 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <string> + +#include "base/memory/ref_counted.h" +#include "base/memory/scoped_ptr.h" +#include "base/message_loop.h" +#include "content/common/media/media_stream_messages.h" +#include "content/renderer/media/media_stream_dispatcher.h" +#include "content/renderer/media/media_stream_dispatcher_eventhandler.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +const int kRouteId = 0; +const int kAudioSessionId = 3; +const int kVideoSessionId = 5; +const int kRequestId1 = 10; +const int kRequestId2 = 20; + +class MockMediaStreamDispatcherEventHandler + : public MediaStreamDispatcherEventHandler { + public: + MockMediaStreamDispatcherEventHandler() + : request_id_(-1), + audio_failed(false), + video_failed(false) {} + + virtual void OnStreamGenerated( + int request_id, + const std::string &label, + const media_stream::StreamDeviceInfoArray& audio_device_array, + const media_stream::StreamDeviceInfoArray& video_device_array) { + request_id_ = request_id; + label_ = label; + } + + virtual void OnStreamGenerationFailed(int request_id) { + request_id_ = request_id; + } + + virtual void OnAudioDeviceFailed(const std::string& label, + int index) { + audio_failed = true; + } + + virtual void OnVideoDeviceFailed(const std::string& label, + int index) { + video_failed = true; + } + + int request_id_; + std::string label_; + bool audio_failed; + bool video_failed; + + DISALLOW_COPY_AND_ASSIGN(MockMediaStreamDispatcherEventHandler); +}; + +} // namespace + +TEST(MediaStreamDispatcherTest, Basic) { + scoped_ptr<MediaStreamDispatcher> dispatcher(new MediaStreamDispatcher(NULL)); + scoped_ptr<MockMediaStreamDispatcherEventHandler> + handler(new MockMediaStreamDispatcherEventHandler); + media_stream::StreamOptions components( + true, media_stream::StreamOptions::kFacingUser); + std::string security_origin; + + int ipc_request_id1 = dispatcher->next_ipc_id_; + dispatcher->GenerateStream(kRequestId1, handler.get(), components, + security_origin); + int ipc_request_id2 = dispatcher->next_ipc_id_; + EXPECT_NE(ipc_request_id1, ipc_request_id2); + dispatcher->GenerateStream(kRequestId2, handler.get(), components, + security_origin); + EXPECT_EQ(dispatcher->requests_.size(), size_t(2)); + + media_stream::StreamDeviceInfoArray audio_device_array(1); + media_stream::StreamDeviceInfo audio_device_info; + audio_device_info.name = "Microphone"; + audio_device_info.stream_type = media_stream::kAudioCapture; + audio_device_info.session_id = kAudioSessionId; + audio_device_array[0] = audio_device_info; + + media_stream::StreamDeviceInfoArray video_device_array(1); + media_stream::StreamDeviceInfo video_device_info; + video_device_info.name = "Camera"; + video_device_info.stream_type = media_stream::kVideoCapture; + video_device_info.session_id = kVideoSessionId; + video_device_array[0] = video_device_info; + + // Complete the creation of stream1. + std::string stream_label1 = std::string("stream1"); + dispatcher->OnMessageReceived(MediaStreamMsg_StreamGenerated( + kRouteId, ipc_request_id1, stream_label1, + audio_device_array, video_device_array)); + EXPECT_EQ(handler->request_id_, kRequestId1); + EXPECT_EQ(handler->label_, stream_label1); + + // Complete the creation of stream2. + std::string stream_label2 = std::string("stream2"); + dispatcher->OnMessageReceived(MediaStreamMsg_StreamGenerated( + kRouteId, ipc_request_id2, stream_label2, + audio_device_array, video_device_array)); + EXPECT_EQ(handler->request_id_, kRequestId2); + EXPECT_EQ(handler->label_, stream_label2); + + EXPECT_EQ(dispatcher->requests_.size(), size_t(0)); + EXPECT_EQ(dispatcher->label_stream_map_.size(), size_t(2)); + + // Check the session_id of stream2. + EXPECT_EQ(dispatcher->audio_session_id(stream_label2, 0), kAudioSessionId); + EXPECT_EQ(dispatcher->video_session_id(stream_label2, 0), kVideoSessionId); + + // Stop stream2. + dispatcher->StopStream(stream_label2); + EXPECT_EQ(dispatcher->audio_session_id(stream_label2, 0), + media_stream::StreamDeviceInfo::kNoId); + EXPECT_EQ(dispatcher->video_session_id(stream_label2, 0), + media_stream::StreamDeviceInfo::kNoId); + + // Stop stream1. + dispatcher->StopStream(stream_label1); + EXPECT_EQ(dispatcher->audio_session_id(stream_label1, 0), + media_stream::StreamDeviceInfo::kNoId); + EXPECT_EQ(dispatcher->video_session_id(stream_label1, 0), + media_stream::StreamDeviceInfo::kNoId); + EXPECT_EQ(dispatcher->label_stream_map_.size(), size_t(0)); + + // Verify that the request have been completed. + EXPECT_EQ(dispatcher->label_stream_map_.size(), size_t(0)); + EXPECT_EQ(dispatcher->requests_.size(), size_t(0)); +} + +TEST(MediaStreamDispatcherTest, TestFailure) { + scoped_ptr<MediaStreamDispatcher> dispatcher(new MediaStreamDispatcher(NULL)); + scoped_ptr<MockMediaStreamDispatcherEventHandler> + handler(new MockMediaStreamDispatcherEventHandler); + media_stream::StreamOptions components( + true, media_stream::StreamOptions::kFacingUser); + std::string security_origin; + + // Test failure when creating a stream. + int ipc_request_id1 = dispatcher->next_ipc_id_; + dispatcher->GenerateStream(kRequestId1, handler.get(), components, + security_origin); + dispatcher->OnMessageReceived(MediaStreamMsg_StreamGenerationFailed( + kRouteId, ipc_request_id1)); + + // Verify that the request have been completed. + EXPECT_EQ(handler->request_id_, kRequestId1); + EXPECT_EQ(dispatcher->requests_.size(), size_t(0)); + + // Create a new stream. + ipc_request_id1 = dispatcher->next_ipc_id_; + dispatcher->GenerateStream(kRequestId1, handler.get(), components, + security_origin); + + media_stream::StreamDeviceInfoArray audio_device_array(1); + media_stream::StreamDeviceInfo audio_device_info; + audio_device_info.name = "Microphone"; + audio_device_info.stream_type = media_stream::kAudioCapture; + audio_device_info.session_id = kAudioSessionId; + audio_device_array[0] = audio_device_info; + + media_stream::StreamDeviceInfoArray video_device_array(1); + media_stream::StreamDeviceInfo video_device_info; + video_device_info.name = "Camera"; + video_device_info.stream_type = media_stream::kVideoCapture; + video_device_info.session_id = kVideoSessionId; + video_device_array[0] = video_device_info; + + // Complete the creation of stream1. + std::string stream_label1 = std::string("stream1"); + dispatcher->OnMessageReceived(MediaStreamMsg_StreamGenerated( + kRouteId, ipc_request_id1, stream_label1, + audio_device_array, video_device_array)); + EXPECT_EQ(handler->request_id_, kRequestId1); + EXPECT_EQ(handler->label_, stream_label1); + EXPECT_EQ(dispatcher->video_session_id(stream_label1, 0), kVideoSessionId); + + // Test failure of the video device. + dispatcher->OnMessageReceived( + MediaStreamHostMsg_VideoDeviceFailed(kRouteId, stream_label1, 0)); + EXPECT_EQ(handler->video_failed, true); + EXPECT_EQ(handler->audio_failed, false); + // Make sure the audio device still exist but not the video device. + EXPECT_EQ(dispatcher->audio_session_id(stream_label1, 0), kAudioSessionId); + + // Test failure of the audio device. + dispatcher->OnMessageReceived( + MediaStreamHostMsg_AudioDeviceFailed(kRouteId, stream_label1, 0)); + EXPECT_EQ(handler->audio_failed, true); + + // Stop stream1. + dispatcher->StopStream(stream_label1); + EXPECT_EQ(dispatcher->label_stream_map_.size(), size_t(0)); +} |