diff --git a/webrtc/sdk/BUILD.gn b/webrtc/sdk/BUILD.gn index 644a94f444..d8e745c83f 100644 --- a/webrtc/sdk/BUILD.gn +++ b/webrtc/sdk/BUILD.gn @@ -268,6 +268,7 @@ if (is_ios || is_mac) { "objc/Framework/UnitTests/RTCIceCandidateTest.mm", "objc/Framework/UnitTests/RTCIceServerTest.mm", "objc/Framework/UnitTests/RTCMediaConstraintsTest.mm", + "objc/Framework/UnitTests/RTCPeerConnectionTest.mm", "objc/Framework/UnitTests/RTCSessionDescriptionTest.mm", "objc/Framework/UnitTests/avformatmappertests.mm", ] diff --git a/webrtc/sdk/objc/Framework/Classes/RTCConfiguration+Private.h b/webrtc/sdk/objc/Framework/Classes/RTCConfiguration+Private.h index f20cdc5c4a..05a503404a 100644 --- a/webrtc/sdk/objc/Framework/Classes/RTCConfiguration+Private.h +++ b/webrtc/sdk/objc/Framework/Classes/RTCConfiguration+Private.h @@ -65,6 +65,9 @@ NS_ASSUME_NONNULL_BEGIN - (webrtc::PeerConnectionInterface::RTCConfiguration *) createNativeConfiguration; +- (instancetype)initWithNativeConfiguration: + (const webrtc::PeerConnectionInterface::RTCConfiguration *)config NS_DESIGNATED_INITIALIZER; + @end NS_ASSUME_NONNULL_END diff --git a/webrtc/sdk/objc/Framework/Classes/RTCConfiguration.mm b/webrtc/sdk/objc/Framework/Classes/RTCConfiguration.mm index ae37fc1c1f..54d8eac867 100644 --- a/webrtc/sdk/objc/Framework/Classes/RTCConfiguration.mm +++ b/webrtc/sdk/objc/Framework/Classes/RTCConfiguration.mm @@ -40,38 +40,49 @@ @synthesize iceCheckMinInterval = _iceCheckMinInterval; - (instancetype)init { + // Copy defaults. + webrtc::PeerConnectionInterface::RTCConfiguration config( + webrtc::PeerConnectionInterface::RTCConfigurationType::kAggressive); + return [self initWithNativeConfiguration:&config]; +} + +- (instancetype)initWithNativeConfiguration: + (const webrtc::PeerConnectionInterface::RTCConfiguration *)config { + NSParameterAssert(config); if (self = [super init]) { - _iceServers = [NSMutableArray array]; - // Copy defaults. - webrtc::PeerConnectionInterface::RTCConfiguration config( - webrtc::PeerConnectionInterface::RTCConfigurationType::kAggressive); + NSMutableArray *iceServers = [NSMutableArray array]; + for (const webrtc::PeerConnectionInterface::IceServer& server : config->servers) { + RTCIceServer *iceServer = [[RTCIceServer alloc] initWithNativeServer:server]; + [iceServers addObject:iceServer]; + } + _iceServers = iceServers; _iceTransportPolicy = - [[self class] transportPolicyForTransportsType:config.type]; + [[self class] transportPolicyForTransportsType:config->type]; _bundlePolicy = - [[self class] bundlePolicyForNativePolicy:config.bundle_policy]; + [[self class] bundlePolicyForNativePolicy:config->bundle_policy]; _rtcpMuxPolicy = - [[self class] rtcpMuxPolicyForNativePolicy:config.rtcp_mux_policy]; + [[self class] rtcpMuxPolicyForNativePolicy:config->rtcp_mux_policy]; _tcpCandidatePolicy = [[self class] tcpCandidatePolicyForNativePolicy: - config.tcp_candidate_policy]; + config->tcp_candidate_policy]; _candidateNetworkPolicy = [[self class] - candidateNetworkPolicyForNativePolicy:config.candidate_network_policy]; + candidateNetworkPolicyForNativePolicy:config->candidate_network_policy]; webrtc::PeerConnectionInterface::ContinualGatheringPolicy nativePolicy = - config.continual_gathering_policy; + config->continual_gathering_policy; _continualGatheringPolicy = [[self class] continualGatheringPolicyForNativePolicy:nativePolicy]; - _audioJitterBufferMaxPackets = config.audio_jitter_buffer_max_packets; - _audioJitterBufferFastAccelerate = config.audio_jitter_buffer_fast_accelerate; - _iceConnectionReceivingTimeout = config.ice_connection_receiving_timeout; + _audioJitterBufferMaxPackets = config->audio_jitter_buffer_max_packets; + _audioJitterBufferFastAccelerate = config->audio_jitter_buffer_fast_accelerate; + _iceConnectionReceivingTimeout = config->ice_connection_receiving_timeout; _iceBackupCandidatePairPingInterval = - config.ice_backup_candidate_pair_ping_interval; + config->ice_backup_candidate_pair_ping_interval; _keyType = RTCEncryptionKeyTypeECDSA; - _iceCandidatePoolSize = config.ice_candidate_pool_size; - _shouldPruneTurnPorts = config.prune_turn_ports; + _iceCandidatePoolSize = config->ice_candidate_pool_size; + _shouldPruneTurnPorts = config->prune_turn_ports; _shouldPresumeWritableWhenFullyRelayed = - config.presume_writable_when_fully_relayed; - if (config.ice_check_min_interval) { + config->presume_writable_when_fully_relayed; + if (config->ice_check_min_interval) { _iceCheckMinInterval = - [NSNumber numberWithInt:*config.ice_check_min_interval]; + [NSNumber numberWithInt:*config->ice_check_min_interval]; } } return self; diff --git a/webrtc/sdk/objc/Framework/Classes/RTCPeerConnection.mm b/webrtc/sdk/objc/Framework/Classes/RTCPeerConnection.mm index de7608c3b9..7c8eb4d54b 100644 --- a/webrtc/sdk/objc/Framework/Classes/RTCPeerConnection.mm +++ b/webrtc/sdk/objc/Framework/Classes/RTCPeerConnection.mm @@ -288,6 +288,12 @@ void PeerConnectionDelegateAdapter::OnIceCandidatesRemoved( return _peerConnection->SetConfiguration(*config); } +- (RTCConfiguration *)configuration { + webrtc::PeerConnectionInterface::RTCConfiguration config = + _peerConnection->GetConfiguration(); + return [[RTCConfiguration alloc] initWithNativeConfiguration:&config]; +} + - (void)close { _peerConnection->Close(); } diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCConfiguration.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCConfiguration.h index c5162409e0..862a01d4f6 100644 --- a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCConfiguration.h +++ b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCConfiguration.h @@ -109,7 +109,7 @@ RTC_EXPORT */ @property(nonatomic, copy, nullable) NSNumber *iceCheckMinInterval; -- (instancetype)init NS_DESIGNATED_INITIALIZER; +- (instancetype)init; @end diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCPeerConnection.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCPeerConnection.h index 4438eb28ab..13617b5520 100644 --- a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCPeerConnection.h +++ b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCPeerConnection.h @@ -123,6 +123,7 @@ RTC_EXPORT @property(nonatomic, readonly) RTCSignalingState signalingState; @property(nonatomic, readonly) RTCIceConnectionState iceConnectionState; @property(nonatomic, readonly) RTCIceGatheringState iceGatheringState; +@property(nonatomic, readonly, copy) RTCConfiguration *configuration; /** Gets all RTCRtpSenders associated with this peer connection. * Note: reading this property returns different instances of RTCRtpSender. diff --git a/webrtc/sdk/objc/Framework/UnitTests/RTCConfigurationTest.mm b/webrtc/sdk/objc/Framework/UnitTests/RTCConfigurationTest.mm index 79ffd17289..fee2a49f76 100644 --- a/webrtc/sdk/objc/Framework/UnitTests/RTCConfigurationTest.mm +++ b/webrtc/sdk/objc/Framework/UnitTests/RTCConfigurationTest.mm @@ -21,6 +21,7 @@ @interface RTCConfigurationTest : NSObject - (void)testConversionToNativeConfiguration; +- (void)testNativeConversionToConfiguration; @end @implementation RTCConfigurationTest @@ -74,12 +75,60 @@ EXPECT_EQ(true, nativeConfig->prune_turn_ports); } +- (void)testNativeConversionToConfiguration { + NSArray *urlStrings = @[ @"stun:stun1.example.net" ]; + RTCIceServer *server = [[RTCIceServer alloc] initWithURLStrings:urlStrings]; + + RTCConfiguration *config = [[RTCConfiguration alloc] init]; + 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 = 1; + const int interval = 2; + config.audioJitterBufferMaxPackets = maxPackets; + config.audioJitterBufferFastAccelerate = YES; + config.iceConnectionReceivingTimeout = timeout; + config.iceBackupCandidatePairPingInterval = interval; + config.continualGatheringPolicy = + RTCContinualGatheringPolicyGatherContinually; + config.shouldPruneTurnPorts = YES; + + webrtc::PeerConnectionInterface::RTCConfiguration *nativeConfig = + [config createNativeConfiguration]; + RTCConfiguration *newConfig = [[RTCConfiguration alloc] initWithNativeConfiguration:nativeConfig]; + EXPECT_EQ([config.iceServers count], newConfig.iceServers.count); + RTCIceServer *newServer = newConfig.iceServers[0]; + RTCIceServer *origServer = config.iceServers[0]; + EXPECT_EQ(origServer.urlStrings.count, server.urlStrings.count); + 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); +} + @end TEST(RTCConfigurationTest, NativeConfigurationConversionTest) { @autoreleasepool { RTCConfigurationTest *test = [[RTCConfigurationTest alloc] init]; [test testConversionToNativeConfiguration]; + [test testNativeConversionToConfiguration]; } } diff --git a/webrtc/sdk/objc/Framework/UnitTests/RTCPeerConnectionTest.mm b/webrtc/sdk/objc/Framework/UnitTests/RTCPeerConnectionTest.mm new file mode 100644 index 0000000000..bd2db305da --- /dev/null +++ b/webrtc/sdk/objc/Framework/UnitTests/RTCPeerConnectionTest.mm @@ -0,0 +1,91 @@ +/* + * 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 + +#include + +#include "webrtc/base/gunit.h" + +#import "NSString+StdString.h" +#import "RTCConfiguration+Private.h" +#import "WebRTC/RTCConfiguration.h" +#import "WebRTC/RTCPeerConnection.h" +#import "WebRTC/RTCPeerConnectionFactory.h" +#import "WebRTC/RTCIceServer.h" +#import "WebRTC/RTCMediaConstraints.h" + +@interface RTCPeerConnectionTest : NSObject +- (void)testConfigurationGetter; +@end + +@implementation RTCPeerConnectionTest + +- (void)testConfigurationGetter { + NSArray *urlStrings = @[ @"stun:stun1.example.net" ]; + RTCIceServer *server = [[RTCIceServer alloc] initWithURLStrings:urlStrings]; + + RTCConfiguration *config = [[RTCConfiguration alloc] init]; + 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 = 1; + const int interval = 2; + config.audioJitterBufferMaxPackets = maxPackets; + config.audioJitterBufferFastAccelerate = YES; + config.iceConnectionReceivingTimeout = timeout; + config.iceBackupCandidatePairPingInterval = interval; + config.continualGatheringPolicy = + RTCContinualGatheringPolicyGatherContinually; + config.shouldPruneTurnPorts = YES; + + RTCMediaConstraints *contraints = [[RTCMediaConstraints alloc] initWithMandatoryConstraints:@{} + optionalConstraints:nil]; + RTCPeerConnectionFactory *factory = [[RTCPeerConnectionFactory alloc] init]; + RTCPeerConnection *peerConnection = [factory peerConnectionWithConfiguration:config + constraints:contraints delegate:nil]; + + RTCConfiguration *newConfig = peerConnection.configuration; + + EXPECT_EQ([config.iceServers count], [newConfig.iceServers count]); + RTCIceServer *newServer = newConfig.iceServers[0]; + 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); +} + +@end + +TEST(RTCPeerConnectionTest, ConfigurationGetterTest) { + @autoreleasepool { + RTCPeerConnectionTest *test = [[RTCPeerConnectionTest alloc] init]; + [test testConfigurationGetter]; + } +} + +