XCTestBootstrap/Utility/FBXCTestResultToolOperation.m (83 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 "FBXCTestResultToolOperation.h" NS_ASSUME_NONNULL_BEGIN NSString *const XcrunPath = @"/usr/bin/xcrun"; NSString *const SipsPath = @"/usr/bin/sips"; NSString *const HEIC = @"public.heic"; NSString *const JPEG = @"public.jpeg"; @implementation FBXCTestResultToolOperation #pragma mark Private + (FBFuture<FBProcess *> *)internalOperationWithArguments:(NSArray<NSString *> *)arguments queue:(dispatch_queue_t)queue logger:(nullable id<FBControlCoreLogger>)logger { NSArray<NSString *> *xcrunArguments = [@[@"xcresulttool"] arrayByAddingObjectsFromArray:arguments]; return [[[[[[FBProcessBuilder withLaunchPath:XcrunPath] withArguments:xcrunArguments] withStdErrToLogger:logger] withTaskLifecycleLoggingTo:logger] runUntilCompletionWithAcceptableExitCodes:[NSSet setWithObject:@0]] onQueue:queue map:^(FBProcess *task) { return task; }]; } + (FBFuture<FBProcess *> *)exportFrom:(NSString *)path to:(NSString *)destination forId:(NSString *)bundleObjectId withType:(NSString *)exportType queue:(dispatch_queue_t)queue logger:(nullable id<FBControlCoreLogger>)logger { NSArray<NSString *> *arguments = @[@"export", @"--path", path, @"--output-path", destination, @"--id", bundleObjectId, @"--type", exportType]; return [FBXCTestResultToolOperation internalOperationWithArguments:arguments queue:queue logger:logger]; } + (NSDictionary<NSString *, NSDictionary<NSString *, id> *> *)getJSONFromTask:(FBProcess *)task { NSData *data = [task.stdOut dataUsingEncoding:NSUTF8StringEncoding]; return [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; } # pragma mark Public + (FBFuture<NSDictionary<NSString *, NSDictionary<NSString *, id> *> *> *)getJSONFrom:(NSString *)path forId:(nullable NSString *)bundleObjectId queue:(dispatch_queue_t)queue logger:(nullable id<FBControlCoreLogger>)logger { [logger logFormat:@"Getting json for id %@", bundleObjectId]; NSMutableArray<NSString *> *arguments = [[NSMutableArray alloc] init]; [arguments addObjectsFromArray:@[@"get", @"--path", path, @"--format", @"json"]]; if (bundleObjectId && bundleObjectId.length > 0) { [arguments addObjectsFromArray:@[@"--id", bundleObjectId]]; } return [[FBXCTestResultToolOperation internalOperationWithArguments:arguments queue:queue logger:logger] onQueue:queue map:^(FBProcess *task) { return [FBXCTestResultToolOperation getJSONFromTask:task]; }]; } + (FBFuture<FBProcess *> *)exportFileFrom:(NSString *)path to:(NSString *)destination forId:(NSString *)bundleObjectId queue:(dispatch_queue_t)queue logger:(nullable id<FBControlCoreLogger>)logger { return [FBXCTestResultToolOperation exportFrom:path to:destination forId:bundleObjectId withType:@"file" queue:queue logger:logger]; } + (FBFuture<FBProcess *> *)exportJPEGFrom:(NSString *)path to:(NSString *)destination forId:(NSString *)bundleObjectId type:(NSString *)encodeType queue:(dispatch_queue_t)queue logger:(nullable id<FBControlCoreLogger>)logger { return [[FBXCTestResultToolOperation exportFileFrom:path to:destination forId:bundleObjectId queue:queue logger:logger] onQueue:queue fmap:^ FBFuture * (FBProcess *task) { if ([encodeType isEqualToString:HEIC]) { NSArray<NSString *> *arguments = @[@"-s", @"format", @"jpeg", destination, @"--out", destination]; return [[[[[FBProcessBuilder withLaunchPath:SipsPath] withArguments:arguments] withStdErrToLogger:logger] withTaskLifecycleLoggingTo:logger] runUntilCompletionWithAcceptableExitCodes:[NSSet setWithObject:@0]]; } else if ([encodeType isEqualToString:JPEG]) { return [FBFuture futureWithResult:task]; } else { return [[FBControlCoreError describeFormat:@"Unrecognized XCTest screenshot encoding: %@", encodeType] failFuture]; } }]; } + (FBFuture<FBProcess *> *)exportDirectoryFrom:(NSString *)path to:(NSString *)destination forId:(NSString *)bundleObjectId queue:(dispatch_queue_t)queue logger:(nullable id<FBControlCoreLogger>)logger { return [FBXCTestResultToolOperation exportFrom:path to:destination forId:bundleObjectId withType:@"directory" queue:queue logger:logger]; } + (FBFuture<NSDictionary<NSString *, NSDictionary<NSString *, id> *> *> *)describeFormat:(dispatch_queue_t)queue logger:(nullable id<FBControlCoreLogger>)logger { NSArray<NSString *> *arguments = @[@"formatDescription"]; return [[FBXCTestResultToolOperation internalOperationWithArguments:arguments queue:queue logger:logger] onQueue:queue map:^(FBProcess *task) { return [FBXCTestResultToolOperation getJSONFromTask:task]; }]; } @end NS_ASSUME_NONNULL_END