1*d9f75844SAndroid Build Coastguard Worker/* 2*d9f75844SAndroid Build Coastguard Worker * Copyright 2015 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker#import <Foundation/Foundation.h> 12*d9f75844SAndroid Build Coastguard Worker#import <XCTest/XCTest.h> 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard Worker#include <memory> 15*d9f75844SAndroid Build Coastguard Worker#include <vector> 16*d9f75844SAndroid Build Coastguard Worker 17*d9f75844SAndroid Build Coastguard Worker#include "rtc_base/gunit.h" 18*d9f75844SAndroid Build Coastguard Worker 19*d9f75844SAndroid Build Coastguard Worker#import "api/peerconnection/RTCConfiguration+Private.h" 20*d9f75844SAndroid Build Coastguard Worker#import "api/peerconnection/RTCConfiguration.h" 21*d9f75844SAndroid Build Coastguard Worker#import "api/peerconnection/RTCCryptoOptions.h" 22*d9f75844SAndroid Build Coastguard Worker#import "api/peerconnection/RTCIceCandidate.h" 23*d9f75844SAndroid Build Coastguard Worker#import "api/peerconnection/RTCIceServer.h" 24*d9f75844SAndroid Build Coastguard Worker#import "api/peerconnection/RTCMediaConstraints.h" 25*d9f75844SAndroid Build Coastguard Worker#import "api/peerconnection/RTCPeerConnection.h" 26*d9f75844SAndroid Build Coastguard Worker#import "api/peerconnection/RTCPeerConnectionFactory+Native.h" 27*d9f75844SAndroid Build Coastguard Worker#import "api/peerconnection/RTCPeerConnectionFactory.h" 28*d9f75844SAndroid Build Coastguard Worker#import "api/peerconnection/RTCSessionDescription.h" 29*d9f75844SAndroid Build Coastguard Worker#import "helpers/NSString+StdString.h" 30*d9f75844SAndroid Build Coastguard Worker 31*d9f75844SAndroid Build Coastguard Worker@interface RTCPeerConnectionTests : XCTestCase 32*d9f75844SAndroid Build Coastguard Worker@end 33*d9f75844SAndroid Build Coastguard Worker 34*d9f75844SAndroid Build Coastguard Worker@implementation RTCPeerConnectionTests 35*d9f75844SAndroid Build Coastguard Worker 36*d9f75844SAndroid Build Coastguard Worker- (void)testConfigurationGetter { 37*d9f75844SAndroid Build Coastguard Worker NSArray *urlStrings = @[ @"stun:stun1.example.net" ]; 38*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCIceServer) *server = 39*d9f75844SAndroid Build Coastguard Worker [[RTC_OBJC_TYPE(RTCIceServer) alloc] initWithURLStrings:urlStrings]; 40*d9f75844SAndroid Build Coastguard Worker 41*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCConfiguration) *config = [[RTC_OBJC_TYPE(RTCConfiguration) alloc] init]; 42*d9f75844SAndroid Build Coastguard Worker config.sdpSemantics = RTCSdpSemanticsUnifiedPlan; 43*d9f75844SAndroid Build Coastguard Worker config.iceServers = @[ server ]; 44*d9f75844SAndroid Build Coastguard Worker config.iceTransportPolicy = RTCIceTransportPolicyRelay; 45*d9f75844SAndroid Build Coastguard Worker config.bundlePolicy = RTCBundlePolicyMaxBundle; 46*d9f75844SAndroid Build Coastguard Worker config.rtcpMuxPolicy = RTCRtcpMuxPolicyNegotiate; 47*d9f75844SAndroid Build Coastguard Worker config.tcpCandidatePolicy = RTCTcpCandidatePolicyDisabled; 48*d9f75844SAndroid Build Coastguard Worker config.candidateNetworkPolicy = RTCCandidateNetworkPolicyLowCost; 49*d9f75844SAndroid Build Coastguard Worker const int maxPackets = 60; 50*d9f75844SAndroid Build Coastguard Worker const int timeout = 1500; 51*d9f75844SAndroid Build Coastguard Worker const int interval = 2000; 52*d9f75844SAndroid Build Coastguard Worker config.audioJitterBufferMaxPackets = maxPackets; 53*d9f75844SAndroid Build Coastguard Worker config.audioJitterBufferFastAccelerate = YES; 54*d9f75844SAndroid Build Coastguard Worker config.iceConnectionReceivingTimeout = timeout; 55*d9f75844SAndroid Build Coastguard Worker config.iceBackupCandidatePairPingInterval = interval; 56*d9f75844SAndroid Build Coastguard Worker config.continualGatheringPolicy = 57*d9f75844SAndroid Build Coastguard Worker RTCContinualGatheringPolicyGatherContinually; 58*d9f75844SAndroid Build Coastguard Worker config.shouldPruneTurnPorts = YES; 59*d9f75844SAndroid Build Coastguard Worker config.activeResetSrtpParams = YES; 60*d9f75844SAndroid Build Coastguard Worker config.cryptoOptions = 61*d9f75844SAndroid Build Coastguard Worker [[RTC_OBJC_TYPE(RTCCryptoOptions) alloc] initWithSrtpEnableGcmCryptoSuites:YES 62*d9f75844SAndroid Build Coastguard Worker srtpEnableAes128Sha1_32CryptoCipher:YES 63*d9f75844SAndroid Build Coastguard Worker srtpEnableEncryptedRtpHeaderExtensions:NO 64*d9f75844SAndroid Build Coastguard Worker sframeRequireFrameEncryption:NO]; 65*d9f75844SAndroid Build Coastguard Worker 66*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCMediaConstraints) *contraints = 67*d9f75844SAndroid Build Coastguard Worker [[RTC_OBJC_TYPE(RTCMediaConstraints) alloc] initWithMandatoryConstraints:@{} 68*d9f75844SAndroid Build Coastguard Worker optionalConstraints:nil]; 69*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCPeerConnectionFactory) *factory = 70*d9f75844SAndroid Build Coastguard Worker [[RTC_OBJC_TYPE(RTCPeerConnectionFactory) alloc] init]; 71*d9f75844SAndroid Build Coastguard Worker 72*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCConfiguration) * newConfig; 73*d9f75844SAndroid Build Coastguard Worker @autoreleasepool { 74*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCPeerConnection) *peerConnection = 75*d9f75844SAndroid Build Coastguard Worker [factory peerConnectionWithConfiguration:config constraints:contraints delegate:nil]; 76*d9f75844SAndroid Build Coastguard Worker newConfig = peerConnection.configuration; 77*d9f75844SAndroid Build Coastguard Worker 78*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE([peerConnection setBweMinBitrateBps:[NSNumber numberWithInt:100000] 79*d9f75844SAndroid Build Coastguard Worker currentBitrateBps:[NSNumber numberWithInt:5000000] 80*d9f75844SAndroid Build Coastguard Worker maxBitrateBps:[NSNumber numberWithInt:500000000]]); 81*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE([peerConnection setBweMinBitrateBps:[NSNumber numberWithInt:2] 82*d9f75844SAndroid Build Coastguard Worker currentBitrateBps:[NSNumber numberWithInt:1] 83*d9f75844SAndroid Build Coastguard Worker maxBitrateBps:nil]); 84*d9f75844SAndroid Build Coastguard Worker } 85*d9f75844SAndroid Build Coastguard Worker 86*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ([config.iceServers count], [newConfig.iceServers count]); 87*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCIceServer) *newServer = newConfig.iceServers[0]; 88*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCIceServer) *origServer = config.iceServers[0]; 89*d9f75844SAndroid Build Coastguard Worker std::string origUrl = origServer.urlStrings.firstObject.UTF8String; 90*d9f75844SAndroid Build Coastguard Worker std::string url = newServer.urlStrings.firstObject.UTF8String; 91*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(origUrl, url); 92*d9f75844SAndroid Build Coastguard Worker 93*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(config.iceTransportPolicy, newConfig.iceTransportPolicy); 94*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(config.bundlePolicy, newConfig.bundlePolicy); 95*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(config.rtcpMuxPolicy, newConfig.rtcpMuxPolicy); 96*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(config.tcpCandidatePolicy, newConfig.tcpCandidatePolicy); 97*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(config.candidateNetworkPolicy, newConfig.candidateNetworkPolicy); 98*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(config.audioJitterBufferMaxPackets, newConfig.audioJitterBufferMaxPackets); 99*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(config.audioJitterBufferFastAccelerate, newConfig.audioJitterBufferFastAccelerate); 100*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(config.iceConnectionReceivingTimeout, newConfig.iceConnectionReceivingTimeout); 101*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(config.iceBackupCandidatePairPingInterval, 102*d9f75844SAndroid Build Coastguard Worker newConfig.iceBackupCandidatePairPingInterval); 103*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(config.continualGatheringPolicy, newConfig.continualGatheringPolicy); 104*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(config.shouldPruneTurnPorts, newConfig.shouldPruneTurnPorts); 105*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(config.activeResetSrtpParams, newConfig.activeResetSrtpParams); 106*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(config.cryptoOptions.srtpEnableGcmCryptoSuites, 107*d9f75844SAndroid Build Coastguard Worker newConfig.cryptoOptions.srtpEnableGcmCryptoSuites); 108*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(config.cryptoOptions.srtpEnableAes128Sha1_32CryptoCipher, 109*d9f75844SAndroid Build Coastguard Worker newConfig.cryptoOptions.srtpEnableAes128Sha1_32CryptoCipher); 110*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(config.cryptoOptions.srtpEnableEncryptedRtpHeaderExtensions, 111*d9f75844SAndroid Build Coastguard Worker newConfig.cryptoOptions.srtpEnableEncryptedRtpHeaderExtensions); 112*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(config.cryptoOptions.sframeRequireFrameEncryption, 113*d9f75844SAndroid Build Coastguard Worker newConfig.cryptoOptions.sframeRequireFrameEncryption); 114*d9f75844SAndroid Build Coastguard Worker} 115*d9f75844SAndroid Build Coastguard Worker 116*d9f75844SAndroid Build Coastguard Worker- (void)testWithDependencies { 117*d9f75844SAndroid Build Coastguard Worker NSArray *urlStrings = @[ @"stun:stun1.example.net" ]; 118*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCIceServer) *server = 119*d9f75844SAndroid Build Coastguard Worker [[RTC_OBJC_TYPE(RTCIceServer) alloc] initWithURLStrings:urlStrings]; 120*d9f75844SAndroid Build Coastguard Worker 121*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCConfiguration) *config = [[RTC_OBJC_TYPE(RTCConfiguration) alloc] init]; 122*d9f75844SAndroid Build Coastguard Worker config.sdpSemantics = RTCSdpSemanticsUnifiedPlan; 123*d9f75844SAndroid Build Coastguard Worker config.iceServers = @[ server ]; 124*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCMediaConstraints) *contraints = 125*d9f75844SAndroid Build Coastguard Worker [[RTC_OBJC_TYPE(RTCMediaConstraints) alloc] initWithMandatoryConstraints:@{} 126*d9f75844SAndroid Build Coastguard Worker optionalConstraints:nil]; 127*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCPeerConnectionFactory) *factory = 128*d9f75844SAndroid Build Coastguard Worker [[RTC_OBJC_TYPE(RTCPeerConnectionFactory) alloc] init]; 129*d9f75844SAndroid Build Coastguard Worker 130*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<webrtc::PeerConnectionDependencies> pc_dependencies = 131*d9f75844SAndroid Build Coastguard Worker std::make_unique<webrtc::PeerConnectionDependencies>(nullptr); 132*d9f75844SAndroid Build Coastguard Worker @autoreleasepool { 133*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCPeerConnection) *peerConnection = 134*d9f75844SAndroid Build Coastguard Worker [factory peerConnectionWithDependencies:config 135*d9f75844SAndroid Build Coastguard Worker constraints:contraints 136*d9f75844SAndroid Build Coastguard Worker dependencies:std::move(pc_dependencies) 137*d9f75844SAndroid Build Coastguard Worker delegate:nil]; 138*d9f75844SAndroid Build Coastguard Worker ASSERT_NE(peerConnection, nil); 139*d9f75844SAndroid Build Coastguard Worker } 140*d9f75844SAndroid Build Coastguard Worker} 141*d9f75844SAndroid Build Coastguard Worker 142*d9f75844SAndroid Build Coastguard Worker- (void)testWithInvalidSDP { 143*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCPeerConnectionFactory) *factory = 144*d9f75844SAndroid Build Coastguard Worker [[RTC_OBJC_TYPE(RTCPeerConnectionFactory) alloc] init]; 145*d9f75844SAndroid Build Coastguard Worker 146*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCConfiguration) *config = [[RTC_OBJC_TYPE(RTCConfiguration) alloc] init]; 147*d9f75844SAndroid Build Coastguard Worker config.sdpSemantics = RTCSdpSemanticsUnifiedPlan; 148*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCMediaConstraints) *contraints = 149*d9f75844SAndroid Build Coastguard Worker [[RTC_OBJC_TYPE(RTCMediaConstraints) alloc] initWithMandatoryConstraints:@{} 150*d9f75844SAndroid Build Coastguard Worker optionalConstraints:nil]; 151*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCPeerConnection) *peerConnection = 152*d9f75844SAndroid Build Coastguard Worker [factory peerConnectionWithConfiguration:config constraints:contraints delegate:nil]; 153*d9f75844SAndroid Build Coastguard Worker 154*d9f75844SAndroid Build Coastguard Worker dispatch_semaphore_t negotiatedSem = dispatch_semaphore_create(0); 155*d9f75844SAndroid Build Coastguard Worker [peerConnection setRemoteDescription:[[RTC_OBJC_TYPE(RTCSessionDescription) alloc] 156*d9f75844SAndroid Build Coastguard Worker initWithType:RTCSdpTypeOffer 157*d9f75844SAndroid Build Coastguard Worker sdp:@"invalid"] 158*d9f75844SAndroid Build Coastguard Worker completionHandler:^(NSError *error) { 159*d9f75844SAndroid Build Coastguard Worker ASSERT_NE(error, nil); 160*d9f75844SAndroid Build Coastguard Worker if (error != nil) { 161*d9f75844SAndroid Build Coastguard Worker dispatch_semaphore_signal(negotiatedSem); 162*d9f75844SAndroid Build Coastguard Worker } 163*d9f75844SAndroid Build Coastguard Worker }]; 164*d9f75844SAndroid Build Coastguard Worker 165*d9f75844SAndroid Build Coastguard Worker NSTimeInterval timeout = 5; 166*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ( 167*d9f75844SAndroid Build Coastguard Worker 0, 168*d9f75844SAndroid Build Coastguard Worker dispatch_semaphore_wait(negotiatedSem, 169*d9f75844SAndroid Build Coastguard Worker dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeout * NSEC_PER_SEC)))); 170*d9f75844SAndroid Build Coastguard Worker [peerConnection close]; 171*d9f75844SAndroid Build Coastguard Worker} 172*d9f75844SAndroid Build Coastguard Worker 173*d9f75844SAndroid Build Coastguard Worker- (void)testWithInvalidIceCandidate { 174*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCPeerConnectionFactory) *factory = 175*d9f75844SAndroid Build Coastguard Worker [[RTC_OBJC_TYPE(RTCPeerConnectionFactory) alloc] init]; 176*d9f75844SAndroid Build Coastguard Worker 177*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCConfiguration) *config = [[RTC_OBJC_TYPE(RTCConfiguration) alloc] init]; 178*d9f75844SAndroid Build Coastguard Worker config.sdpSemantics = RTCSdpSemanticsUnifiedPlan; 179*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCMediaConstraints) *contraints = 180*d9f75844SAndroid Build Coastguard Worker [[RTC_OBJC_TYPE(RTCMediaConstraints) alloc] initWithMandatoryConstraints:@{} 181*d9f75844SAndroid Build Coastguard Worker optionalConstraints:nil]; 182*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCPeerConnection) *peerConnection = 183*d9f75844SAndroid Build Coastguard Worker [factory peerConnectionWithConfiguration:config constraints:contraints delegate:nil]; 184*d9f75844SAndroid Build Coastguard Worker 185*d9f75844SAndroid Build Coastguard Worker dispatch_semaphore_t negotiatedSem = dispatch_semaphore_create(0); 186*d9f75844SAndroid Build Coastguard Worker [peerConnection addIceCandidate:[[RTC_OBJC_TYPE(RTCIceCandidate) alloc] initWithSdp:@"invalid" 187*d9f75844SAndroid Build Coastguard Worker sdpMLineIndex:-1 188*d9f75844SAndroid Build Coastguard Worker sdpMid:nil] 189*d9f75844SAndroid Build Coastguard Worker completionHandler:^(NSError *error) { 190*d9f75844SAndroid Build Coastguard Worker ASSERT_NE(error, nil); 191*d9f75844SAndroid Build Coastguard Worker if (error != nil) { 192*d9f75844SAndroid Build Coastguard Worker dispatch_semaphore_signal(negotiatedSem); 193*d9f75844SAndroid Build Coastguard Worker } 194*d9f75844SAndroid Build Coastguard Worker }]; 195*d9f75844SAndroid Build Coastguard Worker 196*d9f75844SAndroid Build Coastguard Worker NSTimeInterval timeout = 5; 197*d9f75844SAndroid Build Coastguard Worker ASSERT_EQ( 198*d9f75844SAndroid Build Coastguard Worker 0, 199*d9f75844SAndroid Build Coastguard Worker dispatch_semaphore_wait(negotiatedSem, 200*d9f75844SAndroid Build Coastguard Worker dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeout * NSEC_PER_SEC)))); 201*d9f75844SAndroid Build Coastguard Worker [peerConnection close]; 202*d9f75844SAndroid Build Coastguard Worker} 203*d9f75844SAndroid Build Coastguard Worker 204*d9f75844SAndroid Build Coastguard Worker@end 205