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