summaryrefslogtreecommitdiff
path: root/zephyr/test/drivers/host_cmd
diff options
context:
space:
mode:
authorAaron Massey <aaronmassey@google.com>2022-09-27 16:49:21 -0600
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-09-30 19:58:37 +0000
commite60ea169df800e3ab0ce5b7bfa983626dae75880 (patch)
tree82183989c82c58cda384efbc23d618f8c78a89e6 /zephyr/test/drivers/host_cmd
parenta40a4736a6fc5930e7d00d4367ddf86137b273d9 (diff)
downloadchrome-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.c218
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);