static void drivertest_pm()

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);
    }
}