ClientInfoByNotification.m [plain text]
//
// ClientInfoByNotification.m
// Security
//
// Created by murf on 4/12/18.
//
#import <XCTest/XCTest.h>
#import <Foundation/Foundation.h>
#import <Foundation/NSXPCConnection_Private.h>
#import <Security/Security.h>
#include <Security/SecureObjectSync/SOSCloudCircle.h>
#include <Security/SecureObjectSync/SOSCloudCircleInternal.h>
#undef DOVIEWMACRO
#define DOVIEWMACRO(VIEWNAME, DEFSTRING, CMDSTRING, SYSTEM, DEFAULTSETTING, INITIALSYNCSETTING, ALWAYSONSETTING, BACKUPSETTING, V0SETTING) \
const CFStringRef k##SYSTEM##View##VIEWNAME = CFSTR(DEFSTRING);
#include "Security/SecureObjectSync/ViewList.list"
#import "DeviceSimulatorProtocol.h"
#import "MultiDeviceNetworking.h"
#import <objc/runtime.h>
#if 1
@interface MDDevice2 : NSObject<DeviceSimulatorProtocol>
@property NSXPCConnection *connection;
@property NSString *name;
- (instancetype)initWithConnection:(NSXPCConnection *)connection;
@end
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wprotocol"
@implementation MDDevice2
- (instancetype)initWithConnection:(NSXPCConnection *)connection
{
self = [super init];
if (self) {
self.connection = connection;
}
return self;
}
/* Oh, ObjC, you are my friend */
- (void)forwardInvocation:(NSInvocation *)invocation
{
struct objc_method_description desc = protocol_getMethodDescription(@protocol(DeviceSimulatorProtocol), [invocation selector], true, true);
if (desc.name == NULL) {
[super forwardInvocation:invocation];
} else {
__block bool dooooooEeeeetExclamationPoint = true;
id object = [self.connection synchronousRemoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) {
NSLog(@"peer failed with: dooooooEeeeetExclamationPoint = false;
//abort();
}];
if(dooooooEeeeetExclamationPoint) {
[invocation invokeWithTarget:object];
}
}
}
@end
#pragma clang diagnostic pop
#endif
@interface ClientInfoByNotification : XCTestCase
@property NSMutableDictionary<NSString *,MDDevice2 *> *connections;
@property MultiDeviceNetworking *network;
@property MDDevice2 *masterDevice;
@end
static NSString *testInstanceUUID;
@implementation ClientInfoByNotification
+ (void)setUp
{
testInstanceUUID = [[NSUUID UUID] UUIDString];
}
- (void)setUp
{
self.connections = [NSMutableDictionary dictionary];
self.network = [[MultiDeviceNetworking alloc] init];
[self runSigninWithAdditionalDevices:0];
}
- (void)tearDown
{
__block uint64_t totalUserUsec = 0, totalSysUsec = 0;
NSMutableDictionary *result = [NSMutableDictionary dictionary];
for (NSString *name in self.connections) {
MDDevice2 *device = self.connections[name];
NSLog(@"device: [device diagnosticsCPUUsage:^(bool success, uint64_t user_usec, uint64_t sys_usec, NSError *error) {
NSLog(@" totalUserUsec += user_usec;
totalSysUsec += sys_usec;
result[[NSString stringWithFormat:@"cpu- }];
}
result[@"cpu-total"] = @{ @"user_usec" : @(totalUserUsec), @"system_usec" : @(totalSysUsec)};
NSLog(@"Total: u:
/* XXX check for leaks in all devices */
for (NSString *name in self.connections) {
MDDevice2 *device = self.connections[name];
[device.connection invalidate];
}
self.connections = NULL;
[self.network dumpKVSState];
[self.network dumpCounters];
[self.network disconnectAll];
self.network = NULL;
NSData * jsonData = [NSJSONSerialization dataWithJSONObject:result options:0 error:NULL];
[jsonData writeToFile:[NSString stringWithFormat:@"/tmp/test-result-
}
//MARK: - Device logic
- (MDDevice2 *)device:(NSString *)name model:(NSString *)model version:(NSString *)version
{
MDDevice2 *device = self.connections[name];
if (device != NULL) {
return NULL;
}
NSXPCConnection *conn = [[NSXPCConnection alloc] initWithServiceName:@"com.apple.Security.DeviceSimulator"];
conn.remoteObjectInterface = [NSXPCInterface interfaceWithProtocol:@protocol(DeviceSimulatorProtocol)];
[conn _setUUID:[NSUUID UUID]]; // select a random instance
[conn resume];
device = [[MDDevice2 alloc] initWithConnection:conn];
device.name = name;
self.connections[name] = device;
[device setDevice:name
version:version
model:model
testInstance:testInstanceUUID
network:[self.network endpoint]
complete:^(BOOL success) {
if (!success) {
abort();
}
}];
return device;
}
- (void)runSigninWithAdditionalDevices:(unsigned)additionalDeviceCount {
signal(SIGPIPE, SIG_IGN);
_masterDevice = [self device:@"ipad" model:@"iPad" version:@"15E143a"];
NSMutableArray<MDDevice2 *> *otherDevices = [NSMutableArray array];
[_masterDevice setupSOSCircle:@"user" password:@"foo" complete:^void(bool success, NSError *error) {
XCTAssert(success, "Expect success: }];
[_masterDevice sosCircleStatus:^void(SOSCCStatus status, NSError *error) {
XCTAssertEqual(status, kSOSCCInCircle, @"expected to be in circle: }];
sleep(4); // give "kvs" a chance to get the word out.
for (unsigned n = 0; n < additionalDeviceCount; n++) {
MDDevice2 *dev = [self device:[NSString stringWithFormat:@"mac-
[dev setupSOSCircle:@"user" password:@"foo" complete:^void(bool success, NSError *error) {
XCTAssert(success, " }];
__block NSString *devPeerID = NULL;
[dev sosRequestToJoin:^(bool success, NSString *peerID, NSError *error) {
XCTAssert(success, " XCTAssertNotEqual(peerID, NULL, @" devPeerID = peerID;
}];
__block NSError *localErr = nil;
__block bool done = false;
for(int tries=0; tries < 5; tries++) {
[_masterDevice sosApprovePeer:devPeerID complete:^(BOOL success, NSError *error) {
localErr = [error copy];
if(success) {
localErr = nil;
done = true;
}
}];
if(done) break;
sleep(10);
}
XCTAssert(done, "
[otherDevices addObject:dev];
}
}
- (void)testSOSIsThisDeviceInCircle
{
[self measureBlock:^{
for(int i=0; i<100; i++) {
[self.masterDevice sosCircleStatus:^void(SOSCCStatus status, NSError *error) {
XCTAssertEqual(status, kSOSCCInCircle, @"expected to be in circle: }];
}
}];
}
- (void)testSOSIsThisDeviceInCircleNonCached
{
[self measureBlock:^{
for(int i=0; i<100; i++) {
[self.masterDevice sosCircleStatusNonCached:^void(SOSCCStatus status, NSError *error) {
XCTAssertEqual(status, kSOSCCInCircle, @"expected to be in circle: }];
}
}];
}
#if TARGET_OS_IPHONE
- (void)testSOSViews2
{
[self.masterDevice sosViewStatus: (__bridge NSString*)kSOSViewAutofillPasswords withCompletion: ^void(SOSCCStatus status, NSError *error) {
XCTAssertEqual(status, kSOSCCViewNotMember, @"expected to be not in view: }];
[self.masterDevice sosViewStatus: (__bridge NSString*)kSOSViewHomeKit withCompletion: ^void(SOSCCStatus status, NSError *error) {
XCTAssertEqual(status, kSOSCCViewMember, @"expected to be in view: }];
[self.masterDevice sosViewStatus: (__bridge NSString*)kSOSViewWiFi withCompletion: ^void(SOSCCStatus status, NSError *error) {
XCTAssertEqual(status, kSOSCCViewNotMember, @"expected to be not in view: }];
[self.masterDevice sosViewStatus: (__bridge NSString*)kSOSViewContinuityUnlock withCompletion: ^void(SOSCCStatus status, NSError *error) {
XCTAssertEqual(status, kSOSCCViewMember, @"expected to be in view: }];
[self.masterDevice sosEnableAllViews:^(BOOL success, NSError *error) {
XCTAssert(success, "Expected to enable all views");
}];
//uint64_t bitmask = [self.masterDevice sosCachedCircleBitmask];
//XCTAssertEqual(bitmask, 0, "Expected bitmask to be
[self.masterDevice sosViewStatus: (__bridge NSString*)kSOSViewWiFi withCompletion: ^void(SOSCCStatus status, NSError *error) {
XCTAssertEqual(status, kSOSCCViewMember, @"expected to be in view: }];
[self.masterDevice sosCachedViewBitmask:^(uint64_t bitmask) {
XCTAssertEqual(bitmask, 33554367, @"expected bitmask of }];
[self measureBlock:^{
for(int i=0; i<100; i++) {
[self.masterDevice sosViewStatus: (__bridge NSString*)kSOSViewHomeKit withCompletion: ^void(SOSCCStatus status, NSError *error) {
}];
}
}];
}
#endif
- (void)testSOSMultiView
{
[self.masterDevice sosEnableAllViews:^(BOOL success, NSError *error) {
XCTAssert(success, "Expected to enable all views");
}];
[self.masterDevice sosICKStatus: ^void(bool status) {
XCTAssert(status, "Expected to enable iCloud Keychain");
}];
[self measureBlock:^{
for(int i=0; i<100; i++) {
[self.masterDevice sosICKStatus: ^void(bool status) {
}];
}
}];
}
- (void) testMaster2
{
[self testSOSMultiView];
}
@end