1bd797fc1SAlberto Garcia /*
2bd797fc1SAlberto Garcia * Timed average computation tests
3bd797fc1SAlberto Garcia *
4bd797fc1SAlberto Garcia * Copyright Nodalink, EURL. 2014
5bd797fc1SAlberto Garcia *
6bd797fc1SAlberto Garcia * Authors:
7bd797fc1SAlberto Garcia * Benoît Canet <benoit.canet@nodalink.com>
8bd797fc1SAlberto Garcia *
9bd797fc1SAlberto Garcia * This work is licensed under the terms of the GNU LGPL, version 2 or later.
10bd797fc1SAlberto Garcia * See the COPYING.LIB file in the top-level directory.
11bd797fc1SAlberto Garcia */
12bd797fc1SAlberto Garcia
13681c28a3SPeter Maydell #include "qemu/osdep.h"
14*32cad1ffSPhilippe Mathieu-Daudé #include "system/cpu-timers.h"
15bd797fc1SAlberto Garcia #include "qemu/timed-average.h"
16bd797fc1SAlberto Garcia
17bd797fc1SAlberto Garcia /* This is the clock for QEMU_CLOCK_VIRTUAL */
18bd797fc1SAlberto Garcia static int64_t my_clock_value;
19bd797fc1SAlberto Garcia
cpu_get_clock(void)20bd797fc1SAlberto Garcia int64_t cpu_get_clock(void)
21bd797fc1SAlberto Garcia {
22bd797fc1SAlberto Garcia return my_clock_value;
23bd797fc1SAlberto Garcia }
24bd797fc1SAlberto Garcia
account(TimedAverage * ta)25bd797fc1SAlberto Garcia static void account(TimedAverage *ta)
26bd797fc1SAlberto Garcia {
27bd797fc1SAlberto Garcia timed_average_account(ta, 1);
28bd797fc1SAlberto Garcia timed_average_account(ta, 5);
29bd797fc1SAlberto Garcia timed_average_account(ta, 2);
30bd797fc1SAlberto Garcia timed_average_account(ta, 4);
31bd797fc1SAlberto Garcia timed_average_account(ta, 3);
32bd797fc1SAlberto Garcia }
33bd797fc1SAlberto Garcia
test_average(void)34bd797fc1SAlberto Garcia static void test_average(void)
35bd797fc1SAlberto Garcia {
36bd797fc1SAlberto Garcia TimedAverage ta;
37bd797fc1SAlberto Garcia uint64_t result;
38bd797fc1SAlberto Garcia int i;
39bd797fc1SAlberto Garcia
40bd797fc1SAlberto Garcia /* we will compute some average on a period of 1 second */
41bd797fc1SAlberto Garcia timed_average_init(&ta, QEMU_CLOCK_VIRTUAL, NANOSECONDS_PER_SECOND);
42bd797fc1SAlberto Garcia
43bd797fc1SAlberto Garcia result = timed_average_min(&ta);
44bd797fc1SAlberto Garcia g_assert(result == 0);
45bd797fc1SAlberto Garcia result = timed_average_avg(&ta);
46bd797fc1SAlberto Garcia g_assert(result == 0);
47bd797fc1SAlberto Garcia result = timed_average_max(&ta);
48bd797fc1SAlberto Garcia g_assert(result == 0);
49bd797fc1SAlberto Garcia
50bd797fc1SAlberto Garcia for (i = 0; i < 100; i++) {
51bd797fc1SAlberto Garcia account(&ta);
52bd797fc1SAlberto Garcia result = timed_average_min(&ta);
53bd797fc1SAlberto Garcia g_assert(result == 1);
54bd797fc1SAlberto Garcia result = timed_average_avg(&ta);
55bd797fc1SAlberto Garcia g_assert(result == 3);
56bd797fc1SAlberto Garcia result = timed_average_max(&ta);
57bd797fc1SAlberto Garcia g_assert(result == 5);
58bd797fc1SAlberto Garcia my_clock_value += NANOSECONDS_PER_SECOND / 10;
59bd797fc1SAlberto Garcia }
60bd797fc1SAlberto Garcia
61bd797fc1SAlberto Garcia my_clock_value += NANOSECONDS_PER_SECOND * 100;
62bd797fc1SAlberto Garcia
63bd797fc1SAlberto Garcia result = timed_average_min(&ta);
64bd797fc1SAlberto Garcia g_assert(result == 0);
65bd797fc1SAlberto Garcia result = timed_average_avg(&ta);
66bd797fc1SAlberto Garcia g_assert(result == 0);
67bd797fc1SAlberto Garcia result = timed_average_max(&ta);
68bd797fc1SAlberto Garcia g_assert(result == 0);
69bd797fc1SAlberto Garcia
70bd797fc1SAlberto Garcia for (i = 0; i < 100; i++) {
71bd797fc1SAlberto Garcia account(&ta);
72bd797fc1SAlberto Garcia result = timed_average_min(&ta);
73bd797fc1SAlberto Garcia g_assert(result == 1);
74bd797fc1SAlberto Garcia result = timed_average_avg(&ta);
75bd797fc1SAlberto Garcia g_assert(result == 3);
76bd797fc1SAlberto Garcia result = timed_average_max(&ta);
77bd797fc1SAlberto Garcia g_assert(result == 5);
78bd797fc1SAlberto Garcia my_clock_value += NANOSECONDS_PER_SECOND / 10;
79bd797fc1SAlberto Garcia }
80bd797fc1SAlberto Garcia }
81bd797fc1SAlberto Garcia
main(int argc,char ** argv)82bd797fc1SAlberto Garcia int main(int argc, char **argv)
83bd797fc1SAlberto Garcia {
84bd797fc1SAlberto Garcia /* tests in the same order as the header function declarations */
85bd797fc1SAlberto Garcia g_test_init(&argc, &argv, NULL);
86bd797fc1SAlberto Garcia g_test_add_func("/timed-average/average", test_average);
87bd797fc1SAlberto Garcia return g_test_run();
88bd797fc1SAlberto Garcia }
89bd797fc1SAlberto Garcia
90