| Index: webrtc/api/peerconnectioninterface_unittest.cc
|
| diff --git a/webrtc/api/peerconnectioninterface_unittest.cc b/webrtc/api/peerconnectioninterface_unittest.cc
|
| index d6da24ee19f709bc7d8ae133a1b747dbd3b57763..2da3755fcb7eef39f4491f2edfe1fe9790a5bb78 100644
|
| --- a/webrtc/api/peerconnectioninterface_unittest.cc
|
| +++ b/webrtc/api/peerconnectioninterface_unittest.cc
|
| @@ -321,6 +321,8 @@ using webrtc::NotifierInterface;
|
| using webrtc::ObserverInterface;
|
| using webrtc::PeerConnectionInterface;
|
| using webrtc::PeerConnectionObserver;
|
| +using webrtc::RTCError;
|
| +using webrtc::RTCErrorType;
|
| using webrtc::RtpReceiverInterface;
|
| using webrtc::RtpSenderInterface;
|
| using webrtc::SdpParseError;
|
| @@ -694,6 +696,17 @@ class PeerConnectionInterfaceTest : public testing::Test {
|
| CreatePeerConnection(PeerConnectionInterface::RTCConfiguration(), nullptr);
|
| }
|
|
|
| + // DTLS does not work in a loopback call, so is disabled for most of the
|
| + // tests in this file.
|
| + void CreatePeerConnectionWithoutDtls() {
|
| + FakeConstraints no_dtls_constraints;
|
| + no_dtls_constraints.AddMandatory(
|
| + webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, false);
|
| +
|
| + CreatePeerConnection(PeerConnectionInterface::RTCConfiguration(),
|
| + &no_dtls_constraints);
|
| + }
|
| +
|
| void CreatePeerConnection(webrtc::MediaConstraintsInterface* constraints) {
|
| CreatePeerConnection(PeerConnectionInterface::RTCConfiguration(),
|
| constraints);
|
| @@ -722,17 +735,6 @@ class PeerConnectionInterfaceTest : public testing::Test {
|
| new cricket::FakePortAllocator(rtc::Thread::Current(), nullptr));
|
| port_allocator_ = port_allocator.get();
|
|
|
| - // DTLS does not work in a loopback call, so is disabled for most of the
|
| - // tests in this file. We only create a FakeIdentityService if the test
|
| - // explicitly sets the constraint.
|
| - FakeConstraints default_constraints;
|
| - if (!constraints) {
|
| - constraints = &default_constraints;
|
| -
|
| - default_constraints.AddMandatory(
|
| - webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, false);
|
| - }
|
| -
|
| std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator;
|
| bool dtls;
|
| if (FindConstraint(constraints,
|
| @@ -898,7 +900,7 @@ class PeerConnectionInterfaceTest : public testing::Test {
|
| }
|
|
|
| void InitiateCall() {
|
| - CreatePeerConnection();
|
| + CreatePeerConnectionWithoutDtls();
|
| // Create a local stream with audio&video tracks.
|
| AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label");
|
| CreateOfferReceiveAnswer();
|
| @@ -1105,7 +1107,7 @@ class PeerConnectionInterfaceTest : public testing::Test {
|
| }
|
|
|
| std::unique_ptr<SessionDescriptionInterface> CreateOfferWithOneAudioStream() {
|
| - CreatePeerConnection();
|
| + CreatePeerConnectionWithoutDtls();
|
| AddVoiceStream(kStreamLabel1);
|
| std::unique_ptr<SessionDescriptionInterface> offer;
|
| EXPECT_TRUE(DoCreateOffer(&offer, nullptr));
|
| @@ -1281,7 +1283,7 @@ TEST_F(PeerConnectionInterfaceTest, GetConfigurationAfterSetConfiguration) {
|
| }
|
|
|
| TEST_F(PeerConnectionInterfaceTest, AddStreams) {
|
| - CreatePeerConnection();
|
| + CreatePeerConnectionWithoutDtls();
|
| AddVideoStream(kStreamLabel1);
|
| AddVoiceStream(kStreamLabel2);
|
| ASSERT_EQ(2u, pc_->local_streams()->count());
|
| @@ -1311,7 +1313,7 @@ TEST_F(PeerConnectionInterfaceTest, AddStreams) {
|
|
|
| // Test that the created offer includes streams we added.
|
| TEST_F(PeerConnectionInterfaceTest, AddedStreamsPresentInOffer) {
|
| - CreatePeerConnection();
|
| + CreatePeerConnectionWithoutDtls();
|
| AddAudioVideoStream(kStreamLabel1, "audio_track", "video_track");
|
| std::unique_ptr<SessionDescriptionInterface> offer;
|
| ASSERT_TRUE(DoCreateOffer(&offer, nullptr));
|
| @@ -1355,7 +1357,7 @@ TEST_F(PeerConnectionInterfaceTest, AddedStreamsPresentInOffer) {
|
| }
|
|
|
| TEST_F(PeerConnectionInterfaceTest, RemoveStream) {
|
| - CreatePeerConnection();
|
| + CreatePeerConnectionWithoutDtls();
|
| AddVideoStream(kStreamLabel1);
|
| ASSERT_EQ(1u, pc_->local_streams()->count());
|
| pc_->RemoveStream(pc_->local_streams()->at(0));
|
| @@ -1367,7 +1369,7 @@ TEST_F(PeerConnectionInterfaceTest, RemoveStream) {
|
| // and that the RtpSenders are created correctly.
|
| // Also tests that RemoveTrack removes the tracks from subsequent offers.
|
| TEST_F(PeerConnectionInterfaceTest, AddTrackRemoveTrack) {
|
| - CreatePeerConnection();
|
| + CreatePeerConnectionWithoutDtls();
|
| // Create a dummy stream, so tracks share a stream label.
|
| rtc::scoped_refptr<MediaStreamInterface> stream(
|
| pc_factory_->CreateLocalMediaStream(kStreamLabel1));
|
| @@ -1442,7 +1444,7 @@ TEST_F(PeerConnectionInterfaceTest, AddTrackRemoveTrack) {
|
| // Test creating senders without a stream specified,
|
| // expecting a random stream ID to be generated.
|
| TEST_F(PeerConnectionInterfaceTest, AddTrackWithoutStream) {
|
| - CreatePeerConnection();
|
| + CreatePeerConnectionWithoutDtls();
|
| // Create a dummy stream, so tracks share a stream label.
|
| rtc::scoped_refptr<AudioTrackInterface> audio_track(
|
| pc_factory_->CreateAudioTrack("audio_track", nullptr));
|
| @@ -1470,7 +1472,7 @@ TEST_F(PeerConnectionInterfaceTest, CreateOfferReceiveAnswer) {
|
| }
|
|
|
| TEST_F(PeerConnectionInterfaceTest, CreateOfferReceivePrAnswerAndAnswer) {
|
| - CreatePeerConnection();
|
| + CreatePeerConnectionWithoutDtls();
|
| AddVideoStream(kStreamLabel1);
|
| CreateOfferAsLocalDescription();
|
| std::string offer;
|
| @@ -1480,7 +1482,7 @@ TEST_F(PeerConnectionInterfaceTest, CreateOfferReceivePrAnswerAndAnswer) {
|
| }
|
|
|
| TEST_F(PeerConnectionInterfaceTest, ReceiveOfferCreateAnswer) {
|
| - CreatePeerConnection();
|
| + CreatePeerConnectionWithoutDtls();
|
| AddVideoStream(kStreamLabel1);
|
|
|
| CreateOfferAsRemoteDescription();
|
| @@ -1490,7 +1492,7 @@ TEST_F(PeerConnectionInterfaceTest, ReceiveOfferCreateAnswer) {
|
| }
|
|
|
| TEST_F(PeerConnectionInterfaceTest, ReceiveOfferCreatePrAnswerAndAnswer) {
|
| - CreatePeerConnection();
|
| + CreatePeerConnectionWithoutDtls();
|
| AddVideoStream(kStreamLabel1);
|
|
|
| CreateOfferAsRemoteDescription();
|
| @@ -1513,7 +1515,7 @@ TEST_F(PeerConnectionInterfaceTest, Renegotiate) {
|
| // Tests that after negotiating an audio only call, the respondent can perform a
|
| // renegotiation that removes the audio stream.
|
| TEST_F(PeerConnectionInterfaceTest, RenegotiateAudioOnly) {
|
| - CreatePeerConnection();
|
| + CreatePeerConnectionWithoutDtls();
|
| AddVoiceStream(kStreamLabel1);
|
| CreateOfferAsRemoteDescription();
|
| CreateAnswerAsLocalDescription();
|
| @@ -1526,7 +1528,7 @@ TEST_F(PeerConnectionInterfaceTest, RenegotiateAudioOnly) {
|
|
|
| // Test that candidates are generated and that we can parse our own candidates.
|
| TEST_F(PeerConnectionInterfaceTest, IceCandidates) {
|
| - CreatePeerConnection();
|
| + CreatePeerConnectionWithoutDtls();
|
|
|
| EXPECT_FALSE(pc_->AddIceCandidate(observer_.last_candidate_.get()));
|
| // SetRemoteDescription takes ownership of offer.
|
| @@ -1549,7 +1551,7 @@ TEST_F(PeerConnectionInterfaceTest, IceCandidates) {
|
| // Test that CreateOffer and CreateAnswer will fail if the track labels are
|
| // not unique.
|
| TEST_F(PeerConnectionInterfaceTest, CreateOfferAnswerWithInvalidStream) {
|
| - CreatePeerConnection();
|
| + CreatePeerConnectionWithoutDtls();
|
| // Create a regular offer for the CreateAnswer test later.
|
| std::unique_ptr<SessionDescriptionInterface> offer;
|
| EXPECT_TRUE(DoCreateOffer(&offer, nullptr));
|
| @@ -1570,7 +1572,7 @@ TEST_F(PeerConnectionInterfaceTest, CreateOfferAnswerWithInvalidStream) {
|
| // Test that we will get different SSRCs for each tracks in the offer and answer
|
| // we created.
|
| TEST_F(PeerConnectionInterfaceTest, SsrcInOfferAnswer) {
|
| - CreatePeerConnection();
|
| + CreatePeerConnectionWithoutDtls();
|
| // Create a local stream with audio&video tracks having different labels.
|
| AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label");
|
|
|
| @@ -1602,7 +1604,7 @@ TEST_F(PeerConnectionInterfaceTest, SsrcInOfferAnswer) {
|
| // the stream to a PeerConnection.
|
| // TODO(deadbeef): Remove this test once this behavior is no longer supported.
|
| TEST_F(PeerConnectionInterfaceTest, AddTrackAfterAddStream) {
|
| - CreatePeerConnection();
|
| + CreatePeerConnectionWithoutDtls();
|
| // Create audio stream and add to PeerConnection.
|
| AddVoiceStream(kStreamLabel1);
|
| MediaStreamInterface* stream = pc_->local_streams()->at(0);
|
| @@ -1626,7 +1628,7 @@ TEST_F(PeerConnectionInterfaceTest, AddTrackAfterAddStream) {
|
| // the stream to a PeerConnection.
|
| // TODO(deadbeef): Remove this test once this behavior is no longer supported.
|
| TEST_F(PeerConnectionInterfaceTest, RemoveTrackAfterAddStream) {
|
| - CreatePeerConnection();
|
| + CreatePeerConnectionWithoutDtls();
|
| // Create audio/video stream and add to PeerConnection.
|
| AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label");
|
| MediaStreamInterface* stream = pc_->local_streams()->at(0);
|
| @@ -1645,7 +1647,7 @@ TEST_F(PeerConnectionInterfaceTest, RemoveTrackAfterAddStream) {
|
| // Test creating a sender with a stream ID, and ensure the ID is populated
|
| // in the offer.
|
| TEST_F(PeerConnectionInterfaceTest, CreateSenderWithStream) {
|
| - CreatePeerConnection();
|
| + CreatePeerConnectionWithoutDtls();
|
| pc_->CreateSender("video", kStreamLabel1);
|
|
|
| std::unique_ptr<SessionDescriptionInterface> offer;
|
| @@ -2075,7 +2077,7 @@ TEST_F(PeerConnectionInterfaceTest, ReceiveFireFoxOffer) {
|
| // limited set of audio codecs and receive an updated offer with more audio
|
| // codecs, where the added codecs are not supported.
|
| TEST_F(PeerConnectionInterfaceTest, ReceiveUpdatedAudioOfferWithBadCodecs) {
|
| - CreatePeerConnection();
|
| + CreatePeerConnectionWithoutDtls();
|
| AddVoiceStream("audio_label");
|
| CreateOfferAsLocalDescription();
|
|
|
| @@ -2183,6 +2185,17 @@ TEST_F(PeerConnectionInterfaceTest, SetConfigurationChangesCandidateFilter) {
|
| EXPECT_EQ(cricket::CF_RELAY, port_allocator_->candidate_filter());
|
| }
|
|
|
| +TEST_F(PeerConnectionInterfaceTest, SetConfigurationChangesPruneTurnPortsFlag) {
|
| + PeerConnectionInterface::RTCConfiguration config;
|
| + config.prune_turn_ports = false;
|
| + CreatePeerConnection(config, nullptr);
|
| + EXPECT_FALSE(port_allocator_->prune_turn_ports());
|
| +
|
| + config.prune_turn_ports = true;
|
| + EXPECT_TRUE(pc_->SetConfiguration(config));
|
| + EXPECT_TRUE(port_allocator_->prune_turn_ports());
|
| +}
|
| +
|
| // Test that when SetConfiguration changes both the pool size and other
|
| // attributes, the pooled session is created with the updated attributes.
|
| TEST_F(PeerConnectionInterfaceTest,
|
| @@ -2203,7 +2216,8 @@ TEST_F(PeerConnectionInterfaceTest,
|
| EXPECT_EQ(1UL, session->stun_servers().size());
|
| }
|
|
|
| -// Test that after SetLocalDescription, changing the pool size is not allowed.
|
| +// Test that after SetLocalDescription, changing the pool size is not allowed,
|
| +// and an invalid modification error is returned.
|
| TEST_F(PeerConnectionInterfaceTest,
|
| CantChangePoolSizeAfterSetLocalDescription) {
|
| CreatePeerConnection();
|
| @@ -2220,7 +2234,91 @@ TEST_F(PeerConnectionInterfaceTest,
|
| // Set local answer; now it's too late.
|
| CreateAnswerAsLocalDescription();
|
| config.ice_candidate_pool_size = 3;
|
| - EXPECT_FALSE(pc_->SetConfiguration(config));
|
| + RTCError error;
|
| + EXPECT_FALSE(pc_->SetConfiguration(config, &error));
|
| + EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, error.type());
|
| +}
|
| +
|
| +// Test that SetConfiguration returns an invalid modification error if
|
| +// modifying a field in the configuration that isn't allowed to be modified.
|
| +TEST_F(PeerConnectionInterfaceTest,
|
| + SetConfigurationReturnsInvalidModificationError) {
|
| + PeerConnectionInterface::RTCConfiguration config;
|
| + config.bundle_policy = PeerConnectionInterface::kBundlePolicyBalanced;
|
| + config.rtcp_mux_policy = PeerConnectionInterface::kRtcpMuxPolicyNegotiate;
|
| + config.continual_gathering_policy = PeerConnectionInterface::GATHER_ONCE;
|
| + CreatePeerConnection(config, nullptr);
|
| +
|
| + PeerConnectionInterface::RTCConfiguration modified_config = config;
|
| + modified_config.bundle_policy =
|
| + PeerConnectionInterface::kBundlePolicyMaxBundle;
|
| + RTCError error;
|
| + EXPECT_FALSE(pc_->SetConfiguration(modified_config, &error));
|
| + EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, error.type());
|
| +
|
| + modified_config = config;
|
| + modified_config.rtcp_mux_policy =
|
| + PeerConnectionInterface::kRtcpMuxPolicyRequire;
|
| + error.set_type(RTCErrorType::NONE);
|
| + EXPECT_FALSE(pc_->SetConfiguration(modified_config, &error));
|
| + EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, error.type());
|
| +
|
| + modified_config = config;
|
| + modified_config.continual_gathering_policy =
|
| + PeerConnectionInterface::GATHER_CONTINUALLY;
|
| + error.set_type(RTCErrorType::NONE);
|
| + EXPECT_FALSE(pc_->SetConfiguration(modified_config, &error));
|
| + EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, error.type());
|
| +}
|
| +
|
| +// Test that SetConfiguration returns a range error if the candidate pool size
|
| +// is negative or larger than allowed by the spec.
|
| +TEST_F(PeerConnectionInterfaceTest,
|
| + SetConfigurationReturnsRangeErrorForBadCandidatePoolSize) {
|
| + PeerConnectionInterface::RTCConfiguration config;
|
| + CreatePeerConnection(config, nullptr);
|
| +
|
| + config.ice_candidate_pool_size = -1;
|
| + RTCError error;
|
| + EXPECT_FALSE(pc_->SetConfiguration(config, &error));
|
| + EXPECT_EQ(RTCErrorType::INVALID_RANGE, error.type());
|
| +
|
| + config.ice_candidate_pool_size = INT_MAX;
|
| + error.set_type(RTCErrorType::NONE);
|
| + EXPECT_FALSE(pc_->SetConfiguration(config, &error));
|
| + EXPECT_EQ(RTCErrorType::INVALID_RANGE, error.type());
|
| +}
|
| +
|
| +// Test that SetConfiguration returns a syntax error if parsing an ICE server
|
| +// URL failed.
|
| +TEST_F(PeerConnectionInterfaceTest,
|
| + SetConfigurationReturnsSyntaxErrorFromBadIceUrls) {
|
| + PeerConnectionInterface::RTCConfiguration config;
|
| + CreatePeerConnection(config, nullptr);
|
| +
|
| + PeerConnectionInterface::IceServer bad_server;
|
| + bad_server.uri = "stunn:www.example.com";
|
| + config.servers.push_back(bad_server);
|
| + RTCError error;
|
| + EXPECT_FALSE(pc_->SetConfiguration(config, &error));
|
| + EXPECT_EQ(RTCErrorType::SYNTAX_ERROR, error.type());
|
| +}
|
| +
|
| +// Test that SetConfiguration returns an invalid parameter error if a TURN
|
| +// IceServer is missing a username or password.
|
| +TEST_F(PeerConnectionInterfaceTest,
|
| + SetConfigurationReturnsInvalidParameterIfCredentialsMissing) {
|
| + PeerConnectionInterface::RTCConfiguration config;
|
| + CreatePeerConnection(config, nullptr);
|
| +
|
| + PeerConnectionInterface::IceServer bad_server;
|
| + bad_server.uri = "turn:www.example.com";
|
| + // Missing password.
|
| + bad_server.username = "foo";
|
| + config.servers.push_back(bad_server);
|
| + RTCError error;
|
| + EXPECT_FALSE(pc_->SetConfiguration(config, &error));
|
| + EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, error.type());
|
| }
|
|
|
| // Test that PeerConnection::Close changes the states to closed and all remote
|
| @@ -2255,7 +2353,7 @@ TEST_F(PeerConnectionInterfaceTest, CloseAndTestStreamsAndStates) {
|
| // Test that PeerConnection methods fails gracefully after
|
| // PeerConnection::Close has been called.
|
| TEST_F(PeerConnectionInterfaceTest, CloseAndTestMethods) {
|
| - CreatePeerConnection();
|
| + CreatePeerConnectionWithoutDtls();
|
| AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label");
|
| CreateOfferAsRemoteDescription();
|
| CreateAnswerAsLocalDescription();
|
| @@ -3227,10 +3325,41 @@ TEST(CreateSessionOptionsTest, MediaConstraintsInAnswer) {
|
| EXPECT_TRUE(updated_answer_options.has_video());
|
| }
|
|
|
| -TEST(RtcErrorTest, OstreamOperator) {
|
| +TEST(RTCErrorTypeTest, OstreamOperator) {
|
| std::ostringstream oss;
|
| - oss << webrtc::RtcError::NONE << ' '
|
| - << webrtc::RtcError::INVALID_PARAMETER << ' '
|
| - << webrtc::RtcError::INTERNAL_ERROR;
|
| + oss << webrtc::RTCErrorType::NONE << ' '
|
| + << webrtc::RTCErrorType::INVALID_PARAMETER << ' '
|
| + << webrtc::RTCErrorType::INTERNAL_ERROR;
|
| EXPECT_EQ("NONE INVALID_PARAMETER INTERNAL_ERROR", oss.str());
|
| }
|
| +
|
| +// Tests a few random fields being different.
|
| +TEST(RTCConfigurationTest, ComparisonOperators) {
|
| + PeerConnectionInterface::RTCConfiguration a;
|
| + PeerConnectionInterface::RTCConfiguration b;
|
| + EXPECT_EQ(a, b);
|
| +
|
| + PeerConnectionInterface::RTCConfiguration c;
|
| + c.servers.push_back(PeerConnectionInterface::IceServer());
|
| + EXPECT_NE(a, c);
|
| +
|
| + PeerConnectionInterface::RTCConfiguration d;
|
| + d.type = PeerConnectionInterface::kRelay;
|
| + EXPECT_NE(a, d);
|
| +
|
| + PeerConnectionInterface::RTCConfiguration e;
|
| + e.audio_jitter_buffer_max_packets = 5;
|
| + EXPECT_NE(a, e);
|
| +
|
| + PeerConnectionInterface::RTCConfiguration f;
|
| + f.ice_connection_receiving_timeout = 1337;
|
| + EXPECT_NE(a, f);
|
| +
|
| + PeerConnectionInterface::RTCConfiguration g;
|
| + g.disable_ipv6 = true;
|
| + EXPECT_NE(a, g);
|
| +
|
| + PeerConnectionInterface::RTCConfiguration h(
|
| + PeerConnectionInterface::RTCConfigurationType::kAggressive);
|
| + EXPECT_NE(a, h);
|
| +}
|
|
|