xref: /qemu/tests/unit/test-timed-average.c (revision 681c28a33e305923a717815808056d2d5a89c8f9)
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 
13*681c28a3SPeter Maydell #include "qemu/osdep.h"
14bd797fc1SAlberto Garcia #include <glib.h>
15bd797fc1SAlberto Garcia 
16bd797fc1SAlberto Garcia #include "qemu/timed-average.h"
17bd797fc1SAlberto Garcia 
18bd797fc1SAlberto Garcia /* This is the clock for QEMU_CLOCK_VIRTUAL */
19bd797fc1SAlberto Garcia static int64_t my_clock_value;
20bd797fc1SAlberto Garcia 
21bd797fc1SAlberto Garcia int64_t cpu_get_clock(void)
22bd797fc1SAlberto Garcia {
23bd797fc1SAlberto Garcia     return my_clock_value;
24bd797fc1SAlberto Garcia }
25bd797fc1SAlberto Garcia 
26bd797fc1SAlberto Garcia static void account(TimedAverage *ta)
27bd797fc1SAlberto Garcia {
28bd797fc1SAlberto Garcia     timed_average_account(ta, 1);
29bd797fc1SAlberto Garcia     timed_average_account(ta, 5);
30bd797fc1SAlberto Garcia     timed_average_account(ta, 2);
31bd797fc1SAlberto Garcia     timed_average_account(ta, 4);
32bd797fc1SAlberto Garcia     timed_average_account(ta, 3);
33bd797fc1SAlberto Garcia }
34bd797fc1SAlberto Garcia 
35bd797fc1SAlberto Garcia static void test_average(void)
36bd797fc1SAlberto Garcia {
37bd797fc1SAlberto Garcia     TimedAverage ta;
38bd797fc1SAlberto Garcia     uint64_t result;
39bd797fc1SAlberto Garcia     int i;
40bd797fc1SAlberto Garcia 
41bd797fc1SAlberto Garcia     /* we will compute some average on a period of 1 second */
42bd797fc1SAlberto Garcia     timed_average_init(&ta, QEMU_CLOCK_VIRTUAL, NANOSECONDS_PER_SECOND);
43bd797fc1SAlberto Garcia 
44bd797fc1SAlberto Garcia     result = timed_average_min(&ta);
45bd797fc1SAlberto Garcia     g_assert(result == 0);
46bd797fc1SAlberto Garcia     result = timed_average_avg(&ta);
47bd797fc1SAlberto Garcia     g_assert(result == 0);
48bd797fc1SAlberto Garcia     result = timed_average_max(&ta);
49bd797fc1SAlberto Garcia     g_assert(result == 0);
50bd797fc1SAlberto Garcia 
51bd797fc1SAlberto Garcia     for (i = 0; i < 100; i++) {
52bd797fc1SAlberto Garcia         account(&ta);
53bd797fc1SAlberto Garcia         result = timed_average_min(&ta);
54bd797fc1SAlberto Garcia         g_assert(result == 1);
55bd797fc1SAlberto Garcia         result = timed_average_avg(&ta);
56bd797fc1SAlberto Garcia         g_assert(result == 3);
57bd797fc1SAlberto Garcia         result = timed_average_max(&ta);
58bd797fc1SAlberto Garcia         g_assert(result == 5);
59bd797fc1SAlberto Garcia         my_clock_value += NANOSECONDS_PER_SECOND / 10;
60bd797fc1SAlberto Garcia     }
61bd797fc1SAlberto Garcia 
62bd797fc1SAlberto Garcia     my_clock_value += NANOSECONDS_PER_SECOND * 100;
63bd797fc1SAlberto Garcia 
64bd797fc1SAlberto Garcia     result = timed_average_min(&ta);
65bd797fc1SAlberto Garcia     g_assert(result == 0);
66bd797fc1SAlberto Garcia     result = timed_average_avg(&ta);
67bd797fc1SAlberto Garcia     g_assert(result == 0);
68bd797fc1SAlberto Garcia     result = timed_average_max(&ta);
69bd797fc1SAlberto Garcia     g_assert(result == 0);
70bd797fc1SAlberto Garcia 
71bd797fc1SAlberto Garcia     for (i = 0; i < 100; i++) {
72bd797fc1SAlberto Garcia         account(&ta);
73bd797fc1SAlberto Garcia         result = timed_average_min(&ta);
74bd797fc1SAlberto Garcia         g_assert(result == 1);
75bd797fc1SAlberto Garcia         result = timed_average_avg(&ta);
76bd797fc1SAlberto Garcia         g_assert(result == 3);
77bd797fc1SAlberto Garcia         result = timed_average_max(&ta);
78bd797fc1SAlberto Garcia         g_assert(result == 5);
79bd797fc1SAlberto Garcia         my_clock_value += NANOSECONDS_PER_SECOND / 10;
80bd797fc1SAlberto Garcia     }
81bd797fc1SAlberto Garcia }
82bd797fc1SAlberto Garcia 
83bd797fc1SAlberto Garcia int main(int argc, char **argv)
84bd797fc1SAlberto Garcia {
85bd797fc1SAlberto Garcia     /* tests in the same order as the header function declarations */
86bd797fc1SAlberto Garcia     g_test_init(&argc, &argv, NULL);
87bd797fc1SAlberto Garcia     g_test_add_func("/timed-average/average", test_average);
88bd797fc1SAlberto Garcia     return g_test_run();
89bd797fc1SAlberto Garcia }
90bd797fc1SAlberto Garcia 
91