]> git.saurik.com Git - apple/libdispatch.git/blob - testing/dispatch_after.c
libdispatch-84.5.5.tar.gz
[apple/libdispatch.git] / testing / dispatch_after.c
1 #include <dispatch/dispatch.h>
2 #include <stdio.h>
3 #include <unistd.h>
4 #include <stdlib.h>
5 #include <assert.h>
6 #include <libkern/OSAtomic.h>
7
8 #include "dispatch_test.h"
9 #include <Block.h>
10
11 void done(void *arg __unused) {
12 sleep(1);
13 test_stop();
14 }
15
16 int
17 main(void)
18 {
19 __block dispatch_time_t time_a_min, time_a, time_a_max;
20 __block dispatch_time_t time_b_min, time_b, time_b_max;
21 __block dispatch_time_t time_c_min, time_c, time_c_max;
22
23
24 test_start("Dispatch After");
25
26 dispatch_async(dispatch_get_main_queue(), ^{
27 time_a_min = dispatch_time(0, 5.5*NSEC_PER_SEC);
28 time_a = dispatch_time(0, 6*NSEC_PER_SEC);
29 time_a_max = dispatch_time(0, 6.5*NSEC_PER_SEC);
30 dispatch_after(time_a, dispatch_get_current_queue(), ^{
31 dispatch_time_t now_a = dispatch_time(0, 0);
32 test_long_less_than("can't finish faster than 5.5s", 0, now_a - time_a_min);
33 test_long_less_than("must finish faster than 6.5s", 0, time_a_max - now_a);
34
35 time_b_min = dispatch_time(0, 1.5*NSEC_PER_SEC);
36 time_b = dispatch_time(0, 2*NSEC_PER_SEC);
37 time_b_max = dispatch_time(0, 2.5*NSEC_PER_SEC);
38 dispatch_after(time_b, dispatch_get_current_queue(), ^{
39 dispatch_time_t now_b = dispatch_time(0, 0);
40 test_long_less_than("can't finish faster than 1.5s", 0, now_b - time_b_min);
41 test_long_less_than("must finish faster than 2.5s", 0, time_b_max - now_b);
42
43 time_c_min = dispatch_time(0, 0*NSEC_PER_SEC);
44 time_c = dispatch_time(0, 0*NSEC_PER_SEC);
45 time_c_max = dispatch_time(0, .5*NSEC_PER_SEC);
46 dispatch_after(time_c, dispatch_get_current_queue(), ^{
47 dispatch_time_t now_c = dispatch_time(0, 0);
48 test_long_less_than("can't finish faster than 0s", 0, now_c - time_c_min);
49 test_long_less_than("must finish faster than .5s", 0, time_c_max - now_c);
50
51 dispatch_async_f(dispatch_get_current_queue(), NULL, done);
52 });
53 });
54 });
55 });
56
57 dispatch_main();
58 return 0;
59 }