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