1// Copyright 2015-present 650 Industries. All rights reserved. 2 3#import "EXTest.h" 4#import "EXUnversioned.h" 5 6#import <os/log.h> 7 8NSNotificationName EXTestSuiteCompletedNotification = @"EXTestSuiteCompletedNotification"; 9 10@interface EXTest () 11 12@property (class, nonatomic, assign, readonly) os_log_t log; 13@property (nonatomic, assign) EXTestEnvironment environment; 14 15@end 16 17@implementation EXTest 18 19RCT_EXPORT_MODULE(ExponentTest); 20 21+ (os_log_t)log { 22 static os_log_t log; 23 static dispatch_once_t once; 24 dispatch_once(&once, ^{ 25 log = os_log_create("host.exp.Exponent", "test"); 26 }); 27 return log; 28} 29 30- (instancetype)initWithEnvironment:(EXTestEnvironment)environment 31{ 32 if (self = [super init]) { 33 _environment = environment; 34 } 35 return self; 36} 37 38- (NSDictionary *)constantsToExport 39{ 40 return @{ 41 @"isInCI": @(_environment == EXTestEnvironmentCI), 42 }; 43} 44 45+ (BOOL)requiresMainQueueSetup 46{ 47 return NO; 48} 49 50RCT_EXPORT_METHOD(log:(NSString *)message) 51{ 52 os_log(EXTest.log, "%{public}@", message); 53} 54 55RCT_EXPORT_METHOD(completed:(NSString *)jsonStringifiedResult) 56{ 57 NSDictionary *failedResult = @{ @"failed": @(1) }; 58 59 NSError *jsonError; 60 NSData *jsonData = [jsonStringifiedResult dataUsingEncoding:NSUTF8StringEncoding]; 61 id resultObj = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&jsonError]; 62 if (jsonError) { 63 resultObj = failedResult; 64 } 65 66 [[NSNotificationCenter defaultCenter] postNotificationName:EX_UNVERSIONED(@"EXTestSuiteCompletedNotification") 67 object:nil 68 userInfo:resultObj]; 69 70 // Apple's unified logging more precisely ensures the output is visible in a standalone app built 71 // for release and for us to filter for this message 72 os_log(EXTest.log, "[TEST-SUITE-END] %{public}@", jsonStringifiedResult); 73} 74 75RCT_REMAP_METHOD(action, 76 actionWithParams:(NSDictionary *)params 77 withResolver:(RCTPromiseResolveBlock)resolve 78 rejecter:(__unused RCTPromiseRejectBlock)reject) 79{ 80 // stub on iOS 81 resolve(@{}); 82} 83 84RCT_REMAP_METHOD(shouldSkipTestsRequiringPermissionsAsync, 85 shouldSkipTestsRequiringPermissionsWithResolver:(RCTPromiseResolveBlock)resolve 86 rejecter:(__unused RCTPromiseRejectBlock)reject) 87{ 88 resolve(@(_environment == EXTestEnvironmentCI)); 89} 90 91#pragma mark - util 92 93+ (EXTestEnvironment)testEnvironmentFromString:(NSString *)testEnvironmentString 94{ 95 if ([testEnvironmentString isEqualToString:@"local"]) { 96 return EXTestEnvironmentLocal; 97 } else if ([testEnvironmentString isEqualToString:@"ci"]) { 98 return EXTestEnvironmentCI; 99 } 100 return EXTestEnvironmentNone; 101} 102 103@end 104