xref: /qemu/tests/unit/test-timed-average.c (revision 32cad1ffb81dcecf6f4a8af56d6e5892682839b1)
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