mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-13 05:40:42 +01:00

The default value of sdpSemantics is about to change from PlanB to UnifiedPlan. In order not to cause subtle bugs by applications that depend on the default value being PlanB, we are temporarily making the default NotSpecified. Constructing with NotSpecified causes the C++ layer to crash (https://webrtc-review.googlesource.com/c/src/+/242968). This is in accordance to the publically announced plans: https://groups.google.com/u/1/g/discuss-webrtc/c/SdoVP02eUIk Bug: webrtc:11121 Change-Id: Idbb8fd0f5c224311cf1f25ac2832800124ed14d4 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/246060 Reviewed-by: Peter Hanspers <peterhanspers@webrtc.org> Commit-Queue: Henrik Boström <hbos@webrtc.org> Cr-Commit-Position: refs/heads/main@{#35678}
235 lines
10 KiB
Text
235 lines
10 KiB
Text
/*
|
|
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#import <Foundation/Foundation.h>
|
|
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
#include "rtc_base/gunit.h"
|
|
|
|
#import "api/peerconnection/RTCConfiguration+Private.h"
|
|
#import "api/peerconnection/RTCConfiguration.h"
|
|
#import "api/peerconnection/RTCCryptoOptions.h"
|
|
#import "api/peerconnection/RTCIceCandidate.h"
|
|
#import "api/peerconnection/RTCIceServer.h"
|
|
#import "api/peerconnection/RTCMediaConstraints.h"
|
|
#import "api/peerconnection/RTCPeerConnection.h"
|
|
#import "api/peerconnection/RTCPeerConnectionFactory+Native.h"
|
|
#import "api/peerconnection/RTCPeerConnectionFactory.h"
|
|
#import "api/peerconnection/RTCSessionDescription.h"
|
|
#import "helpers/NSString+StdString.h"
|
|
|
|
@interface RTCPeerConnectionTest : NSObject
|
|
- (void)testConfigurationGetter;
|
|
- (void)testWithDependencies;
|
|
- (void)testWithInvalidSDP;
|
|
- (void)testWithInvalidIceCandidate;
|
|
@end
|
|
|
|
@implementation RTCPeerConnectionTest
|
|
|
|
- (void)testConfigurationGetter {
|
|
NSArray *urlStrings = @[ @"stun:stun1.example.net" ];
|
|
RTC_OBJC_TYPE(RTCIceServer) *server =
|
|
[[RTC_OBJC_TYPE(RTCIceServer) alloc] initWithURLStrings:urlStrings];
|
|
|
|
RTC_OBJC_TYPE(RTCConfiguration) *config = [[RTC_OBJC_TYPE(RTCConfiguration) alloc] init];
|
|
config.sdpSemantics = RTCSdpSemanticsUnifiedPlan;
|
|
config.iceServers = @[ server ];
|
|
config.iceTransportPolicy = RTCIceTransportPolicyRelay;
|
|
config.bundlePolicy = RTCBundlePolicyMaxBundle;
|
|
config.rtcpMuxPolicy = RTCRtcpMuxPolicyNegotiate;
|
|
config.tcpCandidatePolicy = RTCTcpCandidatePolicyDisabled;
|
|
config.candidateNetworkPolicy = RTCCandidateNetworkPolicyLowCost;
|
|
const int maxPackets = 60;
|
|
const int timeout = 1500;
|
|
const int interval = 2000;
|
|
config.audioJitterBufferMaxPackets = maxPackets;
|
|
config.audioJitterBufferFastAccelerate = YES;
|
|
config.iceConnectionReceivingTimeout = timeout;
|
|
config.iceBackupCandidatePairPingInterval = interval;
|
|
config.continualGatheringPolicy =
|
|
RTCContinualGatheringPolicyGatherContinually;
|
|
config.shouldPruneTurnPorts = YES;
|
|
config.activeResetSrtpParams = YES;
|
|
config.cryptoOptions =
|
|
[[RTC_OBJC_TYPE(RTCCryptoOptions) alloc] initWithSrtpEnableGcmCryptoSuites:YES
|
|
srtpEnableAes128Sha1_32CryptoCipher:YES
|
|
srtpEnableEncryptedRtpHeaderExtensions:NO
|
|
sframeRequireFrameEncryption:NO];
|
|
|
|
RTC_OBJC_TYPE(RTCMediaConstraints) *contraints =
|
|
[[RTC_OBJC_TYPE(RTCMediaConstraints) alloc] initWithMandatoryConstraints:@{}
|
|
optionalConstraints:nil];
|
|
RTC_OBJC_TYPE(RTCPeerConnectionFactory) *factory =
|
|
[[RTC_OBJC_TYPE(RTCPeerConnectionFactory) alloc] init];
|
|
|
|
RTC_OBJC_TYPE(RTCConfiguration) * newConfig;
|
|
@autoreleasepool {
|
|
RTC_OBJC_TYPE(RTCPeerConnection) *peerConnection =
|
|
[factory peerConnectionWithConfiguration:config constraints:contraints delegate:nil];
|
|
newConfig = peerConnection.configuration;
|
|
|
|
EXPECT_TRUE([peerConnection setBweMinBitrateBps:[NSNumber numberWithInt:100000]
|
|
currentBitrateBps:[NSNumber numberWithInt:5000000]
|
|
maxBitrateBps:[NSNumber numberWithInt:500000000]]);
|
|
EXPECT_FALSE([peerConnection setBweMinBitrateBps:[NSNumber numberWithInt:2]
|
|
currentBitrateBps:[NSNumber numberWithInt:1]
|
|
maxBitrateBps:nil]);
|
|
}
|
|
|
|
EXPECT_EQ([config.iceServers count], [newConfig.iceServers count]);
|
|
RTC_OBJC_TYPE(RTCIceServer) *newServer = newConfig.iceServers[0];
|
|
RTC_OBJC_TYPE(RTCIceServer) *origServer = config.iceServers[0];
|
|
std::string origUrl = origServer.urlStrings.firstObject.UTF8String;
|
|
std::string url = newServer.urlStrings.firstObject.UTF8String;
|
|
EXPECT_EQ(origUrl, url);
|
|
|
|
EXPECT_EQ(config.iceTransportPolicy, newConfig.iceTransportPolicy);
|
|
EXPECT_EQ(config.bundlePolicy, newConfig.bundlePolicy);
|
|
EXPECT_EQ(config.rtcpMuxPolicy, newConfig.rtcpMuxPolicy);
|
|
EXPECT_EQ(config.tcpCandidatePolicy, newConfig.tcpCandidatePolicy);
|
|
EXPECT_EQ(config.candidateNetworkPolicy, newConfig.candidateNetworkPolicy);
|
|
EXPECT_EQ(config.audioJitterBufferMaxPackets, newConfig.audioJitterBufferMaxPackets);
|
|
EXPECT_EQ(config.audioJitterBufferFastAccelerate, newConfig.audioJitterBufferFastAccelerate);
|
|
EXPECT_EQ(config.iceConnectionReceivingTimeout, newConfig.iceConnectionReceivingTimeout);
|
|
EXPECT_EQ(config.iceBackupCandidatePairPingInterval,
|
|
newConfig.iceBackupCandidatePairPingInterval);
|
|
EXPECT_EQ(config.continualGatheringPolicy, newConfig.continualGatheringPolicy);
|
|
EXPECT_EQ(config.shouldPruneTurnPorts, newConfig.shouldPruneTurnPorts);
|
|
EXPECT_EQ(config.activeResetSrtpParams, newConfig.activeResetSrtpParams);
|
|
EXPECT_EQ(config.cryptoOptions.srtpEnableGcmCryptoSuites,
|
|
newConfig.cryptoOptions.srtpEnableGcmCryptoSuites);
|
|
EXPECT_EQ(config.cryptoOptions.srtpEnableAes128Sha1_32CryptoCipher,
|
|
newConfig.cryptoOptions.srtpEnableAes128Sha1_32CryptoCipher);
|
|
EXPECT_EQ(config.cryptoOptions.srtpEnableEncryptedRtpHeaderExtensions,
|
|
newConfig.cryptoOptions.srtpEnableEncryptedRtpHeaderExtensions);
|
|
EXPECT_EQ(config.cryptoOptions.sframeRequireFrameEncryption,
|
|
newConfig.cryptoOptions.sframeRequireFrameEncryption);
|
|
}
|
|
|
|
- (void)testWithDependencies {
|
|
NSArray *urlStrings = @[ @"stun:stun1.example.net" ];
|
|
RTC_OBJC_TYPE(RTCIceServer) *server =
|
|
[[RTC_OBJC_TYPE(RTCIceServer) alloc] initWithURLStrings:urlStrings];
|
|
|
|
RTC_OBJC_TYPE(RTCConfiguration) *config = [[RTC_OBJC_TYPE(RTCConfiguration) alloc] init];
|
|
config.sdpSemantics = RTCSdpSemanticsUnifiedPlan;
|
|
config.iceServers = @[ server ];
|
|
RTC_OBJC_TYPE(RTCMediaConstraints) *contraints =
|
|
[[RTC_OBJC_TYPE(RTCMediaConstraints) alloc] initWithMandatoryConstraints:@{}
|
|
optionalConstraints:nil];
|
|
RTC_OBJC_TYPE(RTCPeerConnectionFactory) *factory =
|
|
[[RTC_OBJC_TYPE(RTCPeerConnectionFactory) alloc] init];
|
|
|
|
std::unique_ptr<webrtc::PeerConnectionDependencies> pc_dependencies =
|
|
std::make_unique<webrtc::PeerConnectionDependencies>(nullptr);
|
|
@autoreleasepool {
|
|
RTC_OBJC_TYPE(RTCPeerConnection) *peerConnection =
|
|
[factory peerConnectionWithDependencies:config
|
|
constraints:contraints
|
|
dependencies:std::move(pc_dependencies)
|
|
delegate:nil];
|
|
ASSERT_NE(peerConnection, nil);
|
|
}
|
|
}
|
|
|
|
- (void)testWithInvalidSDP {
|
|
RTC_OBJC_TYPE(RTCPeerConnectionFactory) *factory =
|
|
[[RTC_OBJC_TYPE(RTCPeerConnectionFactory) alloc] init];
|
|
|
|
RTC_OBJC_TYPE(RTCConfiguration) *config = [[RTC_OBJC_TYPE(RTCConfiguration) alloc] init];
|
|
config.sdpSemantics = RTCSdpSemanticsUnifiedPlan;
|
|
RTC_OBJC_TYPE(RTCMediaConstraints) *contraints =
|
|
[[RTC_OBJC_TYPE(RTCMediaConstraints) alloc] initWithMandatoryConstraints:@{}
|
|
optionalConstraints:nil];
|
|
RTC_OBJC_TYPE(RTCPeerConnection) *peerConnection =
|
|
[factory peerConnectionWithConfiguration:config constraints:contraints delegate:nil];
|
|
|
|
dispatch_semaphore_t negotiatedSem = dispatch_semaphore_create(0);
|
|
[peerConnection setRemoteDescription:[[RTC_OBJC_TYPE(RTCSessionDescription) alloc]
|
|
initWithType:RTCSdpTypeOffer
|
|
sdp:@"invalid"]
|
|
completionHandler:^(NSError *error) {
|
|
ASSERT_NE(error, nil);
|
|
if (error != nil) {
|
|
dispatch_semaphore_signal(negotiatedSem);
|
|
}
|
|
}];
|
|
|
|
NSTimeInterval timeout = 5;
|
|
ASSERT_EQ(
|
|
0,
|
|
dispatch_semaphore_wait(negotiatedSem,
|
|
dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeout * NSEC_PER_SEC))));
|
|
[peerConnection close];
|
|
}
|
|
|
|
- (void)testWithInvalidIceCandidate {
|
|
RTC_OBJC_TYPE(RTCPeerConnectionFactory) *factory =
|
|
[[RTC_OBJC_TYPE(RTCPeerConnectionFactory) alloc] init];
|
|
|
|
RTC_OBJC_TYPE(RTCConfiguration) *config = [[RTC_OBJC_TYPE(RTCConfiguration) alloc] init];
|
|
config.sdpSemantics = RTCSdpSemanticsUnifiedPlan;
|
|
RTC_OBJC_TYPE(RTCMediaConstraints) *contraints =
|
|
[[RTC_OBJC_TYPE(RTCMediaConstraints) alloc] initWithMandatoryConstraints:@{}
|
|
optionalConstraints:nil];
|
|
RTC_OBJC_TYPE(RTCPeerConnection) *peerConnection =
|
|
[factory peerConnectionWithConfiguration:config constraints:contraints delegate:nil];
|
|
|
|
dispatch_semaphore_t negotiatedSem = dispatch_semaphore_create(0);
|
|
[peerConnection addIceCandidate:[[RTC_OBJC_TYPE(RTCIceCandidate) alloc] initWithSdp:@"invalid"
|
|
sdpMLineIndex:-1
|
|
sdpMid:nil]
|
|
completionHandler:^(NSError *error) {
|
|
ASSERT_NE(error, nil);
|
|
if (error != nil) {
|
|
dispatch_semaphore_signal(negotiatedSem);
|
|
}
|
|
}];
|
|
|
|
NSTimeInterval timeout = 5;
|
|
ASSERT_EQ(
|
|
0,
|
|
dispatch_semaphore_wait(negotiatedSem,
|
|
dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeout * NSEC_PER_SEC))));
|
|
[peerConnection close];
|
|
}
|
|
|
|
@end
|
|
|
|
TEST(RTCPeerConnectionTest, ConfigurationGetterTest) {
|
|
@autoreleasepool {
|
|
RTCPeerConnectionTest *test = [[RTCPeerConnectionTest alloc] init];
|
|
[test testConfigurationGetter];
|
|
}
|
|
}
|
|
|
|
TEST(RTCPeerConnectionTest, TestWithDependencies) {
|
|
@autoreleasepool {
|
|
RTCPeerConnectionTest *test = [[RTCPeerConnectionTest alloc] init];
|
|
[test testWithDependencies];
|
|
}
|
|
}
|
|
|
|
TEST(RTCPeerConnectionTest, TestWithInvalidSDP) {
|
|
@autoreleasepool {
|
|
RTCPeerConnectionTest *test = [[RTCPeerConnectionTest alloc] init];
|
|
[test testWithInvalidSDP];
|
|
}
|
|
}
|
|
|
|
TEST(RTCPeerConnectionTest, TestWithInvalidIceCandidate) {
|
|
@autoreleasepool {
|
|
RTCPeerConnectionTest *test = [[RTCPeerConnectionTest alloc] init];
|
|
[test testWithInvalidIceCandidate];
|
|
}
|
|
}
|