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
12typedef struct {
13 __unsafe_unretained EXPermissionsService *service;
14 __unsafe_unretained NSArray *requesters;
15 size_t offset;
16} Worker;
17
18static 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
33int 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}