diff options
author | Aaron Massey <aaronmassey@google.com> | 2022-09-27 16:49:21 -0600 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2022-09-30 19:58:37 +0000 |
commit | e60ea169df800e3ab0ce5b7bfa983626dae75880 (patch) | |
tree | 82183989c82c58cda384efbc23d618f8c78a89e6 /zephyr/test/drivers/host_cmd | |
parent | a40a4736a6fc5930e7d00d4367ddf86137b273d9 (diff) | |
download | chrome-ec-e60ea169df800e3ab0ce5b7bfa983626dae75880.tar.gz |
test: EC_CMD_USB_PD_FW_UPDATE host cmd
Verify via line coverage that all subcmds and error cases of the
EC_CMD_USB_PD_FW_UPDATE host command are handled appropriately.
BRANCH=none
BUG=b:236075275
TEST=twister --clobber -i -s zephyr/test/drivers/drivers.host_cmd
Signed-off-by: Aaron Massey <aaronmassey@google.com>
Change-Id: Ia6a427fa90bc16f4723d64b6446cc4131d50af2f
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3924355
Code-Coverage: Zoss <zoss-cl-coverage@prod.google.com>
Reviewed-by: Keith Short <keithshort@chromium.org>
Diffstat (limited to 'zephyr/test/drivers/host_cmd')
-rw-r--r-- | zephyr/test/drivers/host_cmd/src/usb_pd_host_cmd.c | 218 |
1 files changed, 216 insertions, 2 deletions
diff --git a/zephyr/test/drivers/host_cmd/src/usb_pd_host_cmd.c b/zephyr/test/drivers/host_cmd/src/usb_pd_host_cmd.c index c8851fbeb1..7066aae775 100644 --- a/zephyr/test/drivers/host_cmd/src/usb_pd_host_cmd.c +++ b/zephyr/test/drivers/host_cmd/src/usb_pd_host_cmd.c @@ -3,12 +3,216 @@ * found in the LICENSE file. */ +#include <zephyr/drivers/gpio/gpio_emul.h> #include <zephyr/kernel.h> #include <zephyr/ztest.h> #include "ec_commands.h" #include "host_command.h" +#include "test/drivers/test_mocks.h" #include "test/drivers/test_state.h" +#include "test/drivers/stubs.h" +#include "usb_pd.h" + +#define TEST_PORT USBC_PORT_C0 + +#define GPIO_BATT_PRES_ODL_PATH DT_PATH(named_gpios, ec_batt_pres_odl) +#define GPIO_BATT_PRES_ODL_PORT DT_GPIO_PIN(GPIO_BATT_PRES_ODL_PATH, gpios) + +FAKE_VOID_FUNC(pd_send_vdm, int, uint32_t, int, const uint32_t *, int); +FAKE_VALUE_FUNC(int, charge_manager_get_active_charge_port); + +static void usb_pd_host_cmd_test_set_battery_present(bool present) +{ + const struct device *dev = + DEVICE_DT_GET(DT_GPIO_CTLR(GPIO_BATT_PRES_ODL_PATH, gpios)); + + /* 0 means battery present */ + zassume_ok(gpio_emul_input_set(dev, GPIO_BATT_PRES_ODL_PORT, !present), + NULL); +} + +ZTEST_USER(usb_pd_host_cmd, test_hc_remote_flash__fw_reboot_subcmd) +{ + const struct ec_params_usb_pd_fw_update p = { + .cmd = USB_PD_FW_REBOOT, + .port = TEST_PORT, + }; + + struct host_cmd_handler_args args = + BUILD_HOST_COMMAND_PARAMS(EC_CMD_USB_PD_FW_UPDATE, 0, p); + zassert_ok(host_command_process(&args)); + + zassert_equal(pd_send_vdm_fake.call_count, 1); + zassert_equal(pd_send_vdm_fake.arg0_val, TEST_PORT); + zassert_equal(pd_send_vdm_fake.arg1_val, USB_VID_GOOGLE); + zassert_equal(pd_send_vdm_fake.arg2_val, VDO_CMD_REBOOT); + zassert_equal(pd_send_vdm_fake.arg3_val, NULL); + zassert_equal(pd_send_vdm_fake.arg4_val, 0); +} + +ZTEST_USER(usb_pd_host_cmd, test_hc_remote_flash__fw_flash_erase_subcmd) +{ + const struct ec_params_usb_pd_fw_update p = { + .cmd = USB_PD_FW_FLASH_ERASE, + .port = TEST_PORT, + }; + + struct host_cmd_handler_args args = + BUILD_HOST_COMMAND_PARAMS(EC_CMD_USB_PD_FW_UPDATE, 0, p); + zassert_ok(host_command_process(&args)); + + zassert_equal(pd_send_vdm_fake.call_count, 1); + zassert_equal(pd_send_vdm_fake.arg0_val, TEST_PORT); + zassert_equal(pd_send_vdm_fake.arg1_val, USB_VID_GOOGLE); + zassert_equal(pd_send_vdm_fake.arg2_val, VDO_CMD_FLASH_ERASE); + zassert_equal(pd_send_vdm_fake.arg3_val, NULL); + zassert_equal(pd_send_vdm_fake.arg4_val, 0); +} + +ZTEST_USER(usb_pd_host_cmd, test_hc_remote_flash__fw_sig_subcmd) +{ + const struct ec_params_usb_pd_fw_update p = { + .cmd = USB_PD_FW_ERASE_SIG, + .port = TEST_PORT, + }; + + struct host_cmd_handler_args args = + BUILD_HOST_COMMAND_PARAMS(EC_CMD_USB_PD_FW_UPDATE, 0, p); + zassert_ok(host_command_process(&args)); + + zassert_equal(pd_send_vdm_fake.call_count, 1); + zassert_equal(pd_send_vdm_fake.arg0_val, TEST_PORT); + zassert_equal(pd_send_vdm_fake.arg1_val, USB_VID_GOOGLE); + zassert_equal(pd_send_vdm_fake.arg2_val, VDO_CMD_ERASE_SIG); + zassert_equal(pd_send_vdm_fake.arg3_val, NULL); + zassert_equal(pd_send_vdm_fake.arg4_val, 0); +} + +ZTEST_USER(usb_pd_host_cmd, test_hc_remote_flash__fw_flash_write_subcmd) +{ + struct params_wrapper { + struct { + struct ec_params_usb_pd_fw_update p; + uint32_t payload; + }; + }; + + struct params_wrapper params = { + .p = { + .cmd = USB_PD_FW_FLASH_WRITE, + .port = TEST_PORT, + /* Arbitrary data size (must be multiple of 4) */ + .size = 4, + }, + /* Arbitrary payload */ + .payload = 0x1, + }; + + struct host_cmd_handler_args args = + BUILD_HOST_COMMAND_PARAMS(EC_CMD_USB_PD_FW_UPDATE, 0, params); + zassert_ok(host_command_process(&args)); + + zassert_equal(pd_send_vdm_fake.call_count, 1); + zassert_equal(pd_send_vdm_fake.arg0_val, TEST_PORT); + zassert_equal(pd_send_vdm_fake.arg1_val, USB_VID_GOOGLE); + zassert_equal(pd_send_vdm_fake.arg2_val, VDO_CMD_FLASH_WRITE); + + /* Sent one 32-bit word */ + zassert_equal(pd_send_vdm_fake.arg4_val, 1); +} + +ZTEST_USER(usb_pd_host_cmd, test_hc_remote_flash__bad_port) +{ + const struct ec_params_usb_pd_fw_update p = { + /* Arbitrary subcmd */ + .cmd = USB_PD_FW_ERASE_SIG, + .port = -1, + }; + + struct host_cmd_handler_args args = + BUILD_HOST_COMMAND_PARAMS(EC_CMD_USB_PD_FW_UPDATE, 0, p); + + zassert_equal(host_command_process(&args), EC_RES_INVALID_PARAM); + zassert_equal(pd_send_vdm_fake.call_count, 0); +} + +ZTEST_USER(usb_pd_host_cmd, test_hc_remote_flash__size_too_big) +{ + const struct ec_params_usb_pd_fw_update p = { + /* Arbitrary subcmd */ + .cmd = USB_PD_FW_ERASE_SIG, + .port = TEST_PORT, + .size = INT_MAX, + }; + + struct host_cmd_handler_args args = + BUILD_HOST_COMMAND_PARAMS(EC_CMD_USB_PD_FW_UPDATE, 0, p); + + zassert_equal(host_command_process(&args), EC_RES_INVALID_PARAM); + zassert_equal(pd_send_vdm_fake.call_count, 0); +} + +ZTEST_USER(usb_pd_host_cmd, test_hc_remote_flash__active_charging_port_no_batt) +{ + const struct ec_params_usb_pd_fw_update p = { + /* Arbitrary subcmd */ + .cmd = USB_PD_FW_ERASE_SIG, + .port = TEST_PORT, + }; + + struct host_cmd_handler_args args = + BUILD_HOST_COMMAND_PARAMS(EC_CMD_USB_PD_FW_UPDATE, 0, p); + + usb_pd_host_cmd_test_set_battery_present(false); + charge_manager_get_active_charge_port_fake.return_val = TEST_PORT; + + zassert_equal(host_command_process(&args), EC_RES_UNAVAILABLE); + zassert_equal(charge_manager_get_active_charge_port_fake.call_count, 1); + zassert_equal(pd_send_vdm_fake.call_count, 0); +} + +ZTEST_USER(usb_pd_host_cmd, test_hc_remote_flash__bad_cmd) +{ + const struct ec_params_usb_pd_fw_update p = { + .cmd = -1, + .port = TEST_PORT, + }; + + struct host_cmd_handler_args args = + BUILD_HOST_COMMAND_PARAMS(EC_CMD_USB_PD_FW_UPDATE, 0, p); + + zassert_equal(host_command_process(&args), EC_RES_INVALID_PARAM); + zassert_equal(pd_send_vdm_fake.call_count, 0); +} + +ZTEST_USER(usb_pd_host_cmd, + test_hc_remote_flash__fw_flash_write_subcmd_bad_data_size) +{ + struct params_wrapper { + struct { + struct ec_params_usb_pd_fw_update p; + uint32_t payload; + }; + }; + + struct params_wrapper params = { + .p = { + .cmd = USB_PD_FW_FLASH_WRITE, + .port = TEST_PORT, + /* Make size not multiple of 4 */ + .size = 3, + }, + /* Arbitrary payload */ + .payload = 0x1, + }; + + struct host_cmd_handler_args args = + BUILD_HOST_COMMAND_PARAMS(EC_CMD_USB_PD_FW_UPDATE, 0, params); + zassert_equal(host_command_process(&args), EC_RES_INVALID_PARAM); + + zassert_equal(pd_send_vdm_fake.call_count, 0); +} ZTEST_USER(usb_pd_host_cmd, test_host_command_hc_pd_ports) { @@ -22,5 +226,15 @@ ZTEST_USER(usb_pd_host_cmd, test_host_command_hc_pd_ports) zassert_equal(response.num_ports, CONFIG_USB_PD_PORT_MAX_COUNT, NULL); } -ZTEST_SUITE(usb_pd_host_cmd, drivers_predicate_post_main, NULL, NULL, NULL, - NULL); +static void usb_pd_host_cmd_before_after(void *test_data) +{ + ARG_UNUSED(test_data); + + usb_pd_host_cmd_test_set_battery_present(true); + + RESET_FAKE(pd_send_vdm); + RESET_FAKE(charge_manager_get_active_charge_port); +} + +ZTEST_SUITE(usb_pd_host_cmd, drivers_predicate_post_main, NULL, + usb_pd_host_cmd_before_after, usb_pd_host_cmd_before_after, NULL); |