diff options
author | Edward Hill <ecgh@chromium.org> | 2020-11-29 16:12:59 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-12-01 18:19:40 +0000 |
commit | 725de7c47295adf7bc6a770c9867e4d413d1fafd (patch) | |
tree | 74ae39f6d337f994dabca14e4b6a2741dd2f5748 /test/usb_pe_drp.c | |
parent | a2390f3c505a4684535c08da27736099a63850fe (diff) | |
download | chrome-ec-725de7c47295adf7bc6a770c9867e4d413d1fafd.tar.gz |
test: Improve test_send_caps_error in usb_pe_drp
Better mock tx and rx messages, add sop type.
BUG=b:161835483 b:173791979
BRANCH=none
TEST=make run-usb_pe_drp
Signed-off-by: Edward Hill <ecgh@chromium.org>
Change-Id: If1f91b6385d6841d662a8a6262af6382645da92e
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2553343
Reviewed-by: Diana Z <dzigterman@chromium.org>
Diffstat (limited to 'test/usb_pe_drp.c')
-rw-r--r-- | test/usb_pe_drp.c | 169 |
1 files changed, 105 insertions, 64 deletions
diff --git a/test/usb_pe_drp.c b/test/usb_pe_drp.c index f5ced4c7b1..19bad83edf 100644 --- a/test/usb_pe_drp.c +++ b/test/usb_pe_drp.c @@ -49,92 +49,131 @@ void before_test(void) task_wait_event(SECOND); } +/* + * This assumes data messages only contain a single data object (uint32_t data). + * TODO: Add support for multiple data objects (when a test is added here that + * needs it). + */ +test_static void rx_message(enum pd_msg_type sop, + enum pd_ctrl_msg_type ctrl_msg, + enum pd_data_msg_type data_msg, + enum pd_power_role prole, + enum pd_data_role drole, + uint32_t data) +{ + int type, cnt; + + if (ctrl_msg != 0) { + type = ctrl_msg; + cnt = 0; + } else { + type = data_msg; + cnt = 1; + } + rx_emsg[PORT0].header = (PD_HEADER_SOP(sop) + | PD_HEADER(type, prole, drole, 0, cnt, PD_REV30, 0)); + rx_emsg[PORT0].len = cnt * 4; + *(uint32_t *)rx_emsg[PORT0].buf = data; + mock_prl_message_received(PORT0); +} + + test_static int test_send_caps_error(void) { + int i; + /* Enable PE as source, expect SOURCE_CAP. */ mock_pd_port[PORT0].power_role = PD_ROLE_SOURCE; mock_tc_port[PORT0].pd_enable = 1; mock_tc_port[PORT0].vconn_src = true; - task_wait_event(10 * MSEC); - TEST_EQ(fake_prl_get_last_sent_data_msg_type(PORT0), - PD_DATA_SOURCE_CAP, "%d"); - fake_prl_message_sent(PORT0); + TEST_EQ(mock_prl_wait_for_tx_msg(PORT0, TCPC_TX_SOP, + 0, PD_DATA_SOURCE_CAP, 20 * MSEC), + EC_SUCCESS, "%d"); + mock_prl_message_sent(PORT0); task_wait_event(10 * MSEC); /* REQUEST 5V, expect ACCEPT, PS_RDY. */ - rx_emsg[PORT0].header = PD_HEADER(PD_DATA_REQUEST, PD_ROLE_SINK, - PD_ROLE_UFP, 0, - 1, PD_REV30, 0); - rx_emsg[PORT0].len = 4; - *(uint32_t *)rx_emsg[PORT0].buf = RDO_FIXED(1, 500, 500, 0); - fake_prl_message_received(PORT0); - task_wait_event(10 * MSEC); - TEST_EQ(fake_prl_get_last_sent_ctrl_msg(PORT0), - PD_CTRL_ACCEPT, "%d"); - fake_prl_message_sent(PORT0); - task_wait_event(10 * MSEC); - TEST_EQ(fake_prl_get_last_sent_ctrl_msg(PORT0), - PD_CTRL_PS_RDY, "%d"); - fake_prl_message_sent(PORT0); - task_wait_event(30 * MSEC); - - /* Expect VENDOR_DEF, reply NOT_SUPPORTED. */ - TEST_EQ(fake_prl_get_last_sent_data_msg_type(PORT0), - PD_DATA_VENDOR_DEF, "%d"); - fake_prl_message_sent(PORT0); - task_wait_event(10 * MSEC); - rx_emsg[PORT0].header = PD_HEADER(PD_CTRL_NOT_SUPPORTED, PD_ROLE_SINK, - PD_ROLE_UFP, 2, - 0, PD_REV30, 0); - rx_emsg[PORT0].len = 0; - fake_prl_message_received(PORT0); - task_wait_event(30 * MSEC); + rx_message(PD_MSG_SOP, 0, PD_DATA_REQUEST, + PD_ROLE_SINK, PD_ROLE_UFP, RDO_FIXED(1, 500, 500, 0)); + TEST_EQ(mock_prl_wait_for_tx_msg(PORT0, TCPC_TX_SOP, + PD_CTRL_ACCEPT, 0, 20 * MSEC), + EC_SUCCESS, "%d"); + mock_prl_message_sent(PORT0); + TEST_EQ(mock_prl_wait_for_tx_msg(PORT0, TCPC_TX_SOP, + PD_CTRL_PS_RDY, 0, 20 * MSEC), + EC_SUCCESS, "%d"); + mock_prl_message_sent(PORT0); + + /* + * Expect VENDOR_DEF for cable identity, simulate no cable (so no + * GoodCRC, so ERR_TCH_XMIT). Don't reply NOT_SUPPORTED, since the spec + * says a cable never does that. + * TODO: Add tests for cable replying to identity, and replying + * NOT_SUPPORTED (since we should be robust to cables doing the wrong + * thing). + */ + TEST_EQ(mock_prl_wait_for_tx_msg(PORT0, TCPC_TX_SOP_PRIME, + 0, PD_DATA_VENDOR_DEF, 20 * MSEC), + EC_SUCCESS, "%d"); + mock_prl_report_error(PORT0, ERR_TCH_XMIT, TCPC_TX_SOP_PRIME); /* Expect GET_SOURCE_CAP, reply NOT_SUPPORTED. */ - TEST_EQ(fake_prl_get_last_sent_ctrl_msg(PORT0), - PD_CTRL_GET_SOURCE_CAP, "%d"); - fake_prl_message_sent(PORT0); + TEST_EQ(mock_prl_wait_for_tx_msg(PORT0, TCPC_TX_SOP, + PD_CTRL_GET_SOURCE_CAP, 0, 20 * MSEC), + EC_SUCCESS, "%d"); + mock_prl_message_sent(PORT0); task_wait_event(10 * MSEC); - rx_emsg[PORT0].header = PD_HEADER(PD_CTRL_NOT_SUPPORTED, PD_ROLE_SINK, - PD_ROLE_UFP, 2, - 0, PD_REV30, 0); - rx_emsg[PORT0].len = 0; - fake_prl_message_received(PORT0); - task_wait_event(200 * MSEC); + rx_message(PD_MSG_SOP, PD_CTRL_NOT_SUPPORTED, 0, + PD_ROLE_SINK, PD_ROLE_UFP, 0); /* * Expect GET_SINK_CAP, reply with a simple Sink Cap since sink partners * must support this message. */ - TEST_EQ(fake_prl_get_last_sent_ctrl_msg(PORT0), - PD_CTRL_GET_SINK_CAP, "%d"); - fake_prl_message_sent(PORT0); + TEST_EQ(mock_prl_wait_for_tx_msg(PORT0, TCPC_TX_SOP, + PD_CTRL_GET_SINK_CAP, 0, 20 * MSEC), + EC_SUCCESS, "%d"); + mock_prl_message_sent(PORT0); + task_wait_event(10 * MSEC); + rx_message(PD_MSG_SOP, 0, PD_DATA_SINK_CAP, + PD_ROLE_SINK, PD_ROLE_UFP, + PDO_FIXED(5000, 500, PDO_FIXED_COMM_CAP)); + + /* + * Cable identity discovery is attempted 6 times total. 1 was done + * above, so expect 5 more now. + */ + for (i = 0; i < 5; i++) { + TEST_EQ(mock_prl_wait_for_tx_msg(PORT0, TCPC_TX_SOP_PRIME, + 0, PD_DATA_VENDOR_DEF, + 60 * MSEC), + EC_SUCCESS, "%d"); + mock_prl_report_error(PORT0, ERR_TCH_XMIT, TCPC_TX_SOP_PRIME); + } + + /* Expect VENDOR_DEF for partner identity, reply NOT_SUPPORTED. */ + TEST_EQ(mock_prl_wait_for_tx_msg(PORT0, TCPC_TX_SOP, + 0, PD_DATA_VENDOR_DEF, 20 * MSEC), + EC_SUCCESS, "%d"); + mock_prl_message_sent(PORT0); task_wait_event(10 * MSEC); - rx_emsg[PORT0].header = PD_HEADER(PD_DATA_SINK_CAP, PD_ROLE_SINK, - PD_ROLE_UFP, 2, - 1, PD_REV30, 0); - rx_emsg[PORT0].len = 4; - *(uint32_t *)rx_emsg[PORT0].buf = PDO_FIXED(5000, 500, - PDO_FIXED_COMM_CAP); - fake_prl_message_received(PORT0); - task_wait_event(200 * MSEC); + rx_message(PD_MSG_SOP, PD_CTRL_NOT_SUPPORTED, 0, + PD_ROLE_SINK, PD_ROLE_UFP, 0); + + task_wait_event(5 * SECOND); /* * Now connected. Send GET_SOURCE_CAP, to check how error sending * SOURCE_CAP is handled. */ - rx_emsg[PORT0].header = PD_HEADER(PD_CTRL_GET_SOURCE_CAP, PD_ROLE_SINK, - PD_ROLE_UFP, 3, - 0, PD_REV30, 0); - rx_emsg[PORT0].len = 0; - fake_prl_message_received(PORT0); - task_wait_event(10 * MSEC); - TEST_EQ(fake_prl_get_last_sent_data_msg_type(PORT0), - PD_DATA_SOURCE_CAP, "%d"); + rx_message(PD_MSG_SOP, PD_CTRL_GET_SOURCE_CAP, 0, + PD_ROLE_SINK, PD_ROLE_UFP, 0); + TEST_EQ(mock_prl_wait_for_tx_msg(PORT0, TCPC_TX_SOP, + 0, PD_DATA_SOURCE_CAP, 20 * MSEC), + EC_SUCCESS, "%d"); /* Simulate error sending SOURCE_CAP. */ - fake_prl_report_error(PORT0, ERR_TCH_XMIT); - task_wait_event(20 * MSEC); + mock_prl_report_error(PORT0, ERR_TCH_XMIT, TCPC_TX_SOP); /* * Expect SOFT_RESET. @@ -143,9 +182,11 @@ test_static int test_send_caps_error(void) * "The PE_SRC_Send_Soft_Reset state Shall be entered from any state * when ... A Message has not been sent after retries to the Sink" */ - TEST_EQ(fake_prl_get_last_sent_ctrl_msg(PORT0), - PD_CTRL_SOFT_RESET, "%d"); - fake_prl_message_sent(PORT0); + TEST_EQ(mock_prl_wait_for_tx_msg(PORT0, TCPC_TX_SOP, + PD_CTRL_SOFT_RESET, 0, 20 * MSEC), + EC_SUCCESS, "%d"); + mock_prl_message_sent(PORT0); + task_wait_event(5 * SECOND); return EC_SUCCESS; |