diff options
Diffstat (limited to 'zephyr/test/system_common/src/reboot.c')
-rw-r--r-- | zephyr/test/system_common/src/reboot.c | 289 |
1 files changed, 289 insertions, 0 deletions
diff --git a/zephyr/test/system_common/src/reboot.c b/zephyr/test/system_common/src/reboot.c new file mode 100644 index 0000000000..759b93d89f --- /dev/null +++ b/zephyr/test/system_common/src/reboot.c @@ -0,0 +1,289 @@ +/* Copyright 2022 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include <zephyr/device.h> +#include <zephyr/fff.h> +#include <zephyr/ztest_assert.h> +#include <zephyr/ztest_test_new.h> + +#include "host_command.h" +#include "system.h" + +FAKE_VOID_FUNC(system_reset, int); +FAKE_VOID_FUNC(system_hibernate, uint32_t, uint32_t); + +ZTEST_SUITE(console_cmd_reboot, NULL, NULL, NULL, NULL, NULL); + +ZTEST(console_cmd_reboot, test_reboot_valid) +{ + int ret; + int i; + + struct { + char *cmd; + int expect_called; + int expect_flags; + } tests[] = { + { + .cmd = "reboot hard", + .expect_called = 1, + .expect_flags = SYSTEM_RESET_MANUALLY_TRIGGERED | + SYSTEM_RESET_HARD, + }, + { + .cmd = "reboot cold", + .expect_called = 1, + .expect_flags = SYSTEM_RESET_MANUALLY_TRIGGERED | + SYSTEM_RESET_HARD, + }, + { + .cmd = "reboot soft", + .expect_called = 1, + .expect_flags = SYSTEM_RESET_MANUALLY_TRIGGERED, + }, + { + .cmd = "reboot ap-off", + .expect_called = 1, + .expect_flags = SYSTEM_RESET_MANUALLY_TRIGGERED | + SYSTEM_RESET_LEAVE_AP_OFF, + }, + { + .cmd = "reboot ap-off-in-ro", + .expect_called = 1, + .expect_flags = SYSTEM_RESET_MANUALLY_TRIGGERED | + SYSTEM_RESET_LEAVE_AP_OFF | + SYSTEM_RESET_STAY_IN_RO, + }, + { + .cmd = "reboot ro", + .expect_called = 1, + .expect_flags = SYSTEM_RESET_MANUALLY_TRIGGERED | + SYSTEM_RESET_STAY_IN_RO, + }, + { + .cmd = "reboot cancel", + .expect_called = 0, + .expect_flags = 0, + }, + { + .cmd = "reboot preserve", + .expect_called = 1, + .expect_flags = SYSTEM_RESET_MANUALLY_TRIGGERED | + SYSTEM_RESET_PRESERVE_FLAGS, + }, + { + .cmd = "reboot wait-ext", + .expect_called = 1, + .expect_flags = SYSTEM_RESET_MANUALLY_TRIGGERED | + SYSTEM_RESET_WAIT_EXT, + }, + }; + + for (i = 0; i < ARRAY_SIZE(tests); i++) { + char *cmd = tests[i].cmd; + + RESET_FAKE(system_reset); + RESET_FAKE(system_hibernate); + + ret = shell_execute_cmd(get_ec_shell(), cmd); + + zassert_equal(ret, EC_SUCCESS, + "Unexpected return value for '%s': %d", cmd, ret); + zassert_equal(system_reset_fake.call_count, + tests[i].expect_called, + "Unexpected call count for '%s': %d", cmd, + system_reset_fake.call_count); + zassert_equal(system_reset_fake.arg0_history[0], + tests[i].expect_flags, + "Unexpected flags for '%s': %x", cmd, + system_reset_fake.arg0_history[0]); + } +} + +ZTEST(console_cmd_reboot, test_reboot_invalid) +{ + int ret; + + ret = shell_execute_cmd(get_ec_shell(), "reboot i-am-not-an-argument"); + + zassert_equal(ret, EC_ERROR_PARAM1, "invalid return value: %d", ret); + zassert_equal(system_reset_fake.call_count, 0, + "Unexpected call count: %d", + system_reset_fake.call_count); +} + +ZTEST_SUITE(host_cmd_reboot, NULL, NULL, NULL, NULL, NULL); + +ZTEST(host_cmd_reboot, test_reboot) +{ + int ret; + int i; + struct ec_params_reboot_ec p; + struct host_cmd_handler_args args = + BUILD_HOST_COMMAND_PARAMS(EC_CMD_REBOOT_EC, 0, p); + int reboot_at_shutdown; + + struct { + uint8_t cmd; + uint8_t flags; + int expect_return; + int expect_reboot_at_shutdown; + int expect_reset_called; + int expect_reset_flags; + int expect_hibernate_called; + } tests[] = { + { + .cmd = EC_REBOOT_CANCEL, + .flags = 0, + .expect_return = EC_RES_SUCCESS, + .expect_reboot_at_shutdown = EC_REBOOT_CANCEL, + .expect_reset_called = 0, + .expect_reset_flags = 0, + .expect_hibernate_called = 0, + }, + { + .cmd = EC_REBOOT_COLD, + .flags = EC_REBOOT_FLAG_SWITCH_RW_SLOT, + .expect_return = EC_RES_INVALID_PARAM, + .expect_reboot_at_shutdown = 0, + .expect_reset_called = 0, + .expect_reset_flags = 0, + .expect_hibernate_called = 0, + }, + { + .cmd = 0xaa, /* cmd passed unmodified */ + .flags = EC_REBOOT_FLAG_ON_AP_SHUTDOWN, + .expect_return = EC_RES_SUCCESS, + .expect_reboot_at_shutdown = 0xaa, + .expect_reset_called = 0, + .expect_reset_flags = 0, + .expect_hibernate_called = 0, + }, + { + .cmd = 0x55, /* cmd passed unmodified */ + .flags = EC_REBOOT_FLAG_ON_AP_SHUTDOWN, + .expect_return = EC_RES_SUCCESS, + .expect_reboot_at_shutdown = 0x55, + .expect_reset_called = 0, + .expect_reset_flags = 0, + .expect_hibernate_called = 0, + }, + { + .cmd = EC_REBOOT_COLD, + .flags = 0, + .expect_return = EC_RES_ERROR, + .expect_reboot_at_shutdown = EC_REBOOT_CANCEL, + .expect_reset_called = 1, + .expect_reset_flags = SYSTEM_RESET_HARD, + .expect_hibernate_called = 0, + }, + { + .cmd = EC_REBOOT_HIBERNATE, + .flags = 0, + .expect_return = EC_RES_ERROR, + .expect_reboot_at_shutdown = EC_REBOOT_CANCEL, + .expect_reset_called = 0, + .expect_reset_flags = 0, + .expect_hibernate_called = 1, + }, + { + .cmd = EC_REBOOT_COLD_AP_OFF, + .flags = 0, + .expect_return = EC_RES_ERROR, + .expect_reboot_at_shutdown = EC_REBOOT_CANCEL, + .expect_reset_called = 1, + .expect_reset_flags = SYSTEM_RESET_HARD | + SYSTEM_RESET_LEAVE_AP_OFF, + .expect_hibernate_called = 0, + }, + { + .cmd = 0xff, + .flags = 0, + .expect_return = EC_RES_INVALID_PARAM, + .expect_reboot_at_shutdown = EC_REBOOT_CANCEL, + .expect_reset_called = 0, + .expect_reset_flags = 0, + .expect_hibernate_called = 0, + }, + }; + + for (i = 0; i < ARRAY_SIZE(tests); i++) { + p.cmd = tests[i].cmd; + p.flags = tests[i].flags; + + RESET_FAKE(system_reset); + RESET_FAKE(system_hibernate); + + ret = host_command_process(&args); + + zassert_equal(ret, tests[i].expect_return, + "Unexpected return value (%d): %d", i, ret); + reboot_at_shutdown = + system_common_get_reset_reboot_at_shutdown(); + zassert_equal( + reboot_at_shutdown, tests[i].expect_reboot_at_shutdown, + "Unexpected value for reboot_at_shutdown (%d): %d", i, + reboot_at_shutdown); + zassert_equal(system_reset_fake.call_count, + tests[i].expect_reset_called, + "Unexpected reset call count (%d): %d", i, + system_reset_fake.call_count); + zassert_equal(system_reset_fake.arg0_history[0], + tests[i].expect_reset_flags, + "Unexpected flags (%d): %x", i, + system_reset_fake.arg0_history[0]); + zassert_equal(system_hibernate_fake.call_count, + tests[i].expect_hibernate_called, + "Unexpected hibernate call count (%d): %d", i, + system_hibernate_fake.call_count); + } +} + +ZTEST_SUITE(console_cmd_hibernate, NULL, NULL, NULL, NULL, NULL); + +int chipset_in_state(int state_mask) +{ + return 0; +} + +ZTEST(console_cmd_hibernate, test_hibernate_default) +{ + int ret; + + RESET_FAKE(system_hibernate); + + ret = shell_execute_cmd(get_ec_shell(), "hibernate"); + + zassert_equal(ret, EC_SUCCESS, "Unexpected return value: %d", ret); + zassert_equal(system_hibernate_fake.call_count, 1, + "Unexpected hibernate call count: %d", + system_hibernate_fake.call_count); + zassert_equal(system_hibernate_fake.arg0_history[0], 0, + "Unexpected hibernate_secondst: %d", + system_hibernate_fake.arg0_history[0]); + zassert_equal(system_hibernate_fake.arg1_history[0], 0, + "Unexpected hibernate_secondst: %d", + system_hibernate_fake.arg1_history[0]); +} + +ZTEST(console_cmd_hibernate, test_hibernate_args) +{ + int ret; + + RESET_FAKE(system_hibernate); + + ret = shell_execute_cmd(get_ec_shell(), "hibernate 123 456"); + + zassert_equal(ret, EC_SUCCESS, "Unexpected return value: %d", ret); + zassert_equal(system_hibernate_fake.call_count, 1, + "Unexpected hibernate call count: %d", + system_hibernate_fake.call_count); + zassert_equal(system_hibernate_fake.arg0_history[0], 123, + "Unexpected hibernate_secondst: %d", + system_hibernate_fake.arg0_history[0]); + zassert_equal(system_hibernate_fake.arg1_history[0], 456, + "Unexpected hibernate_secondst: %d", + system_hibernate_fake.arg1_history[0]); +} |