| 1 | @interface TestPermissionRequester : NSObject <EXPermissionsRequester> |
| 2 | @end |
| 3 | |
| 4 | @implementation TestPermissionRequester |
| 5 | + (NSString *)permissionType { return NSStringFromClass(self); } |
| 6 | - (NSDictionary *)getPermissions { return @{ @"status": @(EXPermissionStatusGranted) }; } |
| 7 | - (void)requestPermissionsWithResolver:(EXPromiseResolveBlock)resolve rejecter:(EXPromiseRejectBlock)reject { |
| 8 | resolve([self getPermissions]); |
| 9 | } |
| 10 | @end |
| 11 | |
| 12 | typedef struct { |
| 13 | __unsafe_unretained EXPermissionsService *service; |
| 14 | __unsafe_unretained NSArray *requesters; |
| 15 | size_t offset; |
| 16 | } Worker; |
| 17 | |
| 18 | static void *exerciseRegistry(void *context) { |
| 19 | Worker *worker = context; |
| 20 | for (size_t index = 0; index < 250; index++) { |
| 21 | @autoreleasepool { |
| 22 | id<EXPermissionsRequester> requester = worker->requesters[(index + worker->offset) % worker->requesters.count]; |
| 23 | [worker->service registerRequesters:@[requester]]; |
| 24 | id resolved = [worker->service getPermissionRequesterForType:[[requester class] permissionType]]; |
| 25 | assert(resolved == requester); |
| 26 | NSDictionary *permissions = [worker->service getPermissionUsingRequesterClass:[requester class]]; |
| 27 | assert([permissions[@"status"] isEqualToString:@"granted"]); |
| 28 | } |
| 29 | } |
| 30 | return NULL; |
| 31 | } |
| 32 | |
| 33 | int main(void) { |
| 34 | @autoreleasepool { |
| 35 | EXPermissionsService *service = [EXPermissionsService new]; |
| 36 | NSMutableArray *requesters = [NSMutableArray new]; |
| 37 | for (int i = 0; i < 32; i++) { |
| 38 | NSString *name = [NSString stringWithFormat:@"TestPermission%d", i]; |
| 39 | Class cls = objc_allocateClassPair([TestPermissionRequester class], name.UTF8String, 0); |
| 40 | objc_registerClassPair(cls); |
| 41 | [requesters addObject:[cls new]]; |
| 42 | } |
| 43 | Worker workers[8]; |
| 44 | pthread_t threads[8]; |
| 45 | for (size_t index = 0; index < 8; index++) { |
| 46 | workers[index] = (Worker){ service, requesters, index }; |
| 47 | assert(pthread_create(&threads[index], NULL, exerciseRegistry, &workers[index]) == 0); |
| 48 | } |
| 49 | for (size_t index = 0; index < 8; index++) { |
| 50 | assert(pthread_join(threads[index], NULL) == 0); |
| 51 | } |
| 52 | puts("passed"); |
| 53 | } |
| 54 | return 0; |
| 55 | } |