| Index: talk/app/webrtc/peerconnection_unittest.cc
|
| diff --git a/talk/app/webrtc/peerconnection_unittest.cc b/talk/app/webrtc/peerconnection_unittest.cc
|
| index 7edd03926e054d9427d15371f6262e0b0c1cba14..9ecf08014c7cd3458c4cb9f35cb1550c4969eed2 100644
|
| --- a/talk/app/webrtc/peerconnection_unittest.cc
|
| +++ b/talk/app/webrtc/peerconnection_unittest.cc
|
| @@ -145,18 +145,31 @@ class PeerConnectionTestClient : public webrtc::PeerConnectionObserver,
|
| public SignalingMessageReceiver,
|
| public ObserverInterface {
|
| public:
|
| - static PeerConnectionTestClient* CreateClient(
|
| + static PeerConnectionTestClient* CreateClientWithDtlsIdentityStore(
|
| const std::string& id,
|
| const MediaConstraintsInterface* constraints,
|
| - const PeerConnectionFactory::Options* options) {
|
| + const PeerConnectionFactory::Options* options,
|
| + rtc::scoped_ptr<webrtc::DtlsIdentityStoreInterface> dtls_identity_store) {
|
| PeerConnectionTestClient* client(new PeerConnectionTestClient(id));
|
| - if (!client->Init(constraints, options)) {
|
| + if (!client->Init(constraints, options, dtls_identity_store.Pass())) {
|
| delete client;
|
| return nullptr;
|
| }
|
| return client;
|
| }
|
|
|
| + static PeerConnectionTestClient* CreateClient(
|
| + const std::string& id,
|
| + const MediaConstraintsInterface* constraints,
|
| + const PeerConnectionFactory::Options* options) {
|
| + rtc::scoped_ptr<FakeDtlsIdentityStore> dtls_identity_store(
|
| + rtc::SSLStreamAdapter::HaveDtlsSrtp() ? new FakeDtlsIdentityStore()
|
| + : nullptr);
|
| +
|
| + return CreateClientWithDtlsIdentityStore(id, constraints, options,
|
| + dtls_identity_store.Pass());
|
| + }
|
| +
|
| ~PeerConnectionTestClient() {
|
| while (!fake_video_renderers_.empty()) {
|
| RenderMap::iterator it = fake_video_renderers_.begin();
|
| @@ -704,8 +717,10 @@ class PeerConnectionTestClient : public webrtc::PeerConnectionObserver,
|
|
|
| explicit PeerConnectionTestClient(const std::string& id) : id_(id) {}
|
|
|
| - bool Init(const MediaConstraintsInterface* constraints,
|
| - const PeerConnectionFactory::Options* options) {
|
| + bool Init(
|
| + const MediaConstraintsInterface* constraints,
|
| + const PeerConnectionFactory::Options* options,
|
| + rtc::scoped_ptr<webrtc::DtlsIdentityStoreInterface> dtls_identity_store) {
|
| EXPECT_TRUE(!peer_connection_);
|
| EXPECT_TRUE(!peer_connection_factory_);
|
| allocator_factory_ = webrtc::FakePortAllocatorFactory::Create();
|
| @@ -729,23 +744,21 @@ class PeerConnectionTestClient : public webrtc::PeerConnectionObserver,
|
| if (options) {
|
| peer_connection_factory_->SetOptions(*options);
|
| }
|
| - peer_connection_ = CreatePeerConnection(allocator_factory_.get(),
|
| - constraints);
|
| + peer_connection_ = CreatePeerConnection(
|
| + allocator_factory_.get(), constraints, dtls_identity_store.Pass());
|
| return peer_connection_.get() != nullptr;
|
| }
|
|
|
| rtc::scoped_refptr<webrtc::PeerConnectionInterface> CreatePeerConnection(
|
| webrtc::PortAllocatorFactoryInterface* factory,
|
| - const MediaConstraintsInterface* constraints) {
|
| + const MediaConstraintsInterface* constraints,
|
| + rtc::scoped_ptr<webrtc::DtlsIdentityStoreInterface> dtls_identity_store) {
|
| // CreatePeerConnection with IceServers.
|
| webrtc::PeerConnectionInterface::IceServers ice_servers;
|
| webrtc::PeerConnectionInterface::IceServer ice_server;
|
| ice_server.uri = "stun:stun.l.google.com:19302";
|
| ice_servers.push_back(ice_server);
|
|
|
| - rtc::scoped_ptr<webrtc::DtlsIdentityStoreInterface> dtls_identity_store(
|
| - rtc::SSLStreamAdapter::HaveDtlsSrtp() ? new FakeDtlsIdentityStore()
|
| - : nullptr);
|
| return peer_connection_factory_->CreatePeerConnection(
|
| ice_servers, constraints, factory, dtls_identity_store.Pass(), this);
|
| }
|
| @@ -979,6 +992,11 @@ class MAYBE_JsepPeerConnectionP2PTestClient : public testing::Test {
|
| nullptr);
|
| }
|
|
|
| + void SetSignalingReceivers() {
|
| + initiating_client_->set_signaling_message_receiver(receiving_client_.get());
|
| + receiving_client_->set_signaling_message_receiver(initiating_client_.get());
|
| + }
|
| +
|
| bool CreateTestClients(MediaConstraintsInterface* init_constraints,
|
| PeerConnectionFactory::Options* init_options,
|
| MediaConstraintsInterface* recv_constraints,
|
| @@ -990,8 +1008,7 @@ class MAYBE_JsepPeerConnectionP2PTestClient : public testing::Test {
|
| if (!initiating_client_ || !receiving_client_) {
|
| return false;
|
| }
|
| - initiating_client_->set_signaling_message_receiver(receiving_client_.get());
|
| - receiving_client_->set_signaling_message_receiver(initiating_client_.get());
|
| + SetSignalingReceivers();
|
| return true;
|
| }
|
|
|
| @@ -1068,6 +1085,31 @@ class MAYBE_JsepPeerConnectionP2PTestClient : public testing::Test {
|
| kMaxWaitForFramesMs);
|
| }
|
|
|
| + void SetupAndVerifyDtlsCall() {
|
| + MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp);
|
| + FakeConstraints setup_constraints;
|
| + setup_constraints.AddMandatory(MediaConstraintsInterface::kEnableDtlsSrtp,
|
| + true);
|
| + ASSERT_TRUE(CreateTestClients(&setup_constraints, &setup_constraints));
|
| + LocalP2PTest();
|
| + VerifyRenderedSize(640, 480);
|
| + }
|
| +
|
| + PeerConnectionTestClient* CreateDtlsClientWithAlternateKey() {
|
| + FakeConstraints setup_constraints;
|
| + setup_constraints.AddMandatory(MediaConstraintsInterface::kEnableDtlsSrtp,
|
| + true);
|
| +
|
| + rtc::scoped_ptr<FakeDtlsIdentityStore> dtls_identity_store(
|
| + rtc::SSLStreamAdapter::HaveDtlsSrtp() ? new FakeDtlsIdentityStore()
|
| + : nullptr);
|
| + dtls_identity_store->use_alternate_key();
|
| +
|
| + // Make sure the new client is using a different certificate.
|
| + return PeerConnectionTestClient::CreateClientWithDtlsIdentityStore(
|
| + "New Peer: ", &setup_constraints, nullptr, dtls_identity_store.Pass());
|
| + }
|
| +
|
| void SendRtpData(webrtc::DataChannelInterface* dc, const std::string& data) {
|
| // Messages may get lost on the unreliable DataChannel, so we send multiple
|
| // times to avoid test flakiness.
|
| @@ -1081,10 +1123,29 @@ class MAYBE_JsepPeerConnectionP2PTestClient : public testing::Test {
|
| PeerConnectionTestClient* initializing_client() {
|
| return initiating_client_.get();
|
| }
|
| +
|
| + // Set the |initiating_client_| to the |client| passed in and return the
|
| + // original |initiating_client_|.
|
| + PeerConnectionTestClient* set_initializing_client(
|
| + PeerConnectionTestClient* client) {
|
| + PeerConnectionTestClient* old = initiating_client_.release();
|
| + initiating_client_.reset(client);
|
| + return old;
|
| + }
|
| +
|
| PeerConnectionTestClient* receiving_client() {
|
| return receiving_client_.get();
|
| }
|
|
|
| + // Set the |receiving_client_| to the |client| passed in and return the
|
| + // original |receiving_client_|.
|
| + PeerConnectionTestClient* set_receiving_client(
|
| + PeerConnectionTestClient* client) {
|
| + PeerConnectionTestClient* old = receiving_client_.release();
|
| + receiving_client_.reset(client);
|
| + return old;
|
| + }
|
| +
|
| private:
|
| rtc::scoped_ptr<rtc::PhysicalSocketServer> pss_;
|
| rtc::scoped_ptr<rtc::VirtualSocketServer> ss_;
|
| @@ -1146,13 +1207,7 @@ TEST_F(MAYBE_JsepPeerConnectionP2PTestClient, DISABLED_LocalP2PTest1280By720) {
|
| // This test sets up a call between two endpoints that are configured to use
|
| // DTLS key agreement. As a result, DTLS is negotiated and used for transport.
|
| TEST_F(MAYBE_JsepPeerConnectionP2PTestClient, LocalP2PTestDtls) {
|
| - MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp);
|
| - FakeConstraints setup_constraints;
|
| - setup_constraints.AddMandatory(MediaConstraintsInterface::kEnableDtlsSrtp,
|
| - true);
|
| - ASSERT_TRUE(CreateTestClients(&setup_constraints, &setup_constraints));
|
| - LocalP2PTest();
|
| - VerifyRenderedSize(640, 480);
|
| + SetupAndVerifyDtlsCall();
|
| }
|
|
|
| // This test sets up a audio call initially and then upgrades to audio/video,
|
| @@ -1169,6 +1224,42 @@ TEST_F(MAYBE_JsepPeerConnectionP2PTestClient, LocalP2PTestDtlsRenegotiate) {
|
| receiving_client()->Negotiate();
|
| }
|
|
|
| +// This test sets up a call transfer to a new caller with a different DTLS
|
| +// fingerprint.
|
| +TEST_F(MAYBE_JsepPeerConnectionP2PTestClient, LocalP2PTestDtlsTransferCallee) {
|
| + MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp);
|
| + SetupAndVerifyDtlsCall();
|
| +
|
| + // Keeping the original peer around which will still send packets to the
|
| + // receiving client. These SRTP packets will be dropped.
|
| + rtc::scoped_ptr<PeerConnectionTestClient> original_peer(
|
| + set_initializing_client(CreateDtlsClientWithAlternateKey()));
|
| + original_peer->pc()->Close();
|
| +
|
| + SetSignalingReceivers();
|
| + receiving_client()->SetExpectIceRestart(true);
|
| + LocalP2PTest();
|
| + VerifyRenderedSize(640, 480);
|
| +}
|
| +
|
| +// This test sets up a call transfer to a new callee with a different DTLS
|
| +// fingerprint.
|
| +TEST_F(MAYBE_JsepPeerConnectionP2PTestClient, LocalP2PTestDtlsTransferCaller) {
|
| + MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp);
|
| + SetupAndVerifyDtlsCall();
|
| +
|
| + // Keeping the original peer around which will still send packets to the
|
| + // receiving client. These SRTP packets will be dropped.
|
| + rtc::scoped_ptr<PeerConnectionTestClient> original_peer(
|
| + set_receiving_client(CreateDtlsClientWithAlternateKey()));
|
| + original_peer->pc()->Close();
|
| +
|
| + SetSignalingReceivers();
|
| + initializing_client()->IceRestart();
|
| + LocalP2PTest();
|
| + VerifyRenderedSize(640, 480);
|
| +}
|
| +
|
| // This test sets up a call between two endpoints that are configured to use
|
| // DTLS key agreement. The offerer don't support SDES. As a result, DTLS is
|
| // negotiated and used for transport.
|
|
|