diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 2458100ac2..cba27be167 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -1873,6 +1873,7 @@ F0B872B8269D079B00D26481 /* ContextMenuConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0B872B7269D079B00D26481 /* ContextMenuConfiguration.swift */; }; F0EE4DB626A7AC18001DE4ED /* ContextMenuReactionBarAccessory.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0EE4DB526A7AC18001DE4ED /* ContextMenuReactionBarAccessory.swift */; }; F0FB6B20269E625A00AC2A41 /* ContextMenuController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0FB6B1F269E625A00AC2A41 /* ContextMenuController.swift */; }; + F5C80FA22BE3F29F0028F76D /* TurnServerInfoTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5C80FA12BE3F29F0028F76D /* TurnServerInfoTest.swift */; }; F900F2DD27F25AB400431E09 /* DonationReceiptViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F900F2DC27F25AB300431E09 /* DonationReceiptViewController.swift */; }; F903C29B28EC7AE60035B42B /* RegistrationIdGeneratorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = F903C29A28EC7AE60035B42B /* RegistrationIdGeneratorTest.swift */; }; F905DFEB29A534F200BAD034 /* RegistrationPhoneNumberDiscoverabilityViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F905DFEA29A534F200BAD034 /* RegistrationPhoneNumberDiscoverabilityViewController.swift */; }; @@ -4789,6 +4790,7 @@ F0C124B626D4788A0031C96F /* NSE-Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "NSE-Images.xcassets"; sourceTree = ""; }; F0EE4DB526A7AC18001DE4ED /* ContextMenuReactionBarAccessory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenuReactionBarAccessory.swift; sourceTree = ""; }; F0FB6B1F269E625A00AC2A41 /* ContextMenuController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenuController.swift; sourceTree = ""; }; + F5C80FA12BE3F29F0028F76D /* TurnServerInfoTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TurnServerInfoTest.swift; sourceTree = ""; }; F70CAD4E12CCE311EC60A2C9 /* Pods-SignalServiceKitTests.profiling.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SignalServiceKitTests.profiling.xcconfig"; path = "Target Support Files/Pods-SignalServiceKitTests/Pods-SignalServiceKitTests.profiling.xcconfig"; sourceTree = ""; }; F900F2DC27F25AB300431E09 /* DonationReceiptViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DonationReceiptViewController.swift; sourceTree = ""; }; F903C29A28EC7AE60035B42B /* RegistrationIdGeneratorTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegistrationIdGeneratorTest.swift; sourceTree = ""; }; @@ -6902,6 +6904,7 @@ 50552C302BAC079A00815474 /* CallLinkTest.swift */, E1D827D82BDC1F6B0022C1AF /* ReactionBurstManagerTests.swift */, E16B440D2BBF242C00D2583E /* ReactionsModelTest.swift */, + F5C80FA12BE3F29F0028F76D /* TurnServerInfoTest.swift */, ); path = Calls; sourceTree = ""; @@ -13359,6 +13362,7 @@ 8803FF6628EF89B50023574A /* StorySharingTests.swift in Sources */, 452D1AF12081059C00A67F7F /* StringAdditionsTest.swift in Sources */, E75DD3E02810CDBD00E32C36 /* SubscriptionManagerTest.swift in Sources */, + F5C80FA22BE3F29F0028F76D /* TurnServerInfoTest.swift in Sources */, 5033D47329DCB3FF007FEADA /* UrlOpenerTest.swift in Sources */, 45A3579827DAAC6A0051CE8B /* UserProfileTest.swift in Sources */, 5042EAA3287F96FB00C9B19F /* VisibleBadgeResolverTest.swift in Sources */, diff --git a/Signal/Calls/TurnServerInfo.swift b/Signal/Calls/TurnServerInfo.swift index 6e1040d413..5b0f8ddece 100644 --- a/Signal/Calls/TurnServerInfo.swift +++ b/Signal/Calls/TurnServerInfo.swift @@ -44,9 +44,12 @@ struct TurnServerInfo { return nil } - if let hostnameAttribute = attributes["hostname"] as? String { + switch attributes["hostname"] { + case let hostnameAttribute as String: hostname = hostnameAttribute - } else { + case is NSNull: + hostname = "" + default: return nil } } diff --git a/Signal/test/Calls/TurnServerInfoTest.swift b/Signal/test/Calls/TurnServerInfoTest.swift new file mode 100644 index 0000000000..a2d864f5bd --- /dev/null +++ b/Signal/test/Calls/TurnServerInfoTest.swift @@ -0,0 +1,55 @@ +// +// Copyright 2024 Signal Messenger, LLC +// SPDX-License-Identifier: AGPL-3.0-only +// + +import Foundation +import XCTest + +@testable import Signal + +final class TurnServerInfoTest: XCTestCase { + private func turnServerInfo() -> [String: AnyObject] { + return [ + "username": "user", + "password": "pass", + "hostname": "host", + "urlsWithIps": ["123.123.123.123"], + "urls": ["turn:example.com"], + ] as [String: AnyObject] + } + + func testNullable() { + var infoMap = turnServerInfo() + var info = TurnServerInfo(attributes: infoMap)! + XCTAssertEqual(info.username, "user") + XCTAssertEqual(info.password, "pass") + XCTAssertEqual(info.hostname, "host") + XCTAssertEqual(info.urls, ["turn:example.com"]) + XCTAssertEqual(info.urlsWithIps, ["123.123.123.123"]) + + infoMap["urls"] = NSNull() + info = TurnServerInfo(attributes: infoMap)! + XCTAssertEqual(info.username, "user") + XCTAssertEqual(info.password, "pass") + XCTAssertEqual(info.hostname, "host") + XCTAssertEqual(info.urls, []) + XCTAssertEqual(info.urlsWithIps, ["123.123.123.123"]) + + infoMap["urlsWithIps"] = NSNull() + info = TurnServerInfo(attributes: infoMap)! + XCTAssertEqual(info.username, "user") + XCTAssertEqual(info.password, "pass") + XCTAssertEqual(info.hostname, "host") + XCTAssertEqual(info.urls, []) + XCTAssertEqual(info.urlsWithIps, []) + + infoMap["hostname"] = NSNull() + info = TurnServerInfo(attributes: infoMap)! + XCTAssertEqual(info.username, "user") + XCTAssertEqual(info.password, "pass") + XCTAssertEqual(info.hostname, "") + XCTAssertEqual(info.urls, []) + XCTAssertEqual(info.urlsWithIps, []) + } +}