AliyunOSSiOSTests/OSSCancellationTests.m (120 lines of code) (raw):

// // OSSCancellationTests.m // AliyunOSSiOSTests // // Created by 怀叙 on 2017/11/15. // Copyright © 2017年 zhouzhuo. All rights reserved. // #import <XCTest/XCTest.h> #import <AliyunOSSiOS/OSSCancellationTokenSource.h> #import <AliyunOSSiOS/OSSCancellationTokenRegistration.h> #import <AliyunOSSiOS/OSSCancellationToken.h> @interface OSSCancellationTests : XCTestCase @end @implementation OSSCancellationTests - (void)testCancel { OSSCancellationTokenSource *cts = [OSSCancellationTokenSource cancellationTokenSource]; XCTAssertFalse(cts.cancellationRequested, @"Source should not be cancelled"); XCTAssertFalse(cts.token.cancellationRequested, @"Token should not be cancelled"); [cts cancel]; XCTAssertTrue(cts.cancellationRequested, @"Source should be cancelled"); XCTAssertTrue(cts.token.cancellationRequested, @"Token should be cancelled"); } - (void)testCancelMultipleTimes { OSSCancellationTokenSource *cts = [OSSCancellationTokenSource cancellationTokenSource]; XCTAssertFalse(cts.cancellationRequested); XCTAssertFalse(cts.token.cancellationRequested); [cts cancel]; XCTAssertTrue(cts.cancellationRequested); XCTAssertTrue(cts.token.cancellationRequested); [cts cancel]; XCTAssertTrue(cts.cancellationRequested); XCTAssertTrue(cts.token.cancellationRequested); } - (void)testCancellationBlock { __block BOOL cancelled = NO; OSSCancellationTokenSource *cts = [OSSCancellationTokenSource cancellationTokenSource]; [cts.token registerCancellationObserverWithBlock:^{ cancelled = YES; }]; XCTAssertFalse(cts.cancellationRequested, @"Source should not be cancelled"); XCTAssertFalse(cts.token.cancellationRequested, @"Token should not be cancelled"); [cts cancel]; XCTAssertTrue(cancelled, @"Source should be cancelled"); } - (void)testCancellationAfterDelay { OSSCancellationTokenSource *cts = [OSSCancellationTokenSource cancellationTokenSource]; XCTAssertFalse(cts.cancellationRequested, @"Source should not be cancelled"); XCTAssertFalse(cts.token.cancellationRequested, @"Token should not be cancelled"); [cts cancelAfterDelay:200]; XCTAssertFalse(cts.cancellationRequested, @"Source should be cancelled"); XCTAssertFalse(cts.token.cancellationRequested, @"Token should be cancelled"); // Spin the run loop for half a second, since `delay` is in milliseconds, not seconds. [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]]; XCTAssertTrue(cts.cancellationRequested, @"Source should be cancelled"); XCTAssertTrue(cts.token.cancellationRequested, @"Token should be cancelled"); } - (void)testCancellationAfterDelayValidation { OSSCancellationTokenSource *cts = [OSSCancellationTokenSource cancellationTokenSource]; XCTAssertFalse(cts.cancellationRequested); XCTAssertFalse(cts.token.cancellationRequested); XCTAssertThrowsSpecificNamed([cts cancelAfterDelay:-2], NSException, NSInvalidArgumentException); } - (void)testCancellationAfterZeroDelay { OSSCancellationTokenSource *cts = [OSSCancellationTokenSource cancellationTokenSource]; XCTAssertFalse(cts.cancellationRequested); XCTAssertFalse(cts.token.cancellationRequested); [cts cancelAfterDelay:0]; XCTAssertTrue(cts.cancellationRequested); XCTAssertTrue(cts.token.cancellationRequested); } - (void)testCancellationAfterDelayOnCancelled { OSSCancellationTokenSource *cts = [OSSCancellationTokenSource cancellationTokenSource]; [cts cancel]; XCTAssertTrue(cts.cancellationRequested); XCTAssertTrue(cts.token.cancellationRequested); [cts cancelAfterDelay:1]; XCTAssertTrue(cts.cancellationRequested); XCTAssertTrue(cts.token.cancellationRequested); } - (void)testDispose { OSSCancellationTokenSource *cts = [OSSCancellationTokenSource cancellationTokenSource]; [cts dispose]; XCTAssertThrowsSpecificNamed([cts cancel], NSException, NSInternalInconsistencyException); XCTAssertThrowsSpecificNamed(cts.cancellationRequested, NSException, NSInternalInconsistencyException); XCTAssertThrowsSpecificNamed(cts.token.cancellationRequested, NSException, NSInternalInconsistencyException); cts = [OSSCancellationTokenSource cancellationTokenSource]; [cts cancel]; XCTAssertTrue(cts.cancellationRequested, @"Source should be cancelled"); XCTAssertTrue(cts.token.cancellationRequested, @"Token should be cancelled"); [cts dispose]; XCTAssertThrowsSpecificNamed(cts.cancellationRequested, NSException, NSInternalInconsistencyException); XCTAssertThrowsSpecificNamed(cts.token.cancellationRequested, NSException, NSInternalInconsistencyException); } - (void)testDisposeMultipleTimes { OSSCancellationTokenSource *cts = [OSSCancellationTokenSource cancellationTokenSource]; [cts dispose]; XCTAssertNoThrow([cts dispose]); } - (void)testDisposeRegistration { OSSCancellationTokenSource *cts = [OSSCancellationTokenSource cancellationTokenSource]; OSSCancellationTokenRegistration *registration = [cts.token registerCancellationObserverWithBlock:^{ XCTFail(); }]; XCTAssertNoThrow([registration dispose]); [cts cancel]; } - (void)testDisposeRegistrationMultipleTimes { OSSCancellationTokenSource *cts = [OSSCancellationTokenSource cancellationTokenSource]; OSSCancellationTokenRegistration *registration = [cts.token registerCancellationObserverWithBlock:^{ XCTFail(); }]; XCTAssertNoThrow([registration dispose]); XCTAssertNoThrow([registration dispose]); [cts cancel]; } - (void)testDisposeRegistrationAfterCancellationToken { OSSCancellationTokenSource *cts = [OSSCancellationTokenSource cancellationTokenSource]; OSSCancellationTokenRegistration *registration = [cts.token registerCancellationObserverWithBlock:^{ }]; [registration dispose]; [cts dispose]; } - (void)testDisposeRegistrationBeforeCancellationToken { OSSCancellationTokenSource *cts = [OSSCancellationTokenSource cancellationTokenSource]; OSSCancellationTokenRegistration *registration = [cts.token registerCancellationObserverWithBlock:^{ }]; [cts dispose]; XCTAssertNoThrow([registration dispose]); } @end