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