FBSimulatorControl/Commands/FBSimulatorLogCommands.m (65 lines of code) (raw):

/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #import "FBSimulatorLogCommands.h" #import <CoreSimulator/SimDevice.h> #import <CoreSimulator/SimRuntime.h> #import "FBSimulator+Private.h" #import "FBSimulatorError.h" @interface FBSimulatorLogCommands () @property (nonatomic, weak, readonly) FBSimulator *simulator; @end @implementation FBSimulatorLogCommands #pragma mark Initializers + (instancetype)commandsWithTarget:(FBSimulator *)target { return [[self alloc] initWithSimulator:target]; } - (instancetype)initWithSimulator:(FBSimulator *)simulator { self = [super init]; if (!self) { return nil; } _simulator = simulator; return self; } #pragma mark Public - (FBFuture<id<FBLogOperation>> *)tailLog:(NSArray<NSString *> *)arguments consumer:(id<FBDataConsumer>)consumer { return [[self startLogCommand:[FBProcessLogOperation osLogArgumentsInsertStreamIfNeeded:arguments] consumer:consumer] onQueue:self.simulator.workQueue map:^(FBProcess *process) { return [[FBProcessLogOperation alloc] initWithProcess:process consumer:consumer queue:self.simulator.asyncQueue]; }]; } #pragma mark Private - (FBFuture<FBProcess *> *)startLogCommand:(NSArray<NSString *> *)arguments consumer:(id<FBDataConsumer>)consumer { NSError *error = nil; NSString *launchPath = [self logExecutablePathWithError:&error]; if (!launchPath) { return [FBSimulatorError failFutureWithError:error]; } FBProcessIO *processIO = [[FBProcessIO alloc] initWithStdIn:nil stdOut:[FBProcessOutput outputForDataConsumer:consumer] stdErr:nil]; FBProcessSpawnConfiguration *configuration = [[FBProcessSpawnConfiguration alloc] initWithLaunchPath:launchPath arguments:arguments environment:@{} io:processIO mode:FBProcessSpawnModeDefault]; return [self.simulator launchProcess:configuration]; } - (NSString *)logExecutablePathWithError:(NSError **)error { NSString *path = [[[self.simulator.device.runtime.root stringByAppendingPathComponent:@"usr"] stringByAppendingPathComponent:@"bin"] stringByAppendingPathComponent:@"log"]; FBBinaryDescriptor *binary = [FBBinaryDescriptor binaryWithPath:path error:error]; if (!binary) { return nil; } return binary.path; } @end