/*
 * Copyright (c) 2008-2011 Apple Inc. All rights reserved.
 *
 * @APPLE_APACHE_LICENSE_HEADER_START@
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * @APPLE_APACHE_LICENSE_HEADER_END@
 */

#include <dispatch/dispatch.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#ifdef __APPLE__
#include <libkern/OSAtomic.h>
#endif

#include <bsdtests.h>
#include <Block.h>

#include "dispatch_test.h"

static void
done(void *arg /*__unused */)
{
	(void)arg;
	sleep(1);
	test_stop();
}

static void
test_after(void)
{
	__block dispatch_time_t time_a_min, time_a, time_a_max;
	__block dispatch_time_t time_b_min, time_b, time_b_max;
	__block dispatch_time_t time_c_min, time_c, time_c_max;

	dispatch_test_start("Dispatch After");

	dispatch_async(dispatch_get_main_queue(), ^{
		time_a_min = dispatch_time(0,  (int64_t)(5.5*NSEC_PER_SEC));
		time_a     = dispatch_time(0,   (int64_t)(6*NSEC_PER_SEC));
		time_a_max = dispatch_time(0,  (int64_t)(6.5*NSEC_PER_SEC));
		dispatch_after(time_a, dispatch_get_main_queue(), ^{
			dispatch_time_t now_a = dispatch_time(0, 0);
			test_long_less_than("can't finish faster than 5.5s", 0, (long)(now_a - time_a_min));
			test_long_less_than("must finish faster than  6.5s", 0, (long)(time_a_max - now_a));

			time_b_min = dispatch_time(0,  (int64_t)(1.5*NSEC_PER_SEC));
			time_b     = dispatch_time(0,  (int64_t)(2*NSEC_PER_SEC));
			time_b_max = dispatch_time(0,  (int64_t)(2.5*NSEC_PER_SEC));
			dispatch_after(time_b, dispatch_get_main_queue(), ^{
				dispatch_time_t now_b = dispatch_time(0, 0);
				test_long_less_than("can't finish faster than 1.5s", 0, (long)(now_b - time_b_min));
				test_long_less_than("must finish faster than  2.5s", 0, (long)(time_b_max - now_b));

				time_c_min = dispatch_time(0,  0*NSEC_PER_SEC);
				time_c     = dispatch_time(0,  0*NSEC_PER_SEC);
				time_c_max = dispatch_time(0,  (int64_t)(.5*NSEC_PER_SEC));
				dispatch_after(time_c, dispatch_get_main_queue(), ^{
					dispatch_time_t now_c = dispatch_time(0, 0);
					test_long_less_than("can't finish faster than 0s", 0, (long)(now_c - time_c_min));
					test_long_less_than("must finish faster than .5s", 0, (long)(time_c_max - now_c));

					dispatch_async_f(dispatch_get_main_queue(), NULL, done);
				});
			});
		});
	});
}

int
main(void)
{
	test_after();
	dispatch_main();
	return 1;
}
