Fixed crash when PCF is destroyed before PC in ObjC
Bug: webrtc:9231
Change-Id: Iaf18257b8f38fa786d462bca5f860f9a7b1cc2d0
Reviewed-on: https://webrtc-review.googlesource.com/78800
Commit-Queue: Kári Helgason <kthelgason@webrtc.org>
Reviewed-by: Kári Helgason <kthelgason@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#23674}
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index fb7a37c..822c3c2 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -820,6 +820,7 @@
"objc/Framework/UnitTests/RTCDoNotPutCPlusPlusInFrameworkHeaders_xctest.m",
"objc/Framework/UnitTests/RTCFileVideoCapturer_xctest.mm",
"objc/Framework/UnitTests/RTCH264ProfileLevelId_xctest.m",
+ "objc/Framework/UnitTests/RTCPeerConnectionFactory_xctest.m",
"objc/Framework/UnitTests/frame_buffer_helpers.h",
"objc/Framework/UnitTests/frame_buffer_helpers.mm",
]
@@ -900,6 +901,7 @@
_bundle_id_suffix = ios_generic_test_bundle_id_suffix
extra_substitutions = [ "GTEST_BUNDLE_ID_SUFFIX=$_bundle_id_suffix" ]
deps = [
+ ":peerconnectionfactory_base_objc",
":sdk_unittests_bundle_data",
":sdk_unittests_sources",
]
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnection.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnection.mm
index 9b2462e..c169422 100644
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnection.mm
+++ b/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnection.mm
@@ -240,6 +240,7 @@
@implementation RTCPeerConnection {
+ RTCPeerConnectionFactory *_factory;
NSMutableArray<RTCMediaStream *> *_localStreams;
std::unique_ptr<webrtc::PeerConnectionDelegateAdapter> _observer;
rtc::scoped_refptr<webrtc::PeerConnectionInterface> _peerConnection;
@@ -272,6 +273,7 @@
if (!_peerConnection) {
return nil;
}
+ _factory = factory;
_localStreams = [[NSMutableArray alloc] init];
_delegate = delegate;
}
diff --git a/sdk/objc/Framework/UnitTests/RTCPeerConnectionFactory_xctest.m b/sdk/objc/Framework/UnitTests/RTCPeerConnectionFactory_xctest.m
new file mode 100644
index 0000000..1c678d6
--- /dev/null
+++ b/sdk/objc/Framework/UnitTests/RTCPeerConnectionFactory_xctest.m
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2018 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 <WebRTC/RTCConfiguration.h>
+#import <WebRTC/RTCMediaConstraints.h>
+#import <WebRTC/RTCPeerConnection.h>
+#import <WebRTC/RTCPeerConnectionFactory.h>
+
+#import <XCTest/XCTest.h>
+
+@interface RTCPeerConnectionFactoryTests : XCTestCase
+- (void)testPeerConnectionLifetime;
+@end
+
+@implementation RTCPeerConnectionFactoryTests
+
+- (void)testPeerConnectionLifetime {
+ @autoreleasepool {
+ RTCConfiguration *config = [[RTCConfiguration alloc] init];
+
+ RTCMediaConstraints *contraints =
+ [[RTCMediaConstraints alloc] initWithMandatoryConstraints:@{} optionalConstraints:nil];
+
+ RTCPeerConnectionFactory *factory = [[RTCPeerConnectionFactory alloc] init];
+
+ RTCPeerConnection *peerConnection =
+ [factory peerConnectionWithConfiguration:config constraints:contraints delegate:nil];
+
+ [peerConnection close];
+
+ factory = nil;
+ peerConnection = nil;
+ }
+
+ XCTAssertTrue(true, @"Expect test does not crash");
+}
+
+@end