// Copyright 2015-present 650 Industries. All rights reserved. #import "EXTest.h" #import "EXUnversioned.h" #import NSNotificationName EXTestSuiteCompletedNotification = @"EXTestSuiteCompletedNotification"; @interface EXTest () @property (class, nonatomic, assign, readonly) os_log_t log; @property (nonatomic, assign) EXTestEnvironment environment; @end @implementation EXTest RCT_EXPORT_MODULE(ExponentTest); + (os_log_t)log { static os_log_t log; static dispatch_once_t once; dispatch_once(&once, ^{ log = os_log_create("host.exp.Exponent", "test"); }); return log; } - (instancetype)initWithEnvironment:(EXTestEnvironment)environment { if (self = [super init]) { _environment = environment; } return self; } - (NSDictionary *)constantsToExport { return @{ @"isInCI": @(_environment == EXTestEnvironmentCI), }; } + (BOOL)requiresMainQueueSetup { return NO; } RCT_EXPORT_METHOD(log:(NSString *)message) { os_log(EXTest.log, "%{public}@", message); } RCT_EXPORT_METHOD(completed:(NSString *)jsonStringifiedResult) { NSDictionary *failedResult = @{ @"failed": @(1) }; NSError *jsonError; NSData *jsonData = [jsonStringifiedResult dataUsingEncoding:NSUTF8StringEncoding]; id resultObj = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&jsonError]; if (jsonError) { resultObj = failedResult; } [[NSNotificationCenter defaultCenter] postNotificationName:EX_UNVERSIONED(@"EXTestSuiteCompletedNotification") object:nil userInfo:resultObj]; // Apple's unified logging more precisely ensures the output is visible in a standalone app built // for release and for us to filter for this message os_log(EXTest.log, "[TEST-SUITE-END] %{public}@", jsonStringifiedResult); } RCT_REMAP_METHOD(action, actionWithParams:(NSDictionary *)params withResolver:(RCTPromiseResolveBlock)resolve rejecter:(__unused RCTPromiseRejectBlock)reject) { // stub on iOS resolve(@{}); } RCT_REMAP_METHOD(shouldSkipTestsRequiringPermissionsAsync, shouldSkipTestsRequiringPermissionsWithResolver:(RCTPromiseResolveBlock)resolve rejecter:(__unused RCTPromiseRejectBlock)reject) { resolve(@(_environment == EXTestEnvironmentCI)); } #pragma mark - util + (EXTestEnvironment)testEnvironmentFromString:(NSString *)testEnvironmentString { if ([testEnvironmentString isEqualToString:@"local"]) { return EXTestEnvironmentLocal; } else if ([testEnvironmentString isEqualToString:@"ci"]) { return EXTestEnvironmentCI; } return EXTestEnvironmentNone; } @end