mirror of https://github.com/oxen-io/session-ios
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
2.0 KiB
Objective-C
82 lines
2.0 KiB
Objective-C
#import "CancelTokenTest.h"
|
|
#import "CancelTokenSource.h"
|
|
#import "CancelledToken.h"
|
|
#import "TestUtil.h"
|
|
#import "Util.h"
|
|
|
|
@interface OnDealloc : NSObject {
|
|
@private void (^action)();
|
|
}
|
|
+(OnDealloc*) onDealloc:(void(^)())action;
|
|
@end
|
|
@implementation OnDealloc
|
|
+(OnDealloc*) onDealloc:(void(^)())action {
|
|
OnDealloc* d = [OnDealloc new];
|
|
d->action = [action copy];
|
|
return d;
|
|
}
|
|
-(void) dealloc {
|
|
action();
|
|
}
|
|
@end
|
|
|
|
@implementation CancelTokenTest
|
|
|
|
-(void) testCancelTokenSource {
|
|
CancelTokenSource* s = [CancelTokenSource cancelTokenSource];
|
|
id<CancelToken> c = [s getToken];
|
|
__block int n = 0;
|
|
[c whenCancelled:^{n += 1;}];
|
|
[c whenCancelled:^{n += 1;}];
|
|
test(n == 0);
|
|
[s cancel];
|
|
test(n == 2);
|
|
[c whenCancelled:^{n += 1;}];
|
|
test(n == 3);
|
|
}
|
|
-(void) testCancelledToken {
|
|
__block int n = 0;
|
|
[[CancelledToken cancelledToken] whenCancelled:^{n += 1;}];
|
|
test(n == 1);
|
|
}
|
|
-(void) testCallbacksDeallocWhenSourceDeallocs {
|
|
__block bool dealloced = false;
|
|
__block id<CancelToken> c = nil;
|
|
NSObject* lock = [NSObject new];
|
|
[Operation asyncRunOnNewThread:^{
|
|
OnDealloc* d = [OnDealloc onDealloc:^{
|
|
@synchronized(lock) {
|
|
dealloced = true;
|
|
}
|
|
}];
|
|
CancelTokenSource* s = [CancelTokenSource cancelTokenSource];
|
|
c = [s getToken];
|
|
|
|
// hold reference to 'd' in callback
|
|
[c whenCancelled:^{
|
|
if (d != nil) {
|
|
@synchronized(lock) {
|
|
// should never run
|
|
test(false);
|
|
dealloced = true;
|
|
}
|
|
}
|
|
}];
|
|
|
|
// s goes out of scope, gets dealloced, cancellation becomes impossible
|
|
// local reference to d and callback reference should both go away, causing d to be dealloced
|
|
}];
|
|
|
|
// spin lock
|
|
while (true) {
|
|
@synchronized(lock) {
|
|
if (dealloced) break;
|
|
}
|
|
}
|
|
test(c != nil);
|
|
test(![c isAlreadyCancelled]);
|
|
test(dealloced);
|
|
}
|
|
|
|
@end
|