[NC Apple coverage] Enable WiFiCommon tests.

PiperOrigin-RevId: 799130702
This commit is contained in:
Edwin Wu
2025-08-25 08:24:11 -07:00
committed by Copybara-Service
parent 5f27145da5
commit da266c0025
12 changed files with 504 additions and 18 deletions
+2 -1
View File
@@ -101,6 +101,7 @@ objc_library(
"//internal/platform/implementation:platform",
"//internal/platform/implementation:types",
"//internal/platform/implementation/apple/Mediums",
"//internal/platform/implementation/apple/Mediums/WiFiCommon",
"//internal/platform/implementation/shared:file",
"//internal/platform/implementation/apple/Log:GNCLogger",
"//internal/platform:cancellation_flag",
@@ -190,7 +191,7 @@ objc_library(
"//internal/platform:cancellation_flag",
"//internal/platform/implementation:comm",
"//internal/platform/implementation/apple/Log:GNCLogger",
"//internal/platform/implementation/apple/Mediums",
"//internal/platform/implementation/apple/Mediums/WiFiCommon",
"@com_google_absl//absl/functional:any_invocable",
],
)
@@ -1,6 +1,6 @@
load("@rules_cc//cc:objc_library.bzl", "objc_library")
# Copyright 2020 Google LLC
# Copyright 2025 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -45,13 +45,6 @@ objc_library(
"GNCMConnection.m",
"Hotspot/GNCHotspotMedium.m",
"Hotspot/GNCHotspotSocket.m",
"WiFiCommon/GNCIPv4Address.m",
"WiFiCommon/GNCNWFramework.m",
"WiFiCommon/GNCNWFrameworkError.m",
"WiFiCommon/GNCNWFrameworkServerSocket.m",
"WiFiCommon/GNCNWFrameworkServerSocket+Internal.h",
"WiFiCommon/GNCNWFrameworkSocket.m",
"WiFiCommon/GNCNWParameters.m",
],
hdrs = [
"BLEv2/GNCBLEError.h",
@@ -73,12 +66,6 @@ objc_library(
"GNCMConnection.h",
"Hotspot/GNCHotspotMedium.h",
"Hotspot/GNCHotspotSocket.h",
"WiFiCommon/GNCIPv4Address.h",
"WiFiCommon/GNCNWFramework.h",
"WiFiCommon/GNCNWFrameworkError.h",
"WiFiCommon/GNCNWFrameworkServerSocket.h",
"WiFiCommon/GNCNWFrameworkSocket.h",
"WiFiCommon/GNCNWParameters.h",
],
deps = [
"//internal/encoding:base85",
@@ -86,6 +73,7 @@ objc_library(
"//internal/platform/implementation/apple/Flags",
"//internal/platform/implementation/apple/Log:GNCLogger",
"//internal/platform/implementation/apple/Mediums/Ble/Sockets:Shared",
"//internal/platform/implementation/apple/Mediums/WiFiCommon",
"//proto/mediums:ble_frames_cc_proto",
"//third_party/apple_frameworks:CoreBluetooth",
"//third_party/apple_frameworks:CoreLocation",
@@ -0,0 +1,57 @@
# Copyright 2025 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
load("@rules_cc//cc:objc_library.bzl", "objc_library")
load("//third_party/nearby:minimum_os.bzl", "IOS_MINIMUM_OS")
load("//tools/build_defs/swift:swift_explicit_module_build_test.bzl", "swift_explicit_module_build_test")
licenses(["notice"])
package(default_visibility = [
"//internal/platform/implementation/apple:__subpackages__",
])
objc_library(
name = "WiFiCommon",
srcs = [
"GNCIPv4Address.m",
"GNCNWFramework.m",
"GNCNWFrameworkError.m",
"GNCNWFrameworkServerSocket.m",
"GNCNWFrameworkSocket.m",
"GNCNWParameters.m",
],
hdrs = [
"GNCIPv4Address.h",
"GNCNWFramework.h",
"GNCNWFrameworkError.h",
"GNCNWFrameworkServerSocket.h",
"GNCNWFrameworkServerSocket+Internal.h",
"GNCNWFrameworkSocket.h",
"GNCNWParameters.h",
],
deps = [
"//internal/platform/implementation/apple/Log:GNCLogger",
"//third_party/apple_frameworks:Foundation",
"//third_party/apple_frameworks:Network",
"//third_party/apple_frameworks:Security",
],
)
swift_explicit_module_build_test(
name = "swift_explicit_module_build_test",
ignore_headerless_targets = True,
minimum_os_version = IOS_MINIMUM_OS,
platform_type = "ios",
)
@@ -22,7 +22,8 @@
NS_ASSUME_NONNULL_BEGIN
BOOL GNCConfigureTLSOptions(sec_protocol_options_t options, NSData *PSK, NSData *identity) {
BOOL GNCConfigureTLSOptions(sec_protocol_options_t _Nullable options, NSData *PSK,
NSData *identity) {
if (!options) {
GNCLoggerError(@"[GNCNWParameters] Invalid parameter of options.");
return NO;
@@ -0,0 +1,45 @@
# Copyright 2025 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
load("@rules_apple//apple:ios.bzl", "ios_unit_test")
load("@rules_cc//cc:objc_library.bzl", "objc_library")
load("//third_party/nearby:minimum_os.bzl", "IOS_MINIMUM_OS")
licenses(["notice"])
package(default_visibility = ["//:__subpackages__"])
objc_library(
name = "WiFiCommonTestsLib",
testonly = True,
srcs = [
"GNCIPAddressTest.mm",
"GNCNWFrameworkServerSocketTest.m",
"GNCNWFrameworkSocketTest.m",
"GNCNWFrameworkTest.m",
"GNCNWParametersTest.m",
],
deps = [
"//internal/platform/implementation/apple/Mediums/WiFiCommon",
"//third_party/apple_frameworks:XCTest",
"//third_party/objective_c/ocmock/v3:OCMock",
],
)
ios_unit_test(
name = "WiFiCommonTests",
minimum_os_version = IOS_MINIMUM_OS,
runner = "//testing/utp/ios:IOS_LATEST",
deps = [":WiFiCommonTestsLib"],
)
@@ -0,0 +1,80 @@
// Copyright 2025 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#import <Network/Network.h>
#import <XCTest/XCTest.h>
#import <os/availability.h>
#import "internal/platform/implementation/apple/Mediums/WiFiCommon/GNCIPv4Address.h"
#import "internal/platform/implementation/apple/Mediums/WiFiCommon/GNCNWFrameworkServerSocket.h"
#import "third_party/objective_c/ocmock/v3/Source/OCMock/OCMock.h"
@interface GNCNWFrameworkServerSocketTest : XCTestCase
@end
@implementation GNCNWFrameworkServerSocketTest {
id _mockListener;
}
- (void)setUp {
[super setUp];
if (@available(iOS 13.0, *)) {
// This mock is not actually used by the code under test internally, as nw_listener_create is
// called directly.
_mockListener = OCMProtocolMock(@protocol(OS_nw_listener));
}
}
- (void)testInitAndProperties API_AVAILABLE(ios(13.0)) {
// Difficult to test initWithPort directly without mocking nw_listener_create.
// We can only test that it doesn't immediately crash.
// Consider refactoring GNCNWFrameworkServerSocket to inject the listener for testability.
NSInteger port = 0; // Use port 0 to let the system pick an available port
// This will call the real nw_listener_create, potentially failing in a test environment.
GNCNWFrameworkServerSocket *serverSocket = [[GNCNWFrameworkServerSocket alloc] initWithPort:port];
XCTAssertNotNil(serverSocket, @"Failed to initialize GNCNWFrameworkServerSocket");
// We can't reliably check the port number as it's system-assigned, but we can check if it's
// non-negative.
XCTAssertGreaterThanOrEqual(serverSocket.port, 0, @"Port number should be non-negative");
[serverSocket close];
}
- (void)testGetIPAddress API_AVAILABLE(ios(13.0)) {
GNCNWFrameworkServerSocket *serverSocket = [[GNCNWFrameworkServerSocket alloc] initWithPort:0];
XCTAssertNotNil(serverSocket, @"Failed to initialize GNCNWFrameworkServerSocket");
// The IP address on a test runner can vary. We mainly check that it returns something non-nil.
// A more thorough test would require mocking network interfaces.
GNCIPv4Address *ipAddress = serverSocket.ipAddress;
XCTAssertNotNil(ipAddress, @"ipAddress should return a non-nil value");
// We can't know the exact IP, but it should not be empty or null.
XCTAssertGreaterThan(ipAddress.dottedRepresentation.length, 0,
@"IP address string should not be empty");
[serverSocket close];
}
- (void)testCloseMultipleTimes API_AVAILABLE(ios(13.0)) {
GNCNWFrameworkServerSocket *serverSocket = [[GNCNWFrameworkServerSocket alloc] initWithPort:0];
XCTAssertNotNil(serverSocket, @"Failed to initialize GNCNWFrameworkServerSocket");
[serverSocket close];
// Test that closing a second time does not crash.
XCTAssertNoThrow([serverSocket close], @"Closing an already closed socket should not throw");
}
// Testing accept() is difficult without a client connection or extensive mocking of nw_connection.
@end
@@ -0,0 +1,41 @@
// Copyright 2025 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#import <XCTest/XCTest.h>
#import <os/availability.h>
#import <Network/Network.h>
#import "internal/platform/implementation/apple/Mediums/WiFiCommon/GNCNWFrameworkSocket.h"
#import "third_party/objective_c/ocmock/v3/Source/OCMock/OCMock.h"
@interface GNCNWFrameworkSocketTest : XCTestCase
@end
@implementation GNCNWFrameworkSocketTest {
id _mockConnection;
}
- (void)setUp {
[super setUp];
if (@available(iOS 13.0, *)) {
_mockConnection = OCMProtocolMock(@protocol(OS_nw_connection));
}
}
- (void)testInitWithConnection API_AVAILABLE(ios(13.0)) {
GNCNWFrameworkSocket *socket = [[GNCNWFrameworkSocket alloc] initWithConnection:_mockConnection];
XCTAssertNotNil(socket);
}
@end
@@ -0,0 +1,262 @@
// Copyright 2025 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#import "internal/platform/implementation/apple/Mediums/WiFiCommon/GNCNWFramework.h"
#import <XCTest/XCTest.h>
#import "third_party/objective_c/ocmock/v3/Source/OCMock/OCMock.h"
#import "internal/platform/implementation/apple/Mediums/WiFiCommon/GNCIPv4Address.h"
#import "internal/platform/implementation/apple/Mediums/WiFiCommon/GNCNWFrameworkError.h"
#import "internal/platform/implementation/apple/Mediums/WiFiCommon/GNCNWFrameworkServerSocket+Internal.h"
// A mock GNCNWFrameworkServerSocket used to test the advertising/listening methods on
// GNCNWFramework.
@interface GNCMockNWFrameworkServerSocket : GNCNWFrameworkServerSocket
@property(nonatomic) BOOL startListeningResult;
@property(nonatomic, nullable) NSError *startListeningError;
@property(nonatomic, nullable, copy) NSData *startListeningPSKIdentity;
@property(nonatomic, nullable, copy) NSData *startListeningPSKSharedSecret;
@property(nonatomic) BOOL startListeningIncludePeerToPeer;
@property(nonatomic) BOOL startAdvertisingCalled;
@property(nonatomic, nullable, copy) NSString *startAdvertisingServiceName;
@property(nonatomic, nullable, copy) NSString *startAdvertisingServiceType;
@property(nonatomic, nullable, copy) NSDictionary<NSString *, NSString *> *startAdvertisingTXTRecords;
@property(nonatomic) BOOL stopAdvertisingCalled;
- (instancetype)initWithPort:(NSInteger)port NS_DESIGNATED_INITIALIZER;
@end
@implementation GNCMockNWFrameworkServerSocket
@synthesize startListeningResult;
@synthesize startListeningError;
@synthesize startListeningPSKIdentity;
@synthesize startListeningPSKSharedSecret;
@synthesize startListeningIncludePeerToPeer;
@synthesize startAdvertisingCalled;
@synthesize startAdvertisingServiceName;
@synthesize startAdvertisingServiceType;
@synthesize startAdvertisingTXTRecords;
@synthesize stopAdvertisingCalled;
- (instancetype)initWithPort:(NSInteger)port {
self = [super initWithPort:port];
if (self) {
self.startListeningResult = YES;
}
return self;
}
- (BOOL)startListeningWithError:(NSError **)error
includePeerToPeer:(BOOL)includePeerToPeer {
self.startListeningIncludePeerToPeer = includePeerToPeer;
if (!self.startListeningResult && error != nil) {
*error = self.startListeningError;
}
return self.startListeningResult;
}
- (BOOL)startListeningWithPSKIdentity:(NSData *)PSKIdentity
PSKSharedSecret:(NSData *)PSKSharedSecret
includePeerToPeer:(BOOL)includePeerToPeer
error:(NSError **)error {
self.startListeningPSKIdentity = PSKIdentity;
self.startListeningPSKSharedSecret = PSKSharedSecret;
self.startListeningIncludePeerToPeer = includePeerToPeer;
if (!self.startListeningResult && error != nil) {
*error = self.startListeningError;
}
return self.startListeningResult;
}
- (void)startAdvertisingServiceName:(NSString *)serviceName
serviceType:(NSString *)serviceType
txtRecords:(NSDictionary<NSString *, NSString *> *)txtRecords {
self.startAdvertisingCalled = YES;
self.startAdvertisingServiceName = serviceName;
self.startAdvertisingServiceType = serviceType;
self.startAdvertisingTXTRecords = txtRecords;
}
- (void)stopAdvertising {
self.stopAdvertisingCalled = YES;
}
@end
@interface GNCNWFrameworkTest : XCTestCase
@end
@implementation GNCNWFrameworkTest
- (void)testGNCNWFrameworkCanBeInstantiated {
GNCNWFramework *framework = [[GNCNWFramework alloc] init];
XCTAssertNotNil(framework);
}
- (void)testIsListeningForAnyServiceWhenNoServicesAreListening {
GNCNWFramework *framework = [[GNCNWFramework alloc] init];
XCTAssertFalse([framework isListeningForAnyService]);
}
- (void)testListenForServiceOnPortSuccess {
GNCNWFramework *framework = [[GNCNWFramework alloc] init];
id mockServerSocket = OCMClassMock([GNCNWFrameworkServerSocket class]);
id mockServerSocketAlloc = OCMClassMock([GNCNWFrameworkServerSocket class]);
OCMStub([mockServerSocketAlloc alloc]).andReturn(mockServerSocketAlloc);
OCMStub([mockServerSocketAlloc initWithPort:1234]).andReturn(mockServerSocket);
OCMStub([mockServerSocket startListeningWithError:[OCMArg anyObjectRef]
includePeerToPeer:NO])
.andReturn(YES);
NSError *error = nil;
GNCNWFrameworkServerSocket *serverSocket =
[framework listenForServiceOnPort:1234 includePeerToPeer:NO error:&error];
XCTAssertNotNil(serverSocket);
XCTAssertNil(error);
XCTAssertTrue([framework isListeningForAnyService]);
}
- (void)testListenForServiceOnPortFailure {
GNCNWFramework *framework = [[GNCNWFramework alloc] init];
id mockServerSocket = OCMClassMock([GNCNWFrameworkServerSocket class]);
id mockServerSocketAlloc = OCMClassMock([GNCNWFrameworkServerSocket class]);
OCMStub([mockServerSocketAlloc alloc]).andReturn(mockServerSocketAlloc);
OCMStub([mockServerSocketAlloc initWithPort:1234]).andReturn(mockServerSocket);
OCMStub([mockServerSocket startListeningWithError:[OCMArg anyObjectRef]
includePeerToPeer:NO])
.andDo(^(id localSelf, NSError **error, BOOL includePeerToPeer) {
if (error) {
*error = [NSError errorWithDomain:NSPOSIXErrorDomain code:EACCES userInfo:nil];
}
return NO;
});
NSError *error = nil;
GNCNWFrameworkServerSocket *serverSocket =
[framework listenForServiceOnPort:1234 includePeerToPeer:NO error:&error];
XCTAssertNil(serverSocket);
XCTAssertNotNil(error);
XCTAssertFalse([framework isListeningForAnyService]);
}
- (void)testListenForServiceWithPSKIdentityPSKSharedSecretSuccess {
NSData *pskIdentity = [@"testIdentity" dataUsingEncoding:NSUTF8StringEncoding];
NSData *pskSharedSecret = [@"testSharedSecret" dataUsingEncoding:NSUTF8StringEncoding];
GNCNWFramework *framework = [[GNCNWFramework alloc] init];
id mockServerSocket = OCMClassMock([GNCNWFrameworkServerSocket class]);
id mockServerSocketAlloc = OCMClassMock([GNCNWFrameworkServerSocket class]);
OCMStub([mockServerSocketAlloc alloc]).andReturn(mockServerSocketAlloc);
OCMStub([mockServerSocketAlloc initWithPort:1234]).andReturn(mockServerSocket);
OCMStub([mockServerSocket startListeningWithPSKIdentity:pskIdentity
PSKSharedSecret:pskSharedSecret
includePeerToPeer:YES
error:[OCMArg anyObjectRef]])
.andReturn(YES);
NSError *error = nil;
GNCNWFrameworkServerSocket *serverSocket = [framework
listenForServiceWithPSKIdentity:pskIdentity
PSKSharedSecret:pskSharedSecret
port:1234
includePeerToPeer:YES
error:&error];
XCTAssertNotNil(serverSocket);
XCTAssertNil(error);
XCTAssertTrue([framework isListeningForAnyService]);
}
- (void)testListenForServiceWithPSKIdentityPSKSharedSecretFailure {
NSData *pskIdentity = [@"testIdentity" dataUsingEncoding:NSUTF8StringEncoding];
NSData *pskSharedSecret = [@"testSharedSecret" dataUsingEncoding:NSUTF8StringEncoding];
GNCNWFramework *framework = [[GNCNWFramework alloc] init];
id mockServerSocket = OCMClassMock([GNCNWFrameworkServerSocket class]);
id mockServerSocketAlloc = OCMClassMock([GNCNWFrameworkServerSocket class]);
OCMStub([mockServerSocketAlloc alloc]).andReturn(mockServerSocketAlloc);
OCMStub([mockServerSocketAlloc initWithPort:1234]).andReturn(mockServerSocket);
OCMStub([mockServerSocket startListeningWithPSKIdentity:pskIdentity
PSKSharedSecret:pskSharedSecret
includePeerToPeer:NO
error:[OCMArg anyObjectRef]])
.andDo(^(id localSelf, NSData *PSKIdentity, NSData *PSKSharedSecret, BOOL includePeerToPeer,
NSError **error) {
if (error) {
*error = [NSError errorWithDomain:NSPOSIXErrorDomain code:EACCES userInfo:nil];
}
return NO;
});
NSError *error = nil;
GNCNWFrameworkServerSocket *serverSocket = [framework
listenForServiceWithPSKIdentity:pskIdentity
PSKSharedSecret:pskSharedSecret
port:1234
includePeerToPeer:NO
error:&error];
XCTAssertNil(serverSocket);
XCTAssertNotNil(error);
XCTAssertFalse([framework isListeningForAnyService]);
}
- (void)testStartAdvertisingPort {
NSInteger port = 1234;
NSString *serviceName = @"TestService";
NSString *serviceType = @"_test._tcp.";
NSDictionary<NSString *, NSString *> *txtRecords = @{@"key": @"value"};
GNCMockNWFrameworkServerSocket *mockServerSocket =
[[GNCMockNWFrameworkServerSocket alloc] initWithPort:port];
GNCNWFramework *framework = [[GNCNWFramework alloc] init];
NSMapTable<NSNumber *, GNCNWFrameworkServerSocket *> *serverSockets =
[framework valueForKey:@"_serverSockets"];
[serverSockets setObject:mockServerSocket forKey:@(port)];
[framework startAdvertisingPort:port
serviceName:serviceName
serviceType:serviceType
txtRecords:txtRecords];
XCTAssertTrue(mockServerSocket.startAdvertisingCalled);
XCTAssertEqualObjects(mockServerSocket.startAdvertisingServiceName, serviceName);
XCTAssertEqualObjects(mockServerSocket.startAdvertisingServiceType, serviceType);
XCTAssertEqualObjects(mockServerSocket.startAdvertisingTXTRecords, txtRecords);
}
- (void)testStopAdvertisingPort {
NSInteger port = 1234;
GNCMockNWFrameworkServerSocket *mockServerSocket =
[[GNCMockNWFrameworkServerSocket alloc] initWithPort:port];
GNCNWFramework *framework = [[GNCNWFramework alloc] init];
NSMapTable<NSNumber *, GNCNWFrameworkServerSocket *> *serverSockets =
[framework valueForKey:@"_serverSockets"];
[serverSockets setObject:mockServerSocket forKey:@(port)];
XCTAssertTrue([[[serverSockets keyEnumerator] allObjects] containsObject:@(port)]);
[framework stopAdvertisingPort:port];
XCTAssertTrue(mockServerSocket.stopAdvertisingCalled);
XCTAssertFalse([[[serverSockets keyEnumerator] allObjects] containsObject:@(port)]);
}
- (void)testIsDiscoveringAnyServiceWhenNoServicesAreDiscovering {
GNCNWFramework *framework = [[GNCNWFramework alloc] init];
XCTAssertFalse([framework isDiscoveringAnyService]);
}
@end
@@ -15,8 +15,13 @@
#import "internal/platform/implementation/apple/Mediums/WiFiCommon/GNCNWParameters.h"
#import <Foundation/Foundation.h>
#import <Network/Network.h>
#import <XCTest/XCTest.h>
// Declare the C function here to make it visible for testing.
FOUNDATION_EXPORT BOOL GNCConfigureTLSOptions(sec_protocol_options_t _Nullable options, NSData *PSK,
NSData *identity);
@interface GNCNWParametersTest : XCTestCase
@end
@@ -27,6 +32,12 @@
XCTAssertTrue(nw_parameters_get_include_peer_to_peer(params));
}
- (void)testConfigureTLSOptionsWithNilOptions {
BOOL result = GNCConfigureTLSOptions(nil, [@"12345678" dataUsingEncoding:NSUTF8StringEncoding],
[@"nearby" dataUsingEncoding:NSUTF8StringEncoding]);
XCTAssertFalse(result);
}
- (void)testTLSParametersWithEmptyPSK {
nw_parameters_t params =
GNCBuildTLSParameters([@"" dataUsingEncoding:NSUTF8StringEncoding],
@@ -47,9 +47,7 @@ objc_library(
"GNCFakePeripheral.m",
"GNCFakePeripheralManager.h",
"GNCFakePeripheralManager.m",
"GNCIPAddressTest.mm",
"GNCMultiThreadExecutorTest.mm",
"GNCNWParametersTest.m",
"GNCPlatformTest.mm",
"GNCScheduledExecutorTest.mm",
"GNCSingleThreadExecutorTest.mm",