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"
28 #import <utilities/debugging.h>
30 @interface CKKSConditionTests : XCTestCase
33 @implementation CKKSConditionTests
43 -(void)testConditionAfterFulfill {
44 CKKSCondition* c = [[CKKSCondition alloc] init];
47 XCTAssertEqual(0, [c wait:100*NSEC_PER_MSEC], "first wait after fulfill succeeds");
48 XCTAssertEqual(0, [c wait:100*NSEC_PER_MSEC], "second wait after fulfill succeeds");
49 XCTAssertEqual(0, [c wait:100*NSEC_PER_MSEC], "third wait after fulfill succeeds");
52 -(void)testConditionTimeout {
53 CKKSCondition* c = [[CKKSCondition alloc] init];
54 XCTAssertNotEqual(0, [c wait:100*NSEC_PER_MSEC], "waiting without fulfilling times out");
57 -(void)testConditionWait {
58 CKKSCondition* c = [[CKKSCondition alloc] init];
60 dispatch_queue_t queue = dispatch_queue_create("testConditionWait", DISPATCH_QUEUE_CONCURRENT);
62 XCTestExpectation *toofastexpectation = [self expectationWithDescription:@"wait ended (too soon)"];
63 toofastexpectation.inverted = YES;
65 XCTestExpectation *expectation = [self expectationWithDescription:@"wait ended"];
67 dispatch_async(queue, ^{
68 XCTAssertEqual(0, [c wait:1*NSEC_PER_SEC], "Wait did not time out");
69 [toofastexpectation fulfill];
70 [expectation fulfill];
73 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(250 * NSEC_PER_MSEC)), queue, ^{
77 // Make sure it waits at least 0.1 seconds
78 [self waitForExpectations: @[toofastexpectation] timeout:0.1];
80 // But finishes within .6s (total)
81 [self waitForExpectations: @[expectation] timeout:0.5];
84 -(void)testConditionChain {
85 CKKSCondition* chained = [[CKKSCondition alloc] init];
86 CKKSCondition* c = [[CKKSCondition alloc] initToChain: chained];
88 XCTAssertNotEqual(0, [chained wait:50*NSEC_PER_MSEC], "waiting on chained condition without fulfilling times out");
89 XCTAssertNotEqual(0, [c wait:50*NSEC_PER_MSEC], "waiting on condition without fulfilling times out");
92 XCTAssertEqual(0, [c wait:100*NSEC_PER_MSEC], "first wait after fulfill succeeds");
93 XCTAssertEqual(0, [chained wait:100*NSEC_PER_MSEC], "first chained wait after fulfill succeeds");
94 XCTAssertEqual(0, [c wait:100*NSEC_PER_MSEC], "second wait after fulfill succeeds");
95 XCTAssertEqual(0, [chained wait:100*NSEC_PER_MSEC], "second chained wait after fulfill succeeds");