# build program images
build { core init timer test/timer_accuracy }

# create directory where boot files are written to
create_boot_directory

# define XML configuration for init
install_config {
<config prio_levels="2">
	<parent-provides>
		<service name="ROM"/>
		<service name="IRQ"/>
		<service name="IO_MEM"/>
		<service name="IO_PORT"/>
		<service name="PD"/>
		<service name="RM"/>
		<service name="CPU"/>
		<service name="LOG"/>
	</parent-provides>
	<default-route>
		<any-service><parent/><any-child/></any-service>
	</default-route>
	<default caps="100"/>
	<start name="timer" priority="0">
		<resource name="RAM" quantum="1M"/>
		<resource name="CPU" quantum="5"/>
		<provides><service name="Timer"/></provides>
	</start>
	<start name="test-timer_accuracy" priority="-1">
		<resource name="RAM" quantum="10M"/>
	</start>
</config>
}
# build boot files from source binaries
build_boot_image { core ld.lib.so init timer test-timer_accuracy }

# configure Qemu
append qemu_args "  -nographic"

set err_cnt      0
set test_timeout 20
set rounds       9

# wait for initial tic
run_genode_until {\[init -> test-timer_accuracy\].*\n} $test_timeout
set serial_id [output_spawn_id]

# measure the delays between the following tics
for {set i 1} {$i <= $rounds} {incr i} {
	set start_time($i) [clock milliseconds]
	run_genode_until {\[init -> test-timer_accuracy\].*\n} $test_timeout $serial_id
	set end_time($i) [clock milliseconds]
}
# print results and count errors
foreach i [lsort [array names start_time]] {
	set class "Good:"
	set test_result [expr $end_time($i) - $start_time($i)]
	set host_result [expr $i * 1000]
	set result_diff [expr abs($test_result - $host_result)]
	if {[expr $result_diff > 500]} {
		set class "Bad: "
		set err_cnt [expr $err_cnt + 1]
	}
	puts "$class round $i, host measured $host_result ms, test measured $test_result ms"
}
# check the error count
if {[expr $err_cnt > 0]} {
	puts "Test failed because of $err_cnt errors"
	exit -1
}
