|
|
|
@ -1,7 +1,7 @@ |
|
|
|
/*
|
|
|
|
* QTest testcase for the ptimer |
|
|
|
* |
|
|
|
* Author: Dmitry Osipenko <digetx@gmail.com> |
|
|
|
* Copyright (c) 2016 Dmitry Osipenko <digetx@gmail.com> |
|
|
|
* |
|
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or later. |
|
|
|
* See the COPYING file in the top-level directory. |
|
|
|
@ -99,6 +99,7 @@ static void check_oneshot(gconstpointer arg) |
|
|
|
const uint8_t *policy = arg; |
|
|
|
QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); |
|
|
|
ptimer_state *ptimer = ptimer_init(bh, *policy); |
|
|
|
bool no_round_down = (*policy & PTIMER_POLICY_NO_COUNTER_ROUND_DOWN); |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
|
|
|
|
@ -106,34 +107,46 @@ static void check_oneshot(gconstpointer arg) |
|
|
|
ptimer_set_count(ptimer, 10); |
|
|
|
ptimer_run(ptimer, 1); |
|
|
|
|
|
|
|
qemu_clock_step(2000000 * 2 + 100000); |
|
|
|
qemu_clock_step(2000000 * 2 + 1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 7); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 8 : 7); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
ptimer_stop(ptimer); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 7); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 8 : 7); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
qemu_clock_step(2000000 * 11); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 7); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 8 : 7); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
ptimer_run(ptimer, 1); |
|
|
|
|
|
|
|
qemu_clock_step(2000000 * 7 + 100000); |
|
|
|
qemu_clock_step(2000000 * 7 + 1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); |
|
|
|
g_assert_true(triggered); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 1 : 0); |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
if (no_round_down) { |
|
|
|
g_assert_false(triggered); |
|
|
|
} else { |
|
|
|
g_assert_true(triggered); |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
} |
|
|
|
|
|
|
|
qemu_clock_step(2000000); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
if (no_round_down) { |
|
|
|
g_assert_true(triggered); |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
} else { |
|
|
|
g_assert_false(triggered); |
|
|
|
} |
|
|
|
|
|
|
|
qemu_clock_step(4000000); |
|
|
|
|
|
|
|
@ -142,30 +155,30 @@ static void check_oneshot(gconstpointer arg) |
|
|
|
|
|
|
|
ptimer_set_count(ptimer, 10); |
|
|
|
|
|
|
|
qemu_clock_step(20000000 + 100000); |
|
|
|
qemu_clock_step(20000000 + 1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 10); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
ptimer_set_limit(ptimer, 9, 1); |
|
|
|
|
|
|
|
qemu_clock_step(20000000 + 100000); |
|
|
|
qemu_clock_step(20000000 + 1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 9); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
ptimer_run(ptimer, 1); |
|
|
|
|
|
|
|
qemu_clock_step(2000000 + 100000); |
|
|
|
qemu_clock_step(2000000 + 1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 7); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 8 : 7); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
ptimer_set_count(ptimer, 20); |
|
|
|
|
|
|
|
qemu_clock_step(2000000 * 19 + 100000); |
|
|
|
qemu_clock_step(2000000 * 19 + 1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 1 : 0); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
qemu_clock_step(2000000); |
|
|
|
@ -177,7 +190,7 @@ static void check_oneshot(gconstpointer arg) |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
|
|
|
|
qemu_clock_step(2000000 * 12 + 100000); |
|
|
|
qemu_clock_step(2000000 * 12 + 1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); |
|
|
|
g_assert_false(triggered); |
|
|
|
@ -188,6 +201,10 @@ static void check_periodic(gconstpointer arg) |
|
|
|
const uint8_t *policy = arg; |
|
|
|
QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); |
|
|
|
ptimer_state *ptimer = ptimer_init(bh, *policy); |
|
|
|
bool wrap_policy = (*policy & PTIMER_POLICY_WRAP_AFTER_ONE_PERIOD); |
|
|
|
bool no_immediate_trigger = (*policy & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER); |
|
|
|
bool no_immediate_reload = (*policy & PTIMER_POLICY_NO_IMMEDIATE_RELOAD); |
|
|
|
bool no_round_down = (*policy & PTIMER_POLICY_NO_COUNTER_ROUND_DOWN); |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
|
|
|
|
@ -195,28 +212,70 @@ static void check_periodic(gconstpointer arg) |
|
|
|
ptimer_set_limit(ptimer, 10, 1); |
|
|
|
ptimer_run(ptimer, 0); |
|
|
|
|
|
|
|
qemu_clock_step(2000000 * 10 + 100000); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 10); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 9); |
|
|
|
qemu_clock_step(1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 10 : 9); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
qemu_clock_step(2000000 * 10 - 1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, wrap_policy ? 0 : 10); |
|
|
|
g_assert_true(triggered); |
|
|
|
|
|
|
|
qemu_clock_step(1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, |
|
|
|
wrap_policy ? 0 : (no_round_down ? 10 : 9)); |
|
|
|
g_assert_true(triggered); |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
|
|
|
|
qemu_clock_step(2000000); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 8); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, |
|
|
|
(no_round_down ? 9 : 8) + (wrap_policy ? 1 : 0)); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
ptimer_set_count(ptimer, 20); |
|
|
|
|
|
|
|
qemu_clock_step(2000000 * 11 + 100000); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 20); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
qemu_clock_step(1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 8); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 20 : 19); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
qemu_clock_step(2000000 * 11 + 1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 9 : 8); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
qemu_clock_step(2000000 * 10); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 8); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, |
|
|
|
(no_round_down ? 9 : 8) + (wrap_policy ? 1 : 0)); |
|
|
|
g_assert_true(triggered); |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
|
|
|
|
ptimer_set_count(ptimer, 3); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 3); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
qemu_clock_step(1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 3 : 2); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
qemu_clock_step(2000000 * 4); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, |
|
|
|
(no_round_down ? 9 : 8) + (wrap_policy ? 1 : 0)); |
|
|
|
g_assert_true(triggered); |
|
|
|
|
|
|
|
ptimer_stop(ptimer); |
|
|
|
@ -224,50 +283,82 @@ static void check_periodic(gconstpointer arg) |
|
|
|
|
|
|
|
qemu_clock_step(2000000); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 8); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, |
|
|
|
(no_round_down ? 9 : 8) + (wrap_policy ? 1 : 0)); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
ptimer_set_count(ptimer, 3); |
|
|
|
ptimer_run(ptimer, 0); |
|
|
|
|
|
|
|
qemu_clock_step(2000000 * 3 + 100000); |
|
|
|
qemu_clock_step(2000000 * 3 + 1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 9); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, |
|
|
|
wrap_policy ? 0 : (no_round_down ? 10 : 9)); |
|
|
|
g_assert_true(triggered); |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
|
|
|
|
qemu_clock_step(2000000); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 8); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, |
|
|
|
(no_round_down ? 9 : 8) + (wrap_policy ? 1 : 0)); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
ptimer_set_count(ptimer, 0); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 10); |
|
|
|
g_assert_true(triggered); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, |
|
|
|
no_immediate_reload ? 0 : 10); |
|
|
|
|
|
|
|
if (no_immediate_trigger) { |
|
|
|
g_assert_false(triggered); |
|
|
|
} else { |
|
|
|
g_assert_true(triggered); |
|
|
|
} |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
|
|
|
|
qemu_clock_step(2000000 * 12 + 100000); |
|
|
|
qemu_clock_step(1); |
|
|
|
|
|
|
|
if (no_immediate_reload) { |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
qemu_clock_step(2000000); |
|
|
|
|
|
|
|
if (no_immediate_trigger) { |
|
|
|
g_assert_true(triggered); |
|
|
|
} else { |
|
|
|
g_assert_false(triggered); |
|
|
|
} |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
} |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 7); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 10 : 9); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
qemu_clock_step(2000000 * 12); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, |
|
|
|
(no_round_down ? 8 : 7) + (wrap_policy ? 1 : 0)); |
|
|
|
g_assert_true(triggered); |
|
|
|
|
|
|
|
ptimer_stop(ptimer); |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
|
|
|
|
qemu_clock_step(2000000 * 12 + 100000); |
|
|
|
qemu_clock_step(2000000 * 10); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 7); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, |
|
|
|
(no_round_down ? 8 : 7) + (wrap_policy ? 1 : 0)); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
ptimer_run(ptimer, 0); |
|
|
|
ptimer_set_period(ptimer, 0); |
|
|
|
|
|
|
|
qemu_clock_step(2000000 + 100000); |
|
|
|
qemu_clock_step(2000000 + 1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 7); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, |
|
|
|
(no_round_down ? 8 : 7) + (wrap_policy ? 1 : 0)); |
|
|
|
g_assert_false(triggered); |
|
|
|
} |
|
|
|
|
|
|
|
@ -276,6 +367,8 @@ static void check_on_the_fly_mode_change(gconstpointer arg) |
|
|
|
const uint8_t *policy = arg; |
|
|
|
QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); |
|
|
|
ptimer_state *ptimer = ptimer_init(bh, *policy); |
|
|
|
bool wrap_policy = (*policy & PTIMER_POLICY_WRAP_AFTER_ONE_PERIOD); |
|
|
|
bool no_round_down = (*policy & PTIMER_POLICY_NO_COUNTER_ROUND_DOWN); |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
|
|
|
|
@ -283,16 +376,20 @@ static void check_on_the_fly_mode_change(gconstpointer arg) |
|
|
|
ptimer_set_limit(ptimer, 10, 1); |
|
|
|
ptimer_run(ptimer, 1); |
|
|
|
|
|
|
|
qemu_clock_step(2000000 * 9 + 100000); |
|
|
|
qemu_clock_step(2000000 * 9 + 1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 1 : 0); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
ptimer_run(ptimer, 0); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 1 : 0); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
qemu_clock_step(2000000); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 9); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, |
|
|
|
wrap_policy ? 0 : (no_round_down ? 10 : 9)); |
|
|
|
g_assert_true(triggered); |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
@ -301,7 +398,8 @@ static void check_on_the_fly_mode_change(gconstpointer arg) |
|
|
|
|
|
|
|
ptimer_run(ptimer, 1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, |
|
|
|
(no_round_down ? 1 : 0) + (wrap_policy ? 1 : 0)); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
qemu_clock_step(2000000 * 3); |
|
|
|
@ -315,6 +413,7 @@ static void check_on_the_fly_period_change(gconstpointer arg) |
|
|
|
const uint8_t *policy = arg; |
|
|
|
QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); |
|
|
|
ptimer_state *ptimer = ptimer_init(bh, *policy); |
|
|
|
bool no_round_down = (*policy & PTIMER_POLICY_NO_COUNTER_ROUND_DOWN); |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
|
|
|
|
@ -322,17 +421,17 @@ static void check_on_the_fly_period_change(gconstpointer arg) |
|
|
|
ptimer_set_limit(ptimer, 8, 1); |
|
|
|
ptimer_run(ptimer, 1); |
|
|
|
|
|
|
|
qemu_clock_step(2000000 * 4 + 100000); |
|
|
|
qemu_clock_step(2000000 * 4 + 1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 3); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 4 : 3); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
ptimer_set_period(ptimer, 4000000); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 3); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 4 : 3); |
|
|
|
|
|
|
|
qemu_clock_step(4000000 * 2 + 100000); |
|
|
|
qemu_clock_step(4000000 * 2 + 1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 2 : 0); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
qemu_clock_step(4000000 * 2); |
|
|
|
@ -346,6 +445,7 @@ static void check_on_the_fly_freq_change(gconstpointer arg) |
|
|
|
const uint8_t *policy = arg; |
|
|
|
QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); |
|
|
|
ptimer_state *ptimer = ptimer_init(bh, *policy); |
|
|
|
bool no_round_down = (*policy & PTIMER_POLICY_NO_COUNTER_ROUND_DOWN); |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
|
|
|
|
@ -353,17 +453,17 @@ static void check_on_the_fly_freq_change(gconstpointer arg) |
|
|
|
ptimer_set_limit(ptimer, 8, 1); |
|
|
|
ptimer_run(ptimer, 1); |
|
|
|
|
|
|
|
qemu_clock_step(2000000 * 4 + 100000); |
|
|
|
qemu_clock_step(2000000 * 4 + 1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 3); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 4 : 3); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
ptimer_set_freq(ptimer, 250); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 3); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 4 : 3); |
|
|
|
|
|
|
|
qemu_clock_step(2000000 * 4 + 100000); |
|
|
|
qemu_clock_step(2000000 * 4 + 1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 2 : 0); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
qemu_clock_step(2000000 * 4); |
|
|
|
@ -394,25 +494,53 @@ static void check_run_with_delta_0(gconstpointer arg) |
|
|
|
const uint8_t *policy = arg; |
|
|
|
QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); |
|
|
|
ptimer_state *ptimer = ptimer_init(bh, *policy); |
|
|
|
bool wrap_policy = (*policy & PTIMER_POLICY_WRAP_AFTER_ONE_PERIOD); |
|
|
|
bool no_immediate_trigger = (*policy & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER); |
|
|
|
bool no_immediate_reload = (*policy & PTIMER_POLICY_NO_IMMEDIATE_RELOAD); |
|
|
|
bool no_round_down = (*policy & PTIMER_POLICY_NO_COUNTER_ROUND_DOWN); |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
|
|
|
|
ptimer_set_period(ptimer, 2000000); |
|
|
|
ptimer_set_limit(ptimer, 99, 0); |
|
|
|
ptimer_run(ptimer, 1); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 99); |
|
|
|
g_assert_true(triggered); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, |
|
|
|
no_immediate_reload ? 0 : 99); |
|
|
|
|
|
|
|
if (no_immediate_trigger) { |
|
|
|
g_assert_false(triggered); |
|
|
|
} else { |
|
|
|
g_assert_true(triggered); |
|
|
|
} |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
|
|
|
|
qemu_clock_step(2000000 + 100000); |
|
|
|
if (no_immediate_trigger || no_immediate_reload) { |
|
|
|
qemu_clock_step(2000000 + 1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, |
|
|
|
no_immediate_reload ? 0 : (no_round_down ? 98 : 97)); |
|
|
|
|
|
|
|
if (no_immediate_trigger && no_immediate_reload) { |
|
|
|
g_assert_true(triggered); |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
} else { |
|
|
|
g_assert_false(triggered); |
|
|
|
} |
|
|
|
|
|
|
|
ptimer_set_count(ptimer, 99); |
|
|
|
ptimer_run(ptimer, 1); |
|
|
|
} |
|
|
|
|
|
|
|
qemu_clock_step(2000000 + 1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 97); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 98 : 97); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
qemu_clock_step(2000000 * 97); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 1 : 0); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
qemu_clock_step(2000000 * 2); |
|
|
|
@ -424,19 +552,42 @@ static void check_run_with_delta_0(gconstpointer arg) |
|
|
|
|
|
|
|
ptimer_set_count(ptimer, 0); |
|
|
|
ptimer_run(ptimer, 0); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 99); |
|
|
|
g_assert_true(triggered); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, |
|
|
|
no_immediate_reload ? 0 : 99); |
|
|
|
|
|
|
|
if (no_immediate_trigger) { |
|
|
|
g_assert_false(triggered); |
|
|
|
} else { |
|
|
|
g_assert_true(triggered); |
|
|
|
} |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
|
|
|
|
qemu_clock_step(1); |
|
|
|
|
|
|
|
if (no_immediate_reload) { |
|
|
|
qemu_clock_step(2000000); |
|
|
|
} |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 99 : 98); |
|
|
|
|
|
|
|
if (no_immediate_reload && no_immediate_trigger) { |
|
|
|
g_assert_true(triggered); |
|
|
|
} else { |
|
|
|
g_assert_false(triggered); |
|
|
|
} |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
|
|
|
|
qemu_clock_step(2000000 + 100000); |
|
|
|
qemu_clock_step(2000000); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 97); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, no_round_down ? 98 : 97); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
qemu_clock_step(2000000 * 98); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 98); |
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, |
|
|
|
wrap_policy ? 0 : (no_round_down ? 99 : 98)); |
|
|
|
g_assert_true(triggered); |
|
|
|
|
|
|
|
ptimer_stop(ptimer); |
|
|
|
@ -447,21 +598,55 @@ static void check_periodic_with_load_0(gconstpointer arg) |
|
|
|
const uint8_t *policy = arg; |
|
|
|
QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); |
|
|
|
ptimer_state *ptimer = ptimer_init(bh, *policy); |
|
|
|
bool continuous_trigger = (*policy & PTIMER_POLICY_CONTINUOUS_TRIGGER); |
|
|
|
bool no_immediate_trigger = (*policy & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER); |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
|
|
|
|
ptimer_set_period(ptimer, 2000000); |
|
|
|
ptimer_run(ptimer, 0); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); |
|
|
|
|
|
|
|
if (no_immediate_trigger) { |
|
|
|
g_assert_false(triggered); |
|
|
|
} else { |
|
|
|
g_assert_true(triggered); |
|
|
|
} |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
|
|
|
|
qemu_clock_step(2000000 + 1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); |
|
|
|
|
|
|
|
if (continuous_trigger || no_immediate_trigger) { |
|
|
|
g_assert_true(triggered); |
|
|
|
} else { |
|
|
|
g_assert_false(triggered); |
|
|
|
} |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
|
|
|
|
ptimer_set_count(ptimer, 10); |
|
|
|
ptimer_run(ptimer, 0); |
|
|
|
|
|
|
|
qemu_clock_step(2000000 * 10 + 1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); |
|
|
|
g_assert_true(triggered); |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
|
|
|
|
qemu_clock_step(2000000 + 100000); |
|
|
|
qemu_clock_step(2000000 + 1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
if (continuous_trigger) { |
|
|
|
g_assert_true(triggered); |
|
|
|
} else { |
|
|
|
g_assert_false(triggered); |
|
|
|
} |
|
|
|
|
|
|
|
ptimer_stop(ptimer); |
|
|
|
} |
|
|
|
@ -471,6 +656,7 @@ static void check_oneshot_with_load_0(gconstpointer arg) |
|
|
|
const uint8_t *policy = arg; |
|
|
|
QEMUBH *bh = qemu_bh_new(ptimer_trigger, NULL); |
|
|
|
ptimer_state *ptimer = ptimer_init(bh, *policy); |
|
|
|
bool no_immediate_trigger = (*policy & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER); |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
|
|
|
|
@ -478,26 +664,30 @@ static void check_oneshot_with_load_0(gconstpointer arg) |
|
|
|
ptimer_run(ptimer, 1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); |
|
|
|
g_assert_true(triggered); |
|
|
|
|
|
|
|
if (no_immediate_trigger) { |
|
|
|
g_assert_false(triggered); |
|
|
|
} else { |
|
|
|
g_assert_true(triggered); |
|
|
|
} |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
|
|
|
|
qemu_clock_step(2000000 + 100000); |
|
|
|
qemu_clock_step(2000000 + 1); |
|
|
|
|
|
|
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0); |
|
|
|
g_assert_false(triggered); |
|
|
|
|
|
|
|
triggered = false; |
|
|
|
|
|
|
|
qemu_clock_step(2000000 + 100000); |
|
|
|
|
|
|
|
g_assert_false(triggered); |
|
|
|
if (no_immediate_trigger) { |
|
|
|
g_assert_true(triggered); |
|
|
|
} else { |
|
|
|
g_assert_false(triggered); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static void add_ptimer_tests(uint8_t policy) |
|
|
|
{ |
|
|
|
uint8_t *ppolicy = g_malloc(1); |
|
|
|
char *policy_name = g_malloc(64); |
|
|
|
char *policy_name = g_malloc0(256); |
|
|
|
|
|
|
|
*ppolicy = policy; |
|
|
|
|
|
|
|
@ -505,6 +695,26 @@ static void add_ptimer_tests(uint8_t policy) |
|
|
|
g_sprintf(policy_name, "default"); |
|
|
|
} |
|
|
|
|
|
|
|
if (policy & PTIMER_POLICY_WRAP_AFTER_ONE_PERIOD) { |
|
|
|
g_strlcat(policy_name, "wrap_after_one_period,", 256); |
|
|
|
} |
|
|
|
|
|
|
|
if (policy & PTIMER_POLICY_CONTINUOUS_TRIGGER) { |
|
|
|
g_strlcat(policy_name, "continuous_trigger,", 256); |
|
|
|
} |
|
|
|
|
|
|
|
if (policy & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER) { |
|
|
|
g_strlcat(policy_name, "no_immediate_trigger,", 256); |
|
|
|
} |
|
|
|
|
|
|
|
if (policy & PTIMER_POLICY_NO_IMMEDIATE_RELOAD) { |
|
|
|
g_strlcat(policy_name, "no_immediate_reload,", 256); |
|
|
|
} |
|
|
|
|
|
|
|
if (policy & PTIMER_POLICY_NO_COUNTER_ROUND_DOWN) { |
|
|
|
g_strlcat(policy_name, "no_counter_rounddown,", 256); |
|
|
|
} |
|
|
|
|
|
|
|
g_test_add_data_func( |
|
|
|
g_strdup_printf("/ptimer/set_count policy=%s", policy_name), |
|
|
|
ppolicy, check_set_count); |
|
|
|
@ -550,6 +760,16 @@ static void add_ptimer_tests(uint8_t policy) |
|
|
|
ppolicy, check_oneshot_with_load_0); |
|
|
|
} |
|
|
|
|
|
|
|
static void add_all_ptimer_policies_comb_tests(void) |
|
|
|
{ |
|
|
|
int last_policy = PTIMER_POLICY_NO_COUNTER_ROUND_DOWN; |
|
|
|
int policy = PTIMER_POLICY_DEFAULT; |
|
|
|
|
|
|
|
for (; policy < (last_policy << 1); policy++) { |
|
|
|
add_ptimer_tests(policy); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
int main(int argc, char **argv) |
|
|
|
{ |
|
|
|
int i; |
|
|
|
@ -560,7 +780,7 @@ int main(int argc, char **argv) |
|
|
|
main_loop_tlg.tl[i] = g_new0(QEMUTimerList, 1); |
|
|
|
} |
|
|
|
|
|
|
|
add_ptimer_tests(PTIMER_POLICY_DEFAULT); |
|
|
|
add_all_ptimer_policies_comb_tests(); |
|
|
|
|
|
|
|
qtest_allowed = true; |
|
|
|
|
|
|
|
|