2 * Copyright (c) 2008-2009 Apple Inc. All rights reserved.
4 * @APPLE_APACHE_LICENSE_HEADER_START@
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
18 * @APPLE_APACHE_LICENSE_HEADER_END@
21 #include "config/config.h"
23 #include <dispatch/dispatch.h>
29 #include "dispatch_test.h"
32 void done(void *arg __unused) {
40 __block dispatch_time_t time_a_min, time_a, time_a_max;
41 __block dispatch_time_t time_b_min, time_b, time_b_max;
42 __block dispatch_time_t time_c_min, time_c, time_c_max;
45 test_start("Dispatch After");
47 dispatch_async(dispatch_get_main_queue(), ^{
48 time_a_min = dispatch_time(0, 5.5*NSEC_PER_SEC);
49 time_a = dispatch_time(0, 6*NSEC_PER_SEC);
50 time_a_max = dispatch_time(0, 6.5*NSEC_PER_SEC);
51 dispatch_after(time_a, dispatch_get_current_queue(), ^{
52 dispatch_time_t now_a = dispatch_time(0, 0);
53 test_long_less_than("can't finish faster than 5.5s", 0, now_a - time_a_min);
54 test_long_less_than("must finish faster than 6.5s", 0, time_a_max - now_a);
56 time_b_min = dispatch_time(0, 1.5*NSEC_PER_SEC);
57 time_b = dispatch_time(0, 2*NSEC_PER_SEC);
58 time_b_max = dispatch_time(0, 2.5*NSEC_PER_SEC);
59 dispatch_after(time_b, dispatch_get_current_queue(), ^{
60 dispatch_time_t now_b = dispatch_time(0, 0);
61 test_long_less_than("can't finish faster than 1.5s", 0, now_b - time_b_min);
62 test_long_less_than("must finish faster than 2.5s", 0, time_b_max - now_b);
64 time_c_min = dispatch_time(0, 0*NSEC_PER_SEC);
65 time_c = dispatch_time(0, 0*NSEC_PER_SEC);
66 time_c_max = dispatch_time(0, .5*NSEC_PER_SEC);
67 dispatch_after(time_c, dispatch_get_current_queue(), ^{
68 dispatch_time_t now_c = dispatch_time(0, 0);
69 test_long_less_than("can't finish faster than 0s", 0, now_c - time_c_min);
70 test_long_less_than("must finish faster than .5s", 0, time_c_max - now_c);
72 dispatch_async_f(dispatch_get_current_queue(), NULL, done);