// SPDX-License-Identifier: LGPL-3.0-or-later
// Copyright © 2020-2021 Florian Fischer
#include <liburing.h>

#include <cassert>	// for assert
#include <cerrno>		// for ETIME
#include <chrono>		// for microseconds, duration_cast, operator-
#include <compare>	// for operator>=, strong_ordering
#include <cstdint>	// for int32_t
#include <cstdlib>	// for exit, EXIT_SUCCESS

#include "io/Future.hpp"	// for AlarmFuture

using emper::io::AlarmFuture;

void emperTest() {
	struct __kernel_timespec ts = {.tv_sec = 1, .tv_nsec = 0};
	AlarmFuture alarm(ts);

	auto start = std::chrono::high_resolution_clock::now();
	int32_t res = alarm.submitAndWait();
	auto end = std::chrono::high_resolution_clock::now();

	// timeouts return -ETIME if they trigger
	assert(res == -ETIME);

	assert(std::chrono::duration_cast<std::chrono::microseconds>(end - start) >=
				 std::chrono::seconds(1));

	exit(EXIT_SUCCESS);
}