From fe000ebbc70a96da73757309b51e4301e3ed6e6d Mon Sep 17 00:00:00 2001 From: Oscar Bonilla <6f6231@gmail.com> Date: Thu, 13 May 2021 15:47:37 -0700 Subject: [PATCH 1/2] Remove call to popen() and use runShell I was getting this error when running locally: Failed to open macho file at /usr/bin/nm for reading: Too many levels of symbolic links and it only happens with the `popen()` for swift. Since we use runShell for objective C right below, make the calls match. Signed-off-by: Oscar Bonilla <6f6231@gmail.com> --- bp/src/BPXCTestFile.m | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/bp/src/BPXCTestFile.m b/bp/src/BPXCTestFile.m index 7bcaf7e9..50cd9ad9 100644 --- a/bp/src/BPXCTestFile.m +++ b/bp/src/BPXCTestFile.m @@ -46,19 +46,12 @@ + (instancetype)BPXCTestFileFromXCTestBundle:(NSString *)path xcTestFile.testBundlePath = [path stringByDeletingLastPathComponent]; NSString *cmd = [NSString stringWithFormat:swiftNmCmdline, path]; - FILE *p = popen([cmd UTF8String], "r"); - if (!p) { - BP_SET_ERROR(errPtr, @"Failed to load test %@.\nERROR: %s\n", path, strerror(errno)); - return nil; - } - char *line = NULL; - size_t len = 0; - ssize_t read; + NSString *output = [BPUtils runShell:cmd]; + NSArray* testsArray = [output componentsSeparatedByString:@"\n"]; NSMutableDictionary *testClassesDict = [[NSMutableDictionary alloc] init]; NSMutableArray *allClasses = [[NSMutableArray alloc] init]; - while ((read = getline(&line, &len, p)) != -1) { - NSString *testName = [[NSString stringWithUTF8String:line] - stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]]; + + for (NSString *testName in testsArray) { NSArray *parts = [testName componentsSeparatedByString:@"."]; if (parts.count != 3) { continue; @@ -77,14 +70,10 @@ + (instancetype)BPXCTestFileFromXCTestBundle:(NSString *)path [testClass addTestCase:[[BPTestCase alloc] initWithName:trimmedTestName]]; } } - if (pclose(p) == -1) { - BP_SET_ERROR(errPtr, @"Failed to execute command: %@.\nERROR: %s\n", cmd, strerror(errno)); - return nil; - } cmd = [NSString stringWithFormat:objcNmCmdline, path]; - NSString *output = [BPUtils runShell:cmd]; - NSArray *testsArray = [output componentsSeparatedByString:@"\n"]; + output = [BPUtils runShell:cmd]; + testsArray = [output componentsSeparatedByString:@"\n"]; for (NSString *line in testsArray) { NSArray *parts = [line componentsSeparatedByString:@" "]; if (parts.count != 2) { From 95e469dcbf98bcf3e3627a93348a77262c7f8802 Mon Sep 17 00:00:00 2001 From: Oscar Bonilla <6f6231@gmail.com> Date: Thu, 13 May 2021 16:52:54 -0700 Subject: [PATCH 2/2] Some cleanups Remove unneeded headers Clean up the interfaces to BPTestBundleConnection and BPTestDaemonConnection Signed-off-by: Oscar Bonilla <6f6231@gmail.com> --- bp/src/BPSimulator.m | 2 -- bp/src/BPTestBundleConnection.h | 1 - bp/src/BPTestBundleConnection.m | 4 ++-- bp/src/BPTestDaemonConnection.h | 2 +- bp/src/BPTestDaemonConnection.m | 5 +++-- bp/src/Bluepill.m | 5 +---- 6 files changed, 7 insertions(+), 12 deletions(-) diff --git a/bp/src/BPSimulator.m b/bp/src/BPSimulator.m index 6af1d1a1..0b8aa113 100644 --- a/bp/src/BPSimulator.m +++ b/bp/src/BPSimulator.m @@ -13,8 +13,6 @@ #import "BPConstants.h" #import "BPCreateSimulatorHandler.h" #import "BPSimulator.h" -#import "BPTestBundleConnection.h" -#import "BPTestDaemonConnection.h" #import "BPTreeParser.h" #import "BPUtils.h" #import "BPWaitTimer.h" diff --git a/bp/src/BPTestBundleConnection.h b/bp/src/BPTestBundleConnection.h index 5bca100a..4e784171 100644 --- a/bp/src/BPTestBundleConnection.h +++ b/bp/src/BPTestBundleConnection.h @@ -16,7 +16,6 @@ @end @interface BPTestBundleConnection : NSObject -@property (nonatomic, strong) BPConfiguration *config; @property (nonatomic, strong) BPExecutionContext *context; @property (nonatomic, strong) BPSimulator *simulator; @property (nonatomic, copy) void (^completionBlock)(NSError *, pid_t); diff --git a/bp/src/BPTestBundleConnection.m b/bp/src/BPTestBundleConnection.m index 32da6d7a..37852fa7 100644 --- a/bp/src/BPTestBundleConnection.m +++ b/bp/src/BPTestBundleConnection.m @@ -114,7 +114,7 @@ - (void)connect { path = NSBundle.mainBundle.executablePath; } __block DTXRemoteInvocationReceipt *receipt = [remoteProxy - _IDE_initiateSessionWithIdentifier:self.config.sessionIdentifier + _IDE_initiateSessionWithIdentifier:self.context.config.sessionIdentifier forClient:[self clientProcessUniqueIdentifier] atPath:path protocolVersion:@(BP_DAEMON_PROTOCOL_VERSION)]; @@ -282,7 +282,7 @@ - (void)stopVideoRecording:(BOOL)forced - (id)_XCT_launchProcessWithPath:(NSString *)path bundleID:(NSString *)bundleID arguments:(NSArray *)arguments environmentVariables:(NSDictionary *)environment { NSMutableDictionary *env = [[NSMutableDictionary alloc] init]; - [env addEntriesFromDictionary:[SimulatorHelper appLaunchEnvironmentWithBundleID:bundleID device:nil config:_config]]; + [env addEntriesFromDictionary:[SimulatorHelper appLaunchEnvironmentWithBundleID:bundleID device:nil config:_context.config]]; [env addEntriesFromDictionary:environment]; NSDictionary *options = @{ @"arguments": arguments, diff --git a/bp/src/BPTestDaemonConnection.h b/bp/src/BPTestDaemonConnection.h index 95181d9b..062ef0f0 100644 --- a/bp/src/BPTestDaemonConnection.h +++ b/bp/src/BPTestDaemonConnection.h @@ -15,6 +15,6 @@ @interface BPTestDaemonConnection : NSObject @property (nonatomic, assign) pid_t testRunnerPid; @property (nonatomic, strong) BPSimulator *simulator; -- (instancetype)initWithDevice:(BPSimulator *)device andInterface:(id)interface; +- (instancetype)initWithDevice:(BPSimulator *)device andInterface:(id)interface andTestRunnerPID: (pid_t) pid; - (void)connectWithTimeout:(NSTimeInterval)timeout; @end diff --git a/bp/src/BPTestDaemonConnection.m b/bp/src/BPTestDaemonConnection.m index abab67a1..e70d33a9 100644 --- a/bp/src/BPTestDaemonConnection.m +++ b/bp/src/BPTestDaemonConnection.m @@ -43,18 +43,19 @@ @interface BPTestDaemonConnection() @implementation BPTestDaemonConnection -- (instancetype)initWithDevice:(BPSimulator *)simulator andInterface:(id)interface { +- (instancetype)initWithDevice:(BPSimulator *)simulator andInterface:(id)interface andTestRunnerPID: (pid_t) pid { self = [super init]; if (self) { self.simulator = simulator; self.interface = interface; + self.testRunnerPid = pid; } return self; } - (void)connectWithTimeout:(NSTimeInterval)timeout { [self connect]; - // Pool connection status till it passes. + // Poll connection status till it passes. [BPUtils runWithTimeOut:timeout until:^BOOL{ return self.connected; }]; diff --git a/bp/src/Bluepill.m b/bp/src/Bluepill.m index d9aa58af..08cca8a5 100644 --- a/bp/src/Bluepill.m +++ b/bp/src/Bluepill.m @@ -433,11 +433,8 @@ - (void)connectTestBundleAndTestDaemonWithContext:(BPExecutionContext *)context return; } BPTestBundleConnection *bConnection = [[BPTestBundleConnection alloc] initWithContext:context andInterface:self]; - bConnection.simulator = context.runner; - bConnection.config = self.config; + BPTestDaemonConnection *dConnection = [[BPTestDaemonConnection alloc] initWithDevice:context.runner andInterface:nil andTestRunnerPID: context.pid]; - BPTestDaemonConnection *dConnection = [[BPTestDaemonConnection alloc] initWithDevice:context.runner andInterface:nil]; - dConnection.testRunnerPid = context.pid; [dConnection connectWithTimeout:180]; [bConnection connectWithTimeout:180]; [bConnection startTestPlan];