]> git.saurik.com Git - apple/security.git/blob - keychain/ckks/tests/CKKSConditionTests.m
Security-58286.41.2.tar.gz
[apple/security.git] / keychain / ckks / tests / CKKSConditionTests.m
1 /*
2 * Copyright (c) 2017 Apple Inc. All Rights Reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
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
11 * file.
12 *
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.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24 #import <XCTest/XCTest.h>
25 #import <XCTest/XCTest.h>
26 #import "keychain/ckks/CKKSCondition.h"
27 #import <utilities/debugging.h>
28
29 @interface CKKSConditionTests : XCTestCase
30 @end
31
32 @implementation CKKSConditionTests
33
34 - (void)setUp {
35 [super setUp];
36 }
37
38 - (void)tearDown {
39 [super tearDown];
40 }
41
42 -(void)testConditionAfterFulfill {
43 CKKSCondition* c = [[CKKSCondition alloc] init];
44
45 [c fulfill];
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");
49 }
50
51 -(void)testConditionTimeout {
52 CKKSCondition* c = [[CKKSCondition alloc] init];
53 XCTAssertNotEqual(0, [c wait:100*NSEC_PER_MSEC], "waiting without fulfilling times out");
54 }
55
56 -(void)testConditionWait {
57 CKKSCondition* c = [[CKKSCondition alloc] init];
58
59 dispatch_queue_t queue = dispatch_queue_create("testConditionWait", DISPATCH_QUEUE_CONCURRENT);
60
61 XCTestExpectation *toofastexpectation = [self expectationWithDescription:@"wait ended (too soon)"];
62 toofastexpectation.inverted = YES;
63
64 XCTestExpectation *expectation = [self expectationWithDescription:@"wait ended"];
65
66 dispatch_async(queue, ^{
67 XCTAssertEqual(0, [c wait:1*NSEC_PER_SEC], "Wait did not time out");
68 [toofastexpectation fulfill];
69 [expectation fulfill];
70 });
71
72 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(150 * NSEC_PER_MSEC)), queue, ^{
73 [c fulfill];
74 });
75
76 // Make sure it waits at least 0.1 seconds
77 [self waitForExpectations: @[toofastexpectation] timeout:0.1];
78
79 // But finishes within .6s (total)
80 [self waitForExpectations: @[expectation] timeout:0.5];
81 }
82
83 -(void)testConditionChain {
84 CKKSCondition* chained = [[CKKSCondition alloc] init];
85 CKKSCondition* c = [[CKKSCondition alloc] initToChain: chained];
86
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");
89
90 [c fulfill];
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");
95 }
96
97 @end