blob: 535877f35048ab1950705497318767a0d6f42306 [file] [log] [blame]
// Copyright (c) 2012 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/scoped_ptr.h"
#include "base/message_loop.h"
#include "base/utf_string_conversions.h"
#include "content/renderer/media/mock_media_stream_dependency_factory.h"
#include "content/renderer/media/mock_media_stream_impl.h"
#include "content/renderer/media/mock_web_peer_connection_handler_client.h"
#include "content/renderer/media/mock_peer_connection_impl.h"
#include "content/renderer/media/peer_connection_handler.h"
#include "content/renderer/media/rtc_video_decoder.h"
#include "jingle/glue/thread_wrapper.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/libjingle/source/talk/app/webrtc/peerconnection.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebMediaStreamDescriptor.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebMediaStreamSource.h"
namespace webrtc {
class MockVideoRendererWrapper : public VideoRendererWrapperInterface {
public:
virtual cricket::VideoRenderer* renderer() OVERRIDE { return NULL; }
protected:
virtual ~MockVideoRendererWrapper() {}
};
} // namespace webrtc
TEST(PeerConnectionHandlerTest, WebMediaStreamDescriptorMemoryTest) {
std::string stream_label("stream-label");
std::string video_track_id("video-label");
const size_t kSizeOne = 1;
WebKit::WebMediaStreamSource source;
source.initialize(WebKit::WebString::fromUTF8(video_track_id),
WebKit::WebMediaStreamSource::TypeVideo,
WebKit::WebString::fromUTF8("RemoteVideo"));
WebKit::WebVector<WebKit::WebMediaStreamSource> source_vector(kSizeOne);
source_vector[0] = source;
WebKit::WebMediaStreamDescriptor local_stream;
local_stream.initialize(UTF8ToUTF16(stream_label), source_vector);
WebKit::WebMediaStreamDescriptor copy_1(local_stream);
{
WebKit::WebMediaStreamDescriptor copy_2(copy_1);
}
}
TEST(PeerConnectionHandlerTest, Basic) {
MessageLoop loop;
scoped_ptr<WebKit::MockWebPeerConnectionHandlerClient> mock_client(
new WebKit::MockWebPeerConnectionHandlerClient());
scoped_refptr<MockMediaStreamImpl> mock_ms_impl(new MockMediaStreamImpl());
scoped_ptr<MockMediaStreamDependencyFactory> mock_dependency_factory(
new MockMediaStreamDependencyFactory());
mock_dependency_factory->CreatePeerConnectionFactory(NULL,
NULL,
NULL,
NULL,
NULL);
scoped_ptr<PeerConnectionHandler> pc_handler(
new PeerConnectionHandler(mock_client.get(),
mock_ms_impl.get(),
mock_dependency_factory.get()));
WebKit::WebString server_config(
WebKit::WebString::fromUTF8("STUN stun.l.google.com:19302"));
WebKit::WebString username;
pc_handler->initialize(server_config, username);
EXPECT_TRUE(pc_handler->native_peer_connection_.get());
webrtc::MockPeerConnectionImpl* mock_peer_connection =
static_cast<webrtc::MockPeerConnectionImpl*>(
pc_handler->native_peer_connection_.get());
// TODO(grunell): Add an audio track as well.
std::string stream_label("stream-label");
std::string video_track_label("video-label");
talk_base::scoped_refptr<webrtc::LocalVideoTrackInterface> local_video_track(
mock_dependency_factory->CreateLocalVideoTrack(video_track_label, NULL));
mock_ms_impl->AddTrack(video_track_label, local_video_track);
WebKit::WebVector<WebKit::WebMediaStreamSource> source_vector(
static_cast<size_t>(1));
source_vector[0].initialize(WebKit::WebString::fromUTF8(video_track_label),
WebKit::WebMediaStreamSource::TypeVideo,
WebKit::WebString::fromUTF8("RemoteVideo"));
WebKit::WebVector<WebKit::WebMediaStreamDescriptor> local_streams(
static_cast<size_t>(1));
local_streams[0].initialize(UTF8ToUTF16(stream_label), source_vector);
pc_handler->produceInitialOffer(local_streams);
EXPECT_EQ(stream_label, mock_peer_connection->stream_label());
EXPECT_TRUE(mock_peer_connection->stream_changes_committed());
std::string message("message1");
pc_handler->handleInitialOffer(WebKit::WebString::fromUTF8(message));
EXPECT_EQ(message, mock_peer_connection->signaling_message());
message = "message2";
pc_handler->processSDP(WebKit::WebString::fromUTF8(message));
EXPECT_EQ(message, mock_peer_connection->signaling_message());
message = "message3";
pc_handler->OnSignalingMessage(message);
EXPECT_EQ(message, mock_client->sdp());
std::string remote_stream_label(stream_label);
remote_stream_label += "-remote";
std::string remote_video_track_label(video_track_label);
remote_video_track_label += "-remote";
// We use a local stream as a remote since for testing purposes we really
// only need the MediaStreamInterface.
talk_base::scoped_refptr<webrtc::LocalMediaStreamInterface> remote_stream(
mock_dependency_factory->CreateLocalMediaStream(remote_stream_label));
talk_base::scoped_refptr<webrtc::LocalVideoTrackInterface> remote_video_track(
mock_dependency_factory->CreateLocalVideoTrack(remote_video_track_label,
NULL));
remote_video_track->set_enabled(true);
remote_stream->AddTrack(remote_video_track);
mock_peer_connection->AddRemoteStream(remote_stream);
pc_handler->OnAddStream(remote_stream);
EXPECT_EQ(remote_stream_label, mock_client->stream_label());
EXPECT_TRUE(pc_handler->HasRemoteVideoTrack(remote_video_track_label));
talk_base::scoped_refptr<webrtc::MockVideoRendererWrapper> renderer(
new talk_base::RefCountedObject<webrtc::MockVideoRendererWrapper>());
pc_handler->SetRemoteVideoRenderer(remote_video_track_label, renderer);
EXPECT_EQ(renderer, static_cast<webrtc::MockLocalVideoTrack*>(
remote_video_track.get())->renderer());
WebKit::WebVector<WebKit::WebMediaStreamDescriptor> empty_streams(
static_cast<size_t>(0));
pc_handler->processPendingStreams(empty_streams, local_streams);
EXPECT_EQ("", mock_peer_connection->stream_label());
mock_peer_connection->ClearStreamChangesCommitted();
EXPECT_TRUE(!mock_peer_connection->stream_changes_committed());
pc_handler->OnRemoveStream(remote_stream);
EXPECT_TRUE(mock_client->stream_label().empty());
pc_handler->processPendingStreams(local_streams, empty_streams);
EXPECT_EQ(stream_label, mock_peer_connection->stream_label());
EXPECT_TRUE(mock_peer_connection->stream_changes_committed());
pc_handler->stop();
EXPECT_FALSE(pc_handler->native_peer_connection_.get());
// PC handler is expected to be deleted when stop calls
// MediaStreamImpl::ClosePeerConnection. We own and delete it here instead of
// in the mock.
pc_handler.reset();
}