in testing/drivers/drivertest/drivertest_pm.c [153:375]
static void drivertest_pm(FAR void **argv)
{
int persist_stay_cnt[PM_COUNT];
int init_delay;
int staycount;
int target;
bool check;
int domain = TEST_DOMAIN;
int ret = 0;
int cnt = TEST_PM_LOOP_COUNT;
if (CONFIG_PM_GOVERNOR_EXPLICIT_RELAX < 0)
{
check = false;
init_delay = 0;
}
else
{
check = true;
init_delay = MAX(CONFIG_PM_GOVERNOR_EXPLICIT_RELAX,
CONFIG_SERIAL_PM_ACTIVITY_PRIORITY);
}
usleep(init_delay * 1000000);
usleep(TEST_WAITTIME);
for (int i = 0; i < PM_COUNT; i++)
{
persist_stay_cnt[i] = pm_staycount(domain, i);
}
while (cnt--)
{
ret = pm_domain_register(domain, &g_test_pm_callback);
assert_int_equal(ret, 0);
/* test when pm prepare failed */
g_test_pm_dev.prepare_fail = true;
for (int state = 0; state < PM_COUNT; state++)
{
target = persist_stay_cnt[state] + 0;
ASSERT_EQUAL_IF_CHECK(pm_staycount(domain, state), target, check);
pm_stay(domain, state);
usleep(TEST_WAITTIME);
assert_int_equal(g_test_pm_dev.state, PM_SLEEP);
ASSERT_EQUAL_IF_CHECK(pm_querystate(domain), PM_SLEEP, check);
target = persist_stay_cnt[state] + 1;
ASSERT_EQUAL_IF_CHECK(pm_staycount(domain, state), target, check);
pm_staytimeout(domain, state, TEST_STAYTIMEOUT);
usleep(TEST_WAITTIME);
assert_int_equal(g_test_pm_dev.state, PM_SLEEP);
ASSERT_EQUAL_IF_CHECK(pm_querystate(domain), PM_SLEEP, check);
target = persist_stay_cnt[state] + 2;
ASSERT_EQUAL_IF_CHECK(pm_staycount(domain, state), target, check);
usleep(TEST_STAYTIMEOUT * 1000);
assert_int_equal(g_test_pm_dev.state, PM_SLEEP);
ASSERT_EQUAL_IF_CHECK(pm_querystate(domain), PM_SLEEP, check);
target = persist_stay_cnt[state] + 1;
ASSERT_EQUAL_IF_CHECK(pm_staycount(domain, state), target, check);
pm_relax(domain, state);
usleep(TEST_WAITTIME);
assert_int_equal(g_test_pm_dev.state, PM_SLEEP);
ASSERT_EQUAL_IF_CHECK(pm_querystate(domain), PM_SLEEP, check);
target = persist_stay_cnt[state] + 0;
ASSERT_EQUAL_IF_CHECK(pm_staycount(domain, state), target, check);
pm_staytimeout(domain, state, TEST_STAYTIMEOUT);
usleep(TEST_WAITTIME);
assert_int_equal(g_test_pm_dev.state, PM_SLEEP);
ASSERT_EQUAL_IF_CHECK(pm_querystate(domain), PM_SLEEP, check);
target = persist_stay_cnt[state] + 1;
ASSERT_EQUAL_IF_CHECK(pm_staycount(domain, state), target, check);
usleep(TEST_STAYTIMEOUT * 1000);
assert_int_equal(g_test_pm_dev.state, PM_SLEEP);
ASSERT_EQUAL_IF_CHECK(pm_querystate(domain), PM_SLEEP, check);
target = persist_stay_cnt[state] + 0;
ASSERT_EQUAL_IF_CHECK(pm_staycount(domain, state), target, check);
}
for (int state = 0; state < PM_COUNT; state++)
{
staycount = pm_wakelock_staycount(&g_test_wakelock[state]);
ASSERT_EQUAL_IF_CHECK(staycount, 0, check);
pm_wakelock_stay(&g_test_wakelock[state]);
usleep(TEST_WAITTIME);
assert_int_equal(g_test_pm_dev.state, PM_SLEEP);
ASSERT_EQUAL_IF_CHECK(pm_querystate(domain), PM_SLEEP, check);
staycount = pm_wakelock_staycount(&g_test_wakelock[state]);
ASSERT_EQUAL_IF_CHECK(staycount, 1, check);
pm_wakelock_staytimeout(&g_test_wakelock[state], TEST_STAYTIMEOUT);
usleep(TEST_WAITTIME);
assert_int_equal(g_test_pm_dev.state, PM_SLEEP);
ASSERT_EQUAL_IF_CHECK(pm_querystate(domain), PM_SLEEP, check);
staycount = pm_wakelock_staycount(&g_test_wakelock[state]);
ASSERT_EQUAL_IF_CHECK(staycount, 2, check);
usleep(TEST_STAYTIMEOUT * 1000);
assert_int_equal(g_test_pm_dev.state, PM_SLEEP);
ASSERT_EQUAL_IF_CHECK(pm_querystate(domain), PM_SLEEP, check);
staycount = pm_wakelock_staycount(&g_test_wakelock[state]);
ASSERT_EQUAL_IF_CHECK(staycount, 1, check);
pm_wakelock_relax(&g_test_wakelock[state]);
usleep(TEST_WAITTIME);
assert_int_equal(g_test_pm_dev.state, PM_SLEEP);
ASSERT_EQUAL_IF_CHECK(pm_querystate(domain), PM_SLEEP, check);
staycount = pm_wakelock_staycount(&g_test_wakelock[state]);
ASSERT_EQUAL_IF_CHECK(staycount, 0, check);
pm_wakelock_staytimeout(&g_test_wakelock[state], TEST_STAYTIMEOUT);
usleep(TEST_WAITTIME);
assert_int_equal(g_test_pm_dev.state, PM_SLEEP);
ASSERT_EQUAL_IF_CHECK(pm_querystate(domain), PM_SLEEP, check);
staycount = pm_wakelock_staycount(&g_test_wakelock[state]);
ASSERT_EQUAL_IF_CHECK(staycount, 1, check);
usleep(TEST_STAYTIMEOUT * 1000);
assert_int_equal(g_test_pm_dev.state, PM_SLEEP);
ASSERT_EQUAL_IF_CHECK(pm_querystate(domain), PM_SLEEP, check);
staycount = pm_wakelock_staycount(&g_test_wakelock[state]);
ASSERT_EQUAL_IF_CHECK(staycount, 0, check);
}
/* test when pm prepare succeeded */
g_test_pm_dev.prepare_fail = false;
for (int state = 0; state < PM_COUNT; state++)
{
target = persist_stay_cnt[state] + 0;
ASSERT_EQUAL_IF_CHECK(pm_staycount(domain, state), target, check);
pm_stay(domain, state);
usleep(TEST_WAITTIME);
assert_int_equal(g_test_pm_dev.state, state);
ASSERT_EQUAL_IF_CHECK(pm_querystate(domain), state, check);
target = persist_stay_cnt[state] + 1;
ASSERT_EQUAL_IF_CHECK(pm_staycount(domain, state), target, check);
pm_staytimeout(domain, state, TEST_STAYTIMEOUT);
usleep(TEST_WAITTIME);
assert_int_equal(g_test_pm_dev.state, state);
ASSERT_EQUAL_IF_CHECK(pm_querystate(domain), state, check);
target = persist_stay_cnt[state] + 2;
ASSERT_EQUAL_IF_CHECK(pm_staycount(domain, state), target, check);
usleep(TEST_STAYTIMEOUT * 1000);
assert_int_equal(g_test_pm_dev.state, state);
ASSERT_EQUAL_IF_CHECK(pm_querystate(domain), state, check);
target = persist_stay_cnt[state] + 1;
ASSERT_EQUAL_IF_CHECK(pm_staycount(domain, state), target, check);
pm_relax(domain, state);
usleep(TEST_WAITTIME);
assert_int_equal(g_test_pm_dev.state, PM_SLEEP);
ASSERT_EQUAL_IF_CHECK(pm_querystate(domain), PM_SLEEP, check);
target = persist_stay_cnt[state] + 0;
ASSERT_EQUAL_IF_CHECK(pm_staycount(domain, state), target, check);
pm_staytimeout(domain, state, TEST_STAYTIMEOUT);
usleep(TEST_WAITTIME);
assert_int_equal(g_test_pm_dev.state, state);
ASSERT_EQUAL_IF_CHECK(pm_querystate(domain), state, check);
target = persist_stay_cnt[state] + 1;
ASSERT_EQUAL_IF_CHECK(pm_staycount(domain, state), target, check);
usleep(TEST_STAYTIMEOUT * 1000);
assert_int_equal(g_test_pm_dev.state, PM_SLEEP);
ASSERT_EQUAL_IF_CHECK(pm_querystate(domain), PM_SLEEP, check);
target = persist_stay_cnt[state] + 0;
ASSERT_EQUAL_IF_CHECK(pm_staycount(domain, state), target, check);
}
for (int state = 0; state < PM_COUNT; state++)
{
staycount = pm_wakelock_staycount(&g_test_wakelock[state]);
ASSERT_EQUAL_IF_CHECK(staycount, 0, check);
pm_wakelock_stay(&g_test_wakelock[state]);
usleep(TEST_WAITTIME);
assert_int_equal(g_test_pm_dev.state, state);
ASSERT_EQUAL_IF_CHECK(pm_querystate(domain), state, check);
staycount = pm_wakelock_staycount(&g_test_wakelock[state]);
ASSERT_EQUAL_IF_CHECK(staycount, 1, check);
pm_wakelock_staytimeout(&g_test_wakelock[state], TEST_STAYTIMEOUT);
usleep(TEST_WAITTIME);
assert_int_equal(g_test_pm_dev.state, state);
ASSERT_EQUAL_IF_CHECK(pm_querystate(domain), state, check);
staycount = pm_wakelock_staycount(&g_test_wakelock[state]);
ASSERT_EQUAL_IF_CHECK(staycount, 2, check);
usleep(TEST_STAYTIMEOUT * 1000);
assert_int_equal(g_test_pm_dev.state, state);
ASSERT_EQUAL_IF_CHECK(pm_querystate(domain), state, check);
staycount = pm_wakelock_staycount(&g_test_wakelock[state]);
ASSERT_EQUAL_IF_CHECK(staycount, 1, check);
pm_wakelock_relax(&g_test_wakelock[state]);
usleep(TEST_WAITTIME);
assert_int_equal(g_test_pm_dev.state, PM_SLEEP);
ASSERT_EQUAL_IF_CHECK(pm_querystate(domain), PM_SLEEP, check);
staycount = pm_wakelock_staycount(&g_test_wakelock[state]);
ASSERT_EQUAL_IF_CHECK(staycount, 0, check);
pm_wakelock_staytimeout(&g_test_wakelock[state], TEST_STAYTIMEOUT);
usleep(TEST_WAITTIME);
assert_int_equal(g_test_pm_dev.state, state);
ASSERT_EQUAL_IF_CHECK(pm_querystate(domain), state, check);
staycount = pm_wakelock_staycount(&g_test_wakelock[state]);
ASSERT_EQUAL_IF_CHECK(staycount, 1, check);
usleep(TEST_STAYTIMEOUT * 1000);
assert_int_equal(g_test_pm_dev.state, PM_SLEEP);
ASSERT_EQUAL_IF_CHECK(pm_querystate(domain), PM_SLEEP, check);
staycount = pm_wakelock_staycount(&g_test_wakelock[state]);
ASSERT_EQUAL_IF_CHECK(staycount, 0, check);
}
ret = pm_domain_unregister(domain, &g_test_pm_callback);
assert_int_equal(ret, 0);
}
}