xref: /qemu/tests/unit/ptimer-test.c (revision 516deb421afc6e4f6073d0de3f33867235eef3fd)
15b262bb6SDmitry Osipenko /*
25b262bb6SDmitry Osipenko  * QTest testcase for the ptimer
35b262bb6SDmitry Osipenko  *
45b262bb6SDmitry Osipenko  * Author: Dmitry Osipenko <digetx@gmail.com>
55b262bb6SDmitry Osipenko  *
65b262bb6SDmitry Osipenko  * This work is licensed under the terms of the GNU GPL, version 2 or later.
75b262bb6SDmitry Osipenko  * See the COPYING file in the top-level directory.
85b262bb6SDmitry Osipenko  *
95b262bb6SDmitry Osipenko  */
105b262bb6SDmitry Osipenko 
115b262bb6SDmitry Osipenko #include <glib/gprintf.h>
125b262bb6SDmitry Osipenko 
135b262bb6SDmitry Osipenko #include "qemu/osdep.h"
145b262bb6SDmitry Osipenko #include "qemu/main-loop.h"
155b262bb6SDmitry Osipenko #include "hw/ptimer.h"
165b262bb6SDmitry Osipenko 
175b262bb6SDmitry Osipenko #include "libqtest.h"
185b262bb6SDmitry Osipenko #include "ptimer-test.h"
195b262bb6SDmitry Osipenko 
205b262bb6SDmitry Osipenko static bool triggered;
215b262bb6SDmitry Osipenko 
225b262bb6SDmitry Osipenko static void ptimer_trigger(void *opaque)
235b262bb6SDmitry Osipenko {
245b262bb6SDmitry Osipenko     triggered = true;
255b262bb6SDmitry Osipenko }
265b262bb6SDmitry Osipenko 
275b262bb6SDmitry Osipenko static void ptimer_test_expire_qemu_timers(int64_t expire_time,
285b262bb6SDmitry Osipenko                                            QEMUClockType type)
295b262bb6SDmitry Osipenko {
305b262bb6SDmitry Osipenko     QEMUTimerList *timer_list = main_loop_tlg.tl[type];
315b262bb6SDmitry Osipenko     QEMUTimer *t = timer_list->active_timers.next;
325b262bb6SDmitry Osipenko 
335b262bb6SDmitry Osipenko     while (t != NULL) {
345b262bb6SDmitry Osipenko         if (t->expire_time == expire_time) {
355b262bb6SDmitry Osipenko             timer_del(t);
365b262bb6SDmitry Osipenko 
375b262bb6SDmitry Osipenko             if (t->cb != NULL) {
385b262bb6SDmitry Osipenko                 t->cb(t->opaque);
395b262bb6SDmitry Osipenko             }
405b262bb6SDmitry Osipenko         }
415b262bb6SDmitry Osipenko 
425b262bb6SDmitry Osipenko         t = t->next;
435b262bb6SDmitry Osipenko     }
445b262bb6SDmitry Osipenko }
455b262bb6SDmitry Osipenko 
465b262bb6SDmitry Osipenko static void ptimer_test_set_qemu_time_ns(int64_t ns)
475b262bb6SDmitry Osipenko {
485b262bb6SDmitry Osipenko     ptimer_test_time_ns = ns;
495b262bb6SDmitry Osipenko }
505b262bb6SDmitry Osipenko 
515b262bb6SDmitry Osipenko static void qemu_clock_step(uint64_t ns)
525b262bb6SDmitry Osipenko {
535b262bb6SDmitry Osipenko     int64_t deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
545b262bb6SDmitry Osipenko     int64_t advanced_time = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + ns;
555b262bb6SDmitry Osipenko 
565b262bb6SDmitry Osipenko     while (deadline != -1 && deadline <= advanced_time) {
575b262bb6SDmitry Osipenko         ptimer_test_set_qemu_time_ns(deadline);
585b262bb6SDmitry Osipenko         ptimer_test_expire_qemu_timers(deadline, QEMU_CLOCK_VIRTUAL);
595b262bb6SDmitry Osipenko         deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
605b262bb6SDmitry Osipenko     }
615b262bb6SDmitry Osipenko 
625b262bb6SDmitry Osipenko     ptimer_test_set_qemu_time_ns(advanced_time);
635b262bb6SDmitry Osipenko }
645b262bb6SDmitry Osipenko 
655b262bb6SDmitry Osipenko static void check_set_count(gconstpointer arg)
665b262bb6SDmitry Osipenko {
675b262bb6SDmitry Osipenko     const uint8_t *policy = arg;
685b262bb6SDmitry Osipenko     QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL);
695b262bb6SDmitry Osipenko     ptimer_state *ptimer = ptimer_init(bh, *policy);
705b262bb6SDmitry Osipenko 
715b262bb6SDmitry Osipenko     triggered = false;
725b262bb6SDmitry Osipenko 
735b262bb6SDmitry Osipenko     ptimer_set_count(ptimer, 1000);
745b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 1000);
755b262bb6SDmitry Osipenko     g_assert_false(triggered);
765b262bb6SDmitry Osipenko }
775b262bb6SDmitry Osipenko 
785b262bb6SDmitry Osipenko static void check_set_limit(gconstpointer arg)
795b262bb6SDmitry Osipenko {
805b262bb6SDmitry Osipenko     const uint8_t *policy = arg;
815b262bb6SDmitry Osipenko     QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL);
825b262bb6SDmitry Osipenko     ptimer_state *ptimer = ptimer_init(bh, *policy);
835b262bb6SDmitry Osipenko 
845b262bb6SDmitry Osipenko     triggered = false;
855b262bb6SDmitry Osipenko 
865b262bb6SDmitry Osipenko     ptimer_set_limit(ptimer, 1000, 0);
875b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
885b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_limit(ptimer), ==, 1000);
895b262bb6SDmitry Osipenko     g_assert_false(triggered);
905b262bb6SDmitry Osipenko 
915b262bb6SDmitry Osipenko     ptimer_set_limit(ptimer, 2000, 1);
925b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 2000);
935b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_limit(ptimer), ==, 2000);
945b262bb6SDmitry Osipenko     g_assert_false(triggered);
955b262bb6SDmitry Osipenko }
965b262bb6SDmitry Osipenko 
975b262bb6SDmitry Osipenko static void check_oneshot(gconstpointer arg)
985b262bb6SDmitry Osipenko {
995b262bb6SDmitry Osipenko     const uint8_t *policy = arg;
1005b262bb6SDmitry Osipenko     QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL);
1015b262bb6SDmitry Osipenko     ptimer_state *ptimer = ptimer_init(bh, *policy);
1025b262bb6SDmitry Osipenko 
1035b262bb6SDmitry Osipenko     triggered = false;
1045b262bb6SDmitry Osipenko 
1055b262bb6SDmitry Osipenko     ptimer_set_period(ptimer, 2000000);
1065b262bb6SDmitry Osipenko     ptimer_set_count(ptimer, 10);
1075b262bb6SDmitry Osipenko     ptimer_run(ptimer, 1);
1085b262bb6SDmitry Osipenko 
1095b262bb6SDmitry Osipenko     qemu_clock_step(2000000 * 2 + 100000);
1105b262bb6SDmitry Osipenko 
1115b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 7);
1125b262bb6SDmitry Osipenko     g_assert_false(triggered);
1135b262bb6SDmitry Osipenko 
1145b262bb6SDmitry Osipenko     ptimer_stop(ptimer);
1155b262bb6SDmitry Osipenko 
1165b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 7);
1175b262bb6SDmitry Osipenko     g_assert_false(triggered);
1185b262bb6SDmitry Osipenko 
1195b262bb6SDmitry Osipenko     qemu_clock_step(2000000 * 11);
1205b262bb6SDmitry Osipenko 
1215b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 7);
1225b262bb6SDmitry Osipenko     g_assert_false(triggered);
1235b262bb6SDmitry Osipenko 
1245b262bb6SDmitry Osipenko     ptimer_run(ptimer, 1);
1255b262bb6SDmitry Osipenko 
1265b262bb6SDmitry Osipenko     qemu_clock_step(2000000 * 7 + 100000);
1275b262bb6SDmitry Osipenko 
1285b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
1295b262bb6SDmitry Osipenko     g_assert_true(triggered);
1305b262bb6SDmitry Osipenko 
1315b262bb6SDmitry Osipenko     triggered = false;
1325b262bb6SDmitry Osipenko 
1335b262bb6SDmitry Osipenko     qemu_clock_step(2000000);
1345b262bb6SDmitry Osipenko 
1355b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
1365b262bb6SDmitry Osipenko     g_assert_false(triggered);
1375b262bb6SDmitry Osipenko 
1385b262bb6SDmitry Osipenko     qemu_clock_step(4000000);
1395b262bb6SDmitry Osipenko 
1405b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
1415b262bb6SDmitry Osipenko     g_assert_false(triggered);
1425b262bb6SDmitry Osipenko 
1435b262bb6SDmitry Osipenko     ptimer_set_count(ptimer, 10);
1445b262bb6SDmitry Osipenko 
1455b262bb6SDmitry Osipenko     qemu_clock_step(20000000 + 100000);
1465b262bb6SDmitry Osipenko 
1475b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 10);
1485b262bb6SDmitry Osipenko     g_assert_false(triggered);
1495b262bb6SDmitry Osipenko 
1505b262bb6SDmitry Osipenko     ptimer_set_limit(ptimer, 9, 1);
1515b262bb6SDmitry Osipenko 
1525b262bb6SDmitry Osipenko     qemu_clock_step(20000000 + 100000);
1535b262bb6SDmitry Osipenko 
1545b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 9);
1555b262bb6SDmitry Osipenko     g_assert_false(triggered);
1565b262bb6SDmitry Osipenko 
1575b262bb6SDmitry Osipenko     ptimer_run(ptimer, 1);
1585b262bb6SDmitry Osipenko 
1595b262bb6SDmitry Osipenko     qemu_clock_step(2000000 + 100000);
1605b262bb6SDmitry Osipenko 
1615b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 7);
1625b262bb6SDmitry Osipenko     g_assert_false(triggered);
1635b262bb6SDmitry Osipenko 
1645b262bb6SDmitry Osipenko     ptimer_set_count(ptimer, 20);
1655b262bb6SDmitry Osipenko 
1665b262bb6SDmitry Osipenko     qemu_clock_step(2000000 * 19 + 100000);
1675b262bb6SDmitry Osipenko 
1685b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
1695b262bb6SDmitry Osipenko     g_assert_false(triggered);
1705b262bb6SDmitry Osipenko 
1715b262bb6SDmitry Osipenko     qemu_clock_step(2000000);
1725b262bb6SDmitry Osipenko 
1735b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
1745b262bb6SDmitry Osipenko     g_assert_true(triggered);
1755b262bb6SDmitry Osipenko 
1765b262bb6SDmitry Osipenko     ptimer_stop(ptimer);
1775b262bb6SDmitry Osipenko 
1785b262bb6SDmitry Osipenko     triggered = false;
1795b262bb6SDmitry Osipenko 
1805b262bb6SDmitry Osipenko     qemu_clock_step(2000000 * 12 + 100000);
1815b262bb6SDmitry Osipenko 
1825b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
1835b262bb6SDmitry Osipenko     g_assert_false(triggered);
1845b262bb6SDmitry Osipenko }
1855b262bb6SDmitry Osipenko 
1865b262bb6SDmitry Osipenko static void check_periodic(gconstpointer arg)
1875b262bb6SDmitry Osipenko {
1885b262bb6SDmitry Osipenko     const uint8_t *policy = arg;
1895b262bb6SDmitry Osipenko     QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL);
1905b262bb6SDmitry Osipenko     ptimer_state *ptimer = ptimer_init(bh, *policy);
191293130aaSDmitry Osipenko     bool wrap_policy = (*policy & PTIMER_POLICY_WRAP_AFTER_ONE_PERIOD);
192*516deb42SDmitry Osipenko     bool no_immediate_trigger = (*policy & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER);
1935b262bb6SDmitry Osipenko 
1945b262bb6SDmitry Osipenko     triggered = false;
1955b262bb6SDmitry Osipenko 
1965b262bb6SDmitry Osipenko     ptimer_set_period(ptimer, 2000000);
1975b262bb6SDmitry Osipenko     ptimer_set_limit(ptimer, 10, 1);
1985b262bb6SDmitry Osipenko     ptimer_run(ptimer, 0);
1995b262bb6SDmitry Osipenko 
200293130aaSDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 10);
201293130aaSDmitry Osipenko     g_assert_false(triggered);
202293130aaSDmitry Osipenko 
203293130aaSDmitry Osipenko     qemu_clock_step(100000);
2045b262bb6SDmitry Osipenko 
2055b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 9);
206293130aaSDmitry Osipenko     g_assert_false(triggered);
207293130aaSDmitry Osipenko 
208293130aaSDmitry Osipenko     qemu_clock_step(2000000 * 10 - 100000);
209293130aaSDmitry Osipenko 
210293130aaSDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, wrap_policy ? 0 : 10);
211293130aaSDmitry Osipenko     g_assert_true(triggered);
212293130aaSDmitry Osipenko 
213293130aaSDmitry Osipenko     qemu_clock_step(100000);
214293130aaSDmitry Osipenko 
215293130aaSDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, wrap_policy ? 0 : 9);
2165b262bb6SDmitry Osipenko     g_assert_true(triggered);
2175b262bb6SDmitry Osipenko 
2185b262bb6SDmitry Osipenko     triggered = false;
2195b262bb6SDmitry Osipenko 
2205b262bb6SDmitry Osipenko     qemu_clock_step(2000000);
2215b262bb6SDmitry Osipenko 
222293130aaSDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, wrap_policy ? 9 : 8);
2235b262bb6SDmitry Osipenko     g_assert_false(triggered);
2245b262bb6SDmitry Osipenko 
2255b262bb6SDmitry Osipenko     ptimer_set_count(ptimer, 20);
2265b262bb6SDmitry Osipenko 
227293130aaSDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 20);
228293130aaSDmitry Osipenko     g_assert_false(triggered);
229293130aaSDmitry Osipenko 
230293130aaSDmitry Osipenko     qemu_clock_step(100000);
231293130aaSDmitry Osipenko 
232293130aaSDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 19);
233293130aaSDmitry Osipenko     g_assert_false(triggered);
234293130aaSDmitry Osipenko 
2355b262bb6SDmitry Osipenko     qemu_clock_step(2000000 * 11 + 100000);
2365b262bb6SDmitry Osipenko 
2375b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 8);
2385b262bb6SDmitry Osipenko     g_assert_false(triggered);
2395b262bb6SDmitry Osipenko 
2405b262bb6SDmitry Osipenko     qemu_clock_step(2000000 * 10);
2415b262bb6SDmitry Osipenko 
242293130aaSDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, wrap_policy ? 9 : 8);
243293130aaSDmitry Osipenko     g_assert_true(triggered);
244293130aaSDmitry Osipenko 
245293130aaSDmitry Osipenko     triggered = false;
246293130aaSDmitry Osipenko 
247293130aaSDmitry Osipenko     ptimer_set_count(ptimer, 3);
248293130aaSDmitry Osipenko 
249293130aaSDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 3);
250293130aaSDmitry Osipenko     g_assert_false(triggered);
251293130aaSDmitry Osipenko 
252293130aaSDmitry Osipenko     qemu_clock_step(100000);
253293130aaSDmitry Osipenko 
254293130aaSDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 2);
255293130aaSDmitry Osipenko     g_assert_false(triggered);
256293130aaSDmitry Osipenko 
257293130aaSDmitry Osipenko     qemu_clock_step(2000000 * 4);
258293130aaSDmitry Osipenko 
259293130aaSDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, wrap_policy ? 9 : 8);
2605b262bb6SDmitry Osipenko     g_assert_true(triggered);
2615b262bb6SDmitry Osipenko 
2625b262bb6SDmitry Osipenko     ptimer_stop(ptimer);
2635b262bb6SDmitry Osipenko     triggered = false;
2645b262bb6SDmitry Osipenko 
2655b262bb6SDmitry Osipenko     qemu_clock_step(2000000);
2665b262bb6SDmitry Osipenko 
267293130aaSDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, wrap_policy ? 9 : 8);
2685b262bb6SDmitry Osipenko     g_assert_false(triggered);
2695b262bb6SDmitry Osipenko 
2705b262bb6SDmitry Osipenko     ptimer_set_count(ptimer, 3);
2715b262bb6SDmitry Osipenko     ptimer_run(ptimer, 0);
2725b262bb6SDmitry Osipenko 
2735b262bb6SDmitry Osipenko     qemu_clock_step(2000000 * 3 + 100000);
2745b262bb6SDmitry Osipenko 
275293130aaSDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, wrap_policy ? 0 : 9);
2765b262bb6SDmitry Osipenko     g_assert_true(triggered);
2775b262bb6SDmitry Osipenko 
2785b262bb6SDmitry Osipenko     triggered = false;
2795b262bb6SDmitry Osipenko 
2805b262bb6SDmitry Osipenko     qemu_clock_step(2000000);
2815b262bb6SDmitry Osipenko 
282293130aaSDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, wrap_policy ? 9 : 8);
2835b262bb6SDmitry Osipenko     g_assert_false(triggered);
2845b262bb6SDmitry Osipenko 
2855b262bb6SDmitry Osipenko     ptimer_set_count(ptimer, 0);
2865b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 10);
287*516deb42SDmitry Osipenko 
288*516deb42SDmitry Osipenko     if (no_immediate_trigger) {
289*516deb42SDmitry Osipenko         g_assert_false(triggered);
290*516deb42SDmitry Osipenko     } else {
2915b262bb6SDmitry Osipenko         g_assert_true(triggered);
292*516deb42SDmitry Osipenko     }
2935b262bb6SDmitry Osipenko 
2945b262bb6SDmitry Osipenko     triggered = false;
2955b262bb6SDmitry Osipenko 
296293130aaSDmitry Osipenko     qemu_clock_step(100000);
2975b262bb6SDmitry Osipenko 
298293130aaSDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 9);
299293130aaSDmitry Osipenko     g_assert_false(triggered);
300293130aaSDmitry Osipenko 
301293130aaSDmitry Osipenko     qemu_clock_step(2000000 * 12);
302293130aaSDmitry Osipenko 
303293130aaSDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, wrap_policy ? 8 : 7);
3045b262bb6SDmitry Osipenko     g_assert_true(triggered);
3055b262bb6SDmitry Osipenko 
3065b262bb6SDmitry Osipenko     ptimer_stop(ptimer);
3075b262bb6SDmitry Osipenko 
3085b262bb6SDmitry Osipenko     triggered = false;
3095b262bb6SDmitry Osipenko 
310293130aaSDmitry Osipenko     qemu_clock_step(2000000 * 10);
3115b262bb6SDmitry Osipenko 
312293130aaSDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, wrap_policy ? 8 : 7);
3135b262bb6SDmitry Osipenko     g_assert_false(triggered);
3145b262bb6SDmitry Osipenko 
3155b262bb6SDmitry Osipenko     ptimer_run(ptimer, 0);
3165b262bb6SDmitry Osipenko     ptimer_set_period(ptimer, 0);
3175b262bb6SDmitry Osipenko 
3185b262bb6SDmitry Osipenko     qemu_clock_step(2000000 + 100000);
3195b262bb6SDmitry Osipenko 
320293130aaSDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, wrap_policy ? 8 : 7);
3215b262bb6SDmitry Osipenko     g_assert_false(triggered);
3225b262bb6SDmitry Osipenko }
3235b262bb6SDmitry Osipenko 
3245b262bb6SDmitry Osipenko static void check_on_the_fly_mode_change(gconstpointer arg)
3255b262bb6SDmitry Osipenko {
3265b262bb6SDmitry Osipenko     const uint8_t *policy = arg;
3275b262bb6SDmitry Osipenko     QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL);
3285b262bb6SDmitry Osipenko     ptimer_state *ptimer = ptimer_init(bh, *policy);
329293130aaSDmitry Osipenko     bool wrap_policy = (*policy & PTIMER_POLICY_WRAP_AFTER_ONE_PERIOD);
3305b262bb6SDmitry Osipenko 
3315b262bb6SDmitry Osipenko     triggered = false;
3325b262bb6SDmitry Osipenko 
3335b262bb6SDmitry Osipenko     ptimer_set_period(ptimer, 2000000);
3345b262bb6SDmitry Osipenko     ptimer_set_limit(ptimer, 10, 1);
3355b262bb6SDmitry Osipenko     ptimer_run(ptimer, 1);
3365b262bb6SDmitry Osipenko 
3375b262bb6SDmitry Osipenko     qemu_clock_step(2000000 * 9 + 100000);
3385b262bb6SDmitry Osipenko 
339293130aaSDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
340293130aaSDmitry Osipenko     g_assert_false(triggered);
341293130aaSDmitry Osipenko 
3425b262bb6SDmitry Osipenko     ptimer_run(ptimer, 0);
3435b262bb6SDmitry Osipenko 
3445b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
3455b262bb6SDmitry Osipenko     g_assert_false(triggered);
3465b262bb6SDmitry Osipenko 
3475b262bb6SDmitry Osipenko     qemu_clock_step(2000000);
3485b262bb6SDmitry Osipenko 
349293130aaSDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, wrap_policy ? 0 : 9);
3505b262bb6SDmitry Osipenko     g_assert_true(triggered);
3515b262bb6SDmitry Osipenko 
3525b262bb6SDmitry Osipenko     triggered = false;
3535b262bb6SDmitry Osipenko 
3545b262bb6SDmitry Osipenko     qemu_clock_step(2000000 * 9);
3555b262bb6SDmitry Osipenko 
3565b262bb6SDmitry Osipenko     ptimer_run(ptimer, 1);
3575b262bb6SDmitry Osipenko 
358293130aaSDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, wrap_policy ? 1 : 0);
3595b262bb6SDmitry Osipenko     g_assert_false(triggered);
3605b262bb6SDmitry Osipenko 
3615b262bb6SDmitry Osipenko     qemu_clock_step(2000000 * 3);
3625b262bb6SDmitry Osipenko 
3635b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
3645b262bb6SDmitry Osipenko     g_assert_true(triggered);
3655b262bb6SDmitry Osipenko }
3665b262bb6SDmitry Osipenko 
3675b262bb6SDmitry Osipenko static void check_on_the_fly_period_change(gconstpointer arg)
3685b262bb6SDmitry Osipenko {
3695b262bb6SDmitry Osipenko     const uint8_t *policy = arg;
3705b262bb6SDmitry Osipenko     QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL);
3715b262bb6SDmitry Osipenko     ptimer_state *ptimer = ptimer_init(bh, *policy);
3725b262bb6SDmitry Osipenko 
3735b262bb6SDmitry Osipenko     triggered = false;
3745b262bb6SDmitry Osipenko 
3755b262bb6SDmitry Osipenko     ptimer_set_period(ptimer, 2000000);
3765b262bb6SDmitry Osipenko     ptimer_set_limit(ptimer, 8, 1);
3775b262bb6SDmitry Osipenko     ptimer_run(ptimer, 1);
3785b262bb6SDmitry Osipenko 
3795b262bb6SDmitry Osipenko     qemu_clock_step(2000000 * 4 + 100000);
3805b262bb6SDmitry Osipenko 
3815b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 3);
3825b262bb6SDmitry Osipenko     g_assert_false(triggered);
3835b262bb6SDmitry Osipenko 
3845b262bb6SDmitry Osipenko     ptimer_set_period(ptimer, 4000000);
3855b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 3);
3865b262bb6SDmitry Osipenko 
3875b262bb6SDmitry Osipenko     qemu_clock_step(4000000 * 2 + 100000);
3885b262bb6SDmitry Osipenko 
3895b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
3905b262bb6SDmitry Osipenko     g_assert_false(triggered);
3915b262bb6SDmitry Osipenko 
3925b262bb6SDmitry Osipenko     qemu_clock_step(4000000 * 2);
3935b262bb6SDmitry Osipenko 
3945b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
3955b262bb6SDmitry Osipenko     g_assert_true(triggered);
3965b262bb6SDmitry Osipenko }
3975b262bb6SDmitry Osipenko 
3985b262bb6SDmitry Osipenko static void check_on_the_fly_freq_change(gconstpointer arg)
3995b262bb6SDmitry Osipenko {
4005b262bb6SDmitry Osipenko     const uint8_t *policy = arg;
4015b262bb6SDmitry Osipenko     QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL);
4025b262bb6SDmitry Osipenko     ptimer_state *ptimer = ptimer_init(bh, *policy);
4035b262bb6SDmitry Osipenko 
4045b262bb6SDmitry Osipenko     triggered = false;
4055b262bb6SDmitry Osipenko 
4065b262bb6SDmitry Osipenko     ptimer_set_freq(ptimer, 500);
4075b262bb6SDmitry Osipenko     ptimer_set_limit(ptimer, 8, 1);
4085b262bb6SDmitry Osipenko     ptimer_run(ptimer, 1);
4095b262bb6SDmitry Osipenko 
4105b262bb6SDmitry Osipenko     qemu_clock_step(2000000 * 4 + 100000);
4115b262bb6SDmitry Osipenko 
4125b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 3);
4135b262bb6SDmitry Osipenko     g_assert_false(triggered);
4145b262bb6SDmitry Osipenko 
4155b262bb6SDmitry Osipenko     ptimer_set_freq(ptimer, 250);
4165b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 3);
4175b262bb6SDmitry Osipenko 
4185b262bb6SDmitry Osipenko     qemu_clock_step(2000000 * 4 + 100000);
4195b262bb6SDmitry Osipenko 
4205b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
4215b262bb6SDmitry Osipenko     g_assert_false(triggered);
4225b262bb6SDmitry Osipenko 
4235b262bb6SDmitry Osipenko     qemu_clock_step(2000000 * 4);
4245b262bb6SDmitry Osipenko 
4255b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
4265b262bb6SDmitry Osipenko     g_assert_true(triggered);
4275b262bb6SDmitry Osipenko }
4285b262bb6SDmitry Osipenko 
4295b262bb6SDmitry Osipenko static void check_run_with_period_0(gconstpointer arg)
4305b262bb6SDmitry Osipenko {
4315b262bb6SDmitry Osipenko     const uint8_t *policy = arg;
4325b262bb6SDmitry Osipenko     QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL);
4335b262bb6SDmitry Osipenko     ptimer_state *ptimer = ptimer_init(bh, *policy);
4345b262bb6SDmitry Osipenko 
4355b262bb6SDmitry Osipenko     triggered = false;
4365b262bb6SDmitry Osipenko 
4375b262bb6SDmitry Osipenko     ptimer_set_count(ptimer, 99);
4385b262bb6SDmitry Osipenko     ptimer_run(ptimer, 1);
4395b262bb6SDmitry Osipenko 
4405b262bb6SDmitry Osipenko     qemu_clock_step(10 * NANOSECONDS_PER_SECOND);
4415b262bb6SDmitry Osipenko 
4425b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 99);
4435b262bb6SDmitry Osipenko     g_assert_false(triggered);
4445b262bb6SDmitry Osipenko }
4455b262bb6SDmitry Osipenko 
4465b262bb6SDmitry Osipenko static void check_run_with_delta_0(gconstpointer arg)
4475b262bb6SDmitry Osipenko {
4485b262bb6SDmitry Osipenko     const uint8_t *policy = arg;
4495b262bb6SDmitry Osipenko     QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL);
4505b262bb6SDmitry Osipenko     ptimer_state *ptimer = ptimer_init(bh, *policy);
451293130aaSDmitry Osipenko     bool wrap_policy = (*policy & PTIMER_POLICY_WRAP_AFTER_ONE_PERIOD);
452*516deb42SDmitry Osipenko     bool no_immediate_trigger = (*policy & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER);
4535b262bb6SDmitry Osipenko 
4545b262bb6SDmitry Osipenko     triggered = false;
4555b262bb6SDmitry Osipenko 
4565b262bb6SDmitry Osipenko     ptimer_set_period(ptimer, 2000000);
4575b262bb6SDmitry Osipenko     ptimer_set_limit(ptimer, 99, 0);
4585b262bb6SDmitry Osipenko     ptimer_run(ptimer, 1);
4595b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 99);
460*516deb42SDmitry Osipenko 
461*516deb42SDmitry Osipenko     if (no_immediate_trigger) {
462*516deb42SDmitry Osipenko         g_assert_false(triggered);
463*516deb42SDmitry Osipenko     } else {
4645b262bb6SDmitry Osipenko         g_assert_true(triggered);
465*516deb42SDmitry Osipenko     }
4665b262bb6SDmitry Osipenko 
4675b262bb6SDmitry Osipenko     triggered = false;
4685b262bb6SDmitry Osipenko 
469*516deb42SDmitry Osipenko     if (no_immediate_trigger) {
470*516deb42SDmitry Osipenko         qemu_clock_step(2000000 + 100000);
471*516deb42SDmitry Osipenko 
472*516deb42SDmitry Osipenko         g_assert_cmpuint(ptimer_get_count(ptimer), ==, 97);
473*516deb42SDmitry Osipenko         g_assert_false(triggered);
474*516deb42SDmitry Osipenko 
475*516deb42SDmitry Osipenko         ptimer_set_count(ptimer, 99);
476*516deb42SDmitry Osipenko         ptimer_run(ptimer, 1);
477*516deb42SDmitry Osipenko     }
478*516deb42SDmitry Osipenko 
4795b262bb6SDmitry Osipenko     qemu_clock_step(2000000 + 100000);
4805b262bb6SDmitry Osipenko 
4815b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 97);
4825b262bb6SDmitry Osipenko     g_assert_false(triggered);
4835b262bb6SDmitry Osipenko 
4845b262bb6SDmitry Osipenko     qemu_clock_step(2000000 * 97);
4855b262bb6SDmitry Osipenko 
4865b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
4875b262bb6SDmitry Osipenko     g_assert_false(triggered);
4885b262bb6SDmitry Osipenko 
4895b262bb6SDmitry Osipenko     qemu_clock_step(2000000 * 2);
4905b262bb6SDmitry Osipenko 
4915b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
4925b262bb6SDmitry Osipenko     g_assert_true(triggered);
4935b262bb6SDmitry Osipenko 
4945b262bb6SDmitry Osipenko     triggered = false;
4955b262bb6SDmitry Osipenko 
4965b262bb6SDmitry Osipenko     ptimer_set_count(ptimer, 0);
4975b262bb6SDmitry Osipenko     ptimer_run(ptimer, 0);
4985b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 99);
499*516deb42SDmitry Osipenko 
500*516deb42SDmitry Osipenko     if (no_immediate_trigger) {
501*516deb42SDmitry Osipenko         g_assert_false(triggered);
502*516deb42SDmitry Osipenko     } else {
5035b262bb6SDmitry Osipenko         g_assert_true(triggered);
504*516deb42SDmitry Osipenko     }
5055b262bb6SDmitry Osipenko 
5065b262bb6SDmitry Osipenko     triggered = false;
5075b262bb6SDmitry Osipenko 
508293130aaSDmitry Osipenko     qemu_clock_step(100000);
509293130aaSDmitry Osipenko 
510293130aaSDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 98);
511293130aaSDmitry Osipenko     g_assert_false(triggered);
512293130aaSDmitry Osipenko 
513293130aaSDmitry Osipenko     triggered = false;
514293130aaSDmitry Osipenko 
515293130aaSDmitry Osipenko     qemu_clock_step(2000000);
5165b262bb6SDmitry Osipenko 
5175b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 97);
5185b262bb6SDmitry Osipenko     g_assert_false(triggered);
5195b262bb6SDmitry Osipenko 
5205b262bb6SDmitry Osipenko     qemu_clock_step(2000000 * 98);
5215b262bb6SDmitry Osipenko 
522293130aaSDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, wrap_policy ? 0 : 98);
5235b262bb6SDmitry Osipenko     g_assert_true(triggered);
5245b262bb6SDmitry Osipenko 
5255b262bb6SDmitry Osipenko     ptimer_stop(ptimer);
5265b262bb6SDmitry Osipenko }
5275b262bb6SDmitry Osipenko 
5285b262bb6SDmitry Osipenko static void check_periodic_with_load_0(gconstpointer arg)
5295b262bb6SDmitry Osipenko {
5305b262bb6SDmitry Osipenko     const uint8_t *policy = arg;
5315b262bb6SDmitry Osipenko     QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL);
5325b262bb6SDmitry Osipenko     ptimer_state *ptimer = ptimer_init(bh, *policy);
5332e74583bSDmitry Osipenko     bool continuous_trigger = (*policy & PTIMER_POLICY_CONTINUOUS_TRIGGER);
534*516deb42SDmitry Osipenko     bool no_immediate_trigger = (*policy & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER);
5355b262bb6SDmitry Osipenko 
5365b262bb6SDmitry Osipenko     triggered = false;
5375b262bb6SDmitry Osipenko 
5385b262bb6SDmitry Osipenko     ptimer_set_period(ptimer, 2000000);
5395b262bb6SDmitry Osipenko     ptimer_run(ptimer, 0);
5405b262bb6SDmitry Osipenko 
5415b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
542*516deb42SDmitry Osipenko 
543*516deb42SDmitry Osipenko     if (no_immediate_trigger) {
544*516deb42SDmitry Osipenko         g_assert_false(triggered);
545*516deb42SDmitry Osipenko     } else {
5465b262bb6SDmitry Osipenko         g_assert_true(triggered);
547*516deb42SDmitry Osipenko     }
5485b262bb6SDmitry Osipenko 
5495b262bb6SDmitry Osipenko     triggered = false;
5505b262bb6SDmitry Osipenko 
5515b262bb6SDmitry Osipenko     qemu_clock_step(2000000 + 100000);
5525b262bb6SDmitry Osipenko 
5535b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
5542e74583bSDmitry Osipenko 
555*516deb42SDmitry Osipenko     if (continuous_trigger || no_immediate_trigger) {
5562e74583bSDmitry Osipenko         g_assert_true(triggered);
5572e74583bSDmitry Osipenko     } else {
5585b262bb6SDmitry Osipenko         g_assert_false(triggered);
5592e74583bSDmitry Osipenko     }
5605b262bb6SDmitry Osipenko 
561293130aaSDmitry Osipenko     triggered = false;
562293130aaSDmitry Osipenko 
563293130aaSDmitry Osipenko     ptimer_set_count(ptimer, 10);
564293130aaSDmitry Osipenko     ptimer_run(ptimer, 0);
565293130aaSDmitry Osipenko 
566293130aaSDmitry Osipenko     qemu_clock_step(2000000 * 10 + 100000);
567293130aaSDmitry Osipenko 
568293130aaSDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
569293130aaSDmitry Osipenko     g_assert_true(triggered);
570293130aaSDmitry Osipenko 
571293130aaSDmitry Osipenko     triggered = false;
572293130aaSDmitry Osipenko 
573293130aaSDmitry Osipenko     qemu_clock_step(2000000 + 100000);
574293130aaSDmitry Osipenko 
575293130aaSDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
5762e74583bSDmitry Osipenko 
5772e74583bSDmitry Osipenko     if (continuous_trigger) {
5782e74583bSDmitry Osipenko         g_assert_true(triggered);
5792e74583bSDmitry Osipenko     } else {
580293130aaSDmitry Osipenko         g_assert_false(triggered);
5812e74583bSDmitry Osipenko     }
582293130aaSDmitry Osipenko 
5835b262bb6SDmitry Osipenko     ptimer_stop(ptimer);
5845b262bb6SDmitry Osipenko }
5855b262bb6SDmitry Osipenko 
5865b262bb6SDmitry Osipenko static void check_oneshot_with_load_0(gconstpointer arg)
5875b262bb6SDmitry Osipenko {
5885b262bb6SDmitry Osipenko     const uint8_t *policy = arg;
5895b262bb6SDmitry Osipenko     QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL);
5905b262bb6SDmitry Osipenko     ptimer_state *ptimer = ptimer_init(bh, *policy);
591*516deb42SDmitry Osipenko     bool no_immediate_trigger = (*policy & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER);
5925b262bb6SDmitry Osipenko 
5935b262bb6SDmitry Osipenko     triggered = false;
5945b262bb6SDmitry Osipenko 
5955b262bb6SDmitry Osipenko     ptimer_set_period(ptimer, 2000000);
5965b262bb6SDmitry Osipenko     ptimer_run(ptimer, 1);
5975b262bb6SDmitry Osipenko 
5985b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
599*516deb42SDmitry Osipenko 
600*516deb42SDmitry Osipenko     if (no_immediate_trigger) {
601*516deb42SDmitry Osipenko         g_assert_false(triggered);
602*516deb42SDmitry Osipenko     } else {
6035b262bb6SDmitry Osipenko         g_assert_true(triggered);
604*516deb42SDmitry Osipenko     }
6055b262bb6SDmitry Osipenko 
6065b262bb6SDmitry Osipenko     triggered = false;
6075b262bb6SDmitry Osipenko 
6085b262bb6SDmitry Osipenko     qemu_clock_step(2000000 + 100000);
6095b262bb6SDmitry Osipenko 
6105b262bb6SDmitry Osipenko     g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
611*516deb42SDmitry Osipenko 
612*516deb42SDmitry Osipenko     if (no_immediate_trigger) {
613*516deb42SDmitry Osipenko         g_assert_true(triggered);
614*516deb42SDmitry Osipenko     } else {
6155b262bb6SDmitry Osipenko         g_assert_false(triggered);
6165b262bb6SDmitry Osipenko     }
617*516deb42SDmitry Osipenko }
6185b262bb6SDmitry Osipenko 
6195b262bb6SDmitry Osipenko static void add_ptimer_tests(uint8_t policy)
6205b262bb6SDmitry Osipenko {
6215b262bb6SDmitry Osipenko     uint8_t *ppolicy = g_malloc(1);
622293130aaSDmitry Osipenko     char *policy_name = g_malloc0(256);
6235b262bb6SDmitry Osipenko 
6245b262bb6SDmitry Osipenko     *ppolicy = policy;
6255b262bb6SDmitry Osipenko 
6265b262bb6SDmitry Osipenko     if (policy == PTIMER_POLICY_DEFAULT) {
6275b262bb6SDmitry Osipenko         g_sprintf(policy_name, "default");
6285b262bb6SDmitry Osipenko     }
6295b262bb6SDmitry Osipenko 
630293130aaSDmitry Osipenko     if (policy & PTIMER_POLICY_WRAP_AFTER_ONE_PERIOD) {
631293130aaSDmitry Osipenko         g_strlcat(policy_name, "wrap_after_one_period,", 256);
632293130aaSDmitry Osipenko     }
633293130aaSDmitry Osipenko 
6342e74583bSDmitry Osipenko     if (policy & PTIMER_POLICY_CONTINUOUS_TRIGGER) {
6352e74583bSDmitry Osipenko         g_strlcat(policy_name, "continuous_trigger,", 256);
6362e74583bSDmitry Osipenko     }
6372e74583bSDmitry Osipenko 
638*516deb42SDmitry Osipenko     if (policy & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER) {
639*516deb42SDmitry Osipenko         g_strlcat(policy_name, "no_immediate_trigger,", 256);
640*516deb42SDmitry Osipenko     }
641*516deb42SDmitry Osipenko 
64224b94625SPaolo Bonzini     g_test_add_data_func(
6435b262bb6SDmitry Osipenko         g_strdup_printf("/ptimer/set_count policy=%s", policy_name),
6445b262bb6SDmitry Osipenko         ppolicy, check_set_count);
6455b262bb6SDmitry Osipenko 
64624b94625SPaolo Bonzini     g_test_add_data_func(
6475b262bb6SDmitry Osipenko         g_strdup_printf("/ptimer/set_limit policy=%s", policy_name),
6485b262bb6SDmitry Osipenko         ppolicy, check_set_limit);
6495b262bb6SDmitry Osipenko 
65024b94625SPaolo Bonzini     g_test_add_data_func(
6515b262bb6SDmitry Osipenko         g_strdup_printf("/ptimer/oneshot policy=%s", policy_name),
6525b262bb6SDmitry Osipenko         ppolicy, check_oneshot);
6535b262bb6SDmitry Osipenko 
65424b94625SPaolo Bonzini     g_test_add_data_func(
6555b262bb6SDmitry Osipenko         g_strdup_printf("/ptimer/periodic policy=%s", policy_name),
6565b262bb6SDmitry Osipenko         ppolicy, check_periodic);
6575b262bb6SDmitry Osipenko 
65824b94625SPaolo Bonzini     g_test_add_data_func(
6595b262bb6SDmitry Osipenko         g_strdup_printf("/ptimer/on_the_fly_mode_change policy=%s", policy_name),
6605b262bb6SDmitry Osipenko         ppolicy, check_on_the_fly_mode_change);
6615b262bb6SDmitry Osipenko 
66224b94625SPaolo Bonzini     g_test_add_data_func(
6635b262bb6SDmitry Osipenko         g_strdup_printf("/ptimer/on_the_fly_period_change policy=%s", policy_name),
6645b262bb6SDmitry Osipenko         ppolicy, check_on_the_fly_period_change);
6655b262bb6SDmitry Osipenko 
66624b94625SPaolo Bonzini     g_test_add_data_func(
6675b262bb6SDmitry Osipenko         g_strdup_printf("/ptimer/on_the_fly_freq_change policy=%s", policy_name),
6685b262bb6SDmitry Osipenko         ppolicy, check_on_the_fly_freq_change);
6695b262bb6SDmitry Osipenko 
67024b94625SPaolo Bonzini     g_test_add_data_func(
6715b262bb6SDmitry Osipenko         g_strdup_printf("/ptimer/run_with_period_0 policy=%s", policy_name),
6725b262bb6SDmitry Osipenko         ppolicy, check_run_with_period_0);
6735b262bb6SDmitry Osipenko 
67424b94625SPaolo Bonzini     g_test_add_data_func(
6755b262bb6SDmitry Osipenko         g_strdup_printf("/ptimer/run_with_delta_0 policy=%s", policy_name),
6765b262bb6SDmitry Osipenko         ppolicy, check_run_with_delta_0);
6775b262bb6SDmitry Osipenko 
67824b94625SPaolo Bonzini     g_test_add_data_func(
6795b262bb6SDmitry Osipenko         g_strdup_printf("/ptimer/periodic_with_load_0 policy=%s", policy_name),
6805b262bb6SDmitry Osipenko         ppolicy, check_periodic_with_load_0);
6815b262bb6SDmitry Osipenko 
68224b94625SPaolo Bonzini     g_test_add_data_func(
6835b262bb6SDmitry Osipenko         g_strdup_printf("/ptimer/oneshot_with_load_0 policy=%s", policy_name),
6845b262bb6SDmitry Osipenko         ppolicy, check_oneshot_with_load_0);
6855b262bb6SDmitry Osipenko }
6865b262bb6SDmitry Osipenko 
687293130aaSDmitry Osipenko static void add_all_ptimer_policies_comb_tests(void)
688293130aaSDmitry Osipenko {
689*516deb42SDmitry Osipenko     int last_policy = PTIMER_POLICY_NO_IMMEDIATE_TRIGGER;
690293130aaSDmitry Osipenko     int policy = PTIMER_POLICY_DEFAULT;
691293130aaSDmitry Osipenko 
692293130aaSDmitry Osipenko     for (; policy < (last_policy << 1); policy++) {
693293130aaSDmitry Osipenko         add_ptimer_tests(policy);
694293130aaSDmitry Osipenko     }
695293130aaSDmitry Osipenko }
696293130aaSDmitry Osipenko 
6975b262bb6SDmitry Osipenko int main(int argc, char **argv)
6985b262bb6SDmitry Osipenko {
6995b262bb6SDmitry Osipenko     int i;
7005b262bb6SDmitry Osipenko 
7015b262bb6SDmitry Osipenko     g_test_init(&argc, &argv, NULL);
7025b262bb6SDmitry Osipenko 
7035b262bb6SDmitry Osipenko     for (i = 0; i < QEMU_CLOCK_MAX; i++) {
7045b262bb6SDmitry Osipenko         main_loop_tlg.tl[i] = g_new0(QEMUTimerList, 1);
7055b262bb6SDmitry Osipenko     }
7065b262bb6SDmitry Osipenko 
707293130aaSDmitry Osipenko     add_all_ptimer_policies_comb_tests();
7085b262bb6SDmitry Osipenko 
7095b262bb6SDmitry Osipenko     qtest_allowed = true;
7105b262bb6SDmitry Osipenko 
7115b262bb6SDmitry Osipenko     return g_test_run();
7125b262bb6SDmitry Osipenko }
713