2 * Copyright (c) 2017 Apple Inc. All Rights Reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
21 * @APPLE_LICENSE_HEADER_END@
25 #import <XCTest/XCTest.h>
26 #import <XCTest/XCTest.h>
27 #import "keychain/ckks/CKKSCondition.h"
29 @interface CKKSConditionTests : XCTestCase
32 @implementation CKKSConditionTests
42 -(void)testConditionAfterFulfill {
43 CKKSCondition* c = [[CKKSCondition alloc] init];
46 XCTAssertEqual(0, [c wait:100*NSEC_PER_MSEC], "first wait after fulfill succeeds");
47 XCTAssertEqual(0, [c wait:100*NSEC_PER_MSEC], "second wait after fulfill succeeds");
48 XCTAssertEqual(0, [c wait:100*NSEC_PER_MSEC], "third wait after fulfill succeeds");
51 -(void)testConditionTimeout {
52 CKKSCondition* c = [[CKKSCondition alloc] init];
53 XCTAssertNotEqual(0, [c wait:100*NSEC_PER_MSEC], "waiting without fulfilling times out");
56 -(void)testConditionWait {
57 CKKSCondition* c = [[CKKSCondition alloc] init];
59 dispatch_queue_t queue = dispatch_queue_create("testConditionWait", DISPATCH_QUEUE_CONCURRENT);
61 XCTestExpectation *toofastexpectation = [self expectationWithDescription:@"wait ended (too soon)"];
62 toofastexpectation.inverted = YES;
64 XCTestExpectation *expectation = [self expectationWithDescription:@"wait ended"];
66 dispatch_async(queue, ^{
67 XCTAssertEqual(0, [c wait:1*NSEC_PER_SEC], "Wait did not time out");
68 [toofastexpectation fulfill];
69 [expectation fulfill];
72 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(250 * NSEC_PER_MSEC)), queue, ^{
76 // Make sure it waits at least 0.1 seconds
77 [self waitForExpectations: @[toofastexpectation] timeout:0.1];
79 // But finishes within .6s (total)
80 [self waitForExpectations: @[expectation] timeout:0.5];
83 -(void)testConditionChain {
84 CKKSCondition* chained = [[CKKSCondition alloc] init];
85 CKKSCondition* c = [[CKKSCondition alloc] initToChain: chained];
87 XCTAssertNotEqual(0, [chained wait:50*NSEC_PER_MSEC], "waiting on chained condition without fulfilling times out");
88 XCTAssertNotEqual(0, [c wait:50*NSEC_PER_MSEC], "waiting on condition without fulfilling times out");
91 XCTAssertEqual(0, [c wait:100*NSEC_PER_MSEC], "first wait after fulfill succeeds");
92 XCTAssertEqual(0, [chained wait:100*NSEC_PER_MSEC], "first chained wait after fulfill succeeds");
93 XCTAssertEqual(0, [c wait:100*NSEC_PER_MSEC], "second wait after fulfill succeeds");
94 XCTAssertEqual(0, [chained wait:100*NSEC_PER_MSEC], "second chained wait after fulfill succeeds");