diff options
author | Paul Fagerburg <pfagerburg@google.com> | 2020-07-06 14:33:45 -0600 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-07-20 23:32:08 +0000 |
commit | 565fa5f2fd66c8eb64bb8c009a865380029e6666 (patch) | |
tree | fbdc8b3036d8b1c4260d3519509bd82225d66aef /test | |
parent | 395e6112a995c017c899ecb3f594cb675a516f7e (diff) | |
download | chrome-ec-565fa5f2fd66c8eb64bb8c009a865380029e6666.tar.gz |
TCPMv2: add unit tests for packet discard logic
Add unit tests for the packet discard logic for packets while going
into SinkTxNG.
BUG=b:160622527, b:161174072
BRANCH=None
TEST=`TEST_LIST_HOST=usb_prl make runhosttests`
Signed-off-by: Paul Fagerburg <pfagerburg@chromium.org>
Change-Id: Ied7689d2fe40da93069e58b53ea32e053ab887b8
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2300690
Reviewed-by: Jett Rink <jettrink@chromium.org>
Diffstat (limited to 'test')
-rw-r--r-- | test/usb_prl.c | 127 |
1 files changed, 126 insertions, 1 deletions
diff --git a/test/usb_prl.c b/test/usb_prl.c index 702aa8ec64..2e7406b4c3 100644 --- a/test/usb_prl.c +++ b/test/usb_prl.c @@ -6,6 +6,7 @@ */ #include "common.h" #include "task.h" +#include "tcpci.h" #include "tcpm.h" #include "test_util.h" #include "timer.h" @@ -18,6 +19,9 @@ #include "usb_tc_sm.h" #include "util.h" #include "mock/tcpc_mock.h" +#include "mock/tcpm_mock.h" +#include "mock/usb_tc_sm_mock.h" +#include "mock/usb_pe_sm_mock.h" #define PORT0 0 @@ -28,14 +32,136 @@ const struct tcpc_config_t tcpc_config[CONFIG_USB_PD_PORT_MAX_COUNT] = { }, }; +static void enable_prl(int port, int en) +{ + tcpm_set_rx_enable(port, en); + + mock_tc_port[port].pd_enable = en; + + task_wait_event(10*MSEC); + + prl_set_rev(port, TCPC_TX_SOP, mock_tc_port[port].rev); +} + +static int test_receive_control_msg(void) +{ + int port = PORT0; + uint16_t header = PD_HEADER(PD_CTRL_DR_SWAP, + mock_tc_port[port].power_role, + mock_tc_port[port].data_role, + mock_tc_port[port].msg_rx_id, + 0, mock_tc_port[port].rev, 0); + + /* Set up the message to be received. */ + mock_tcpm_rx_msg(port, header, 0, NULL); + + /* Process the message. */ + task_wait_event(10*MSEC); + + /* Check results. */ + TEST_NE(mock_pe_port[port].mock_pe_message_received, 0, "%d"); + TEST_EQ(header, rx_emsg[port].header, "%d"); + TEST_EQ(rx_emsg[port].len, 0, "%d"); + + TEST_LE(mock_pe_port[port].mock_pe_error, 0, "%d"); + TEST_EQ(mock_pe_port[port].mock_pe_message_discarded, 0, "%d"); + TEST_EQ(mock_pe_port[port].mock_got_soft_reset, 0, "%d"); + TEST_EQ(mock_pe_port[port].mock_pe_got_hard_reset, 0, "%d"); + TEST_EQ(mock_pe_port[port].mock_pe_hard_reset_sent, 0, "%d"); + + return EC_SUCCESS; +} + +static int test_send_control_msg(void) +{ + int port = PORT0; + + /* Set up the message to be sent. */ + prl_send_ctrl_msg(port, TCPC_TX_SOP, PD_CTRL_ACCEPT); + task_wait_event(MSEC); + /* Simulate the TX complete that the PD_INT handler would signal */ + pd_transmit_complete(port, TCPC_TX_COMPLETE_SUCCESS); + + task_wait_event(10*MSEC); + + /* Check results. */ + TEST_NE(mock_pe_port[port].mock_pe_message_sent, 0, "%d"); + TEST_LE(mock_pe_port[port].mock_pe_error, 0, "%d"); + TEST_EQ(mock_pe_port[port].mock_pe_message_discarded, 0, "%d"); + TEST_EQ(mock_pe_port[port].mock_got_soft_reset, 0, "%d"); + TEST_EQ(mock_pe_port[port].mock_pe_got_hard_reset, 0, "%d"); + TEST_EQ(mock_pe_port[port].mock_pe_hard_reset_sent, 0, "%d"); + + return EC_SUCCESS; +} + +static int test_discard_queued_tx_when_rx_happens(void) +{ + int port = PORT0; + uint16_t header = PD_HEADER(PD_CTRL_DR_SWAP, + mock_tc_port[port].power_role, + mock_tc_port[port].data_role, + mock_tc_port[port].msg_rx_id, + 0, mock_tc_port[port].rev, 0); + uint8_t *buf = tx_emsg[port].buf; + uint8_t len = 8; + uint8_t i = 0; + + /* Set up the message to be sent. */ + for (i = 0 ; i < len ; i++) + buf[i] = (uint8_t)i; + + tx_emsg[port].len = len; + prl_send_data_msg(port, TCPC_TX_SOP, PD_DATA_SOURCE_CAP); + + /* Set up the message to be received. */ + mock_tcpm_rx_msg(port, header, 0, NULL); + + /* Process the message. */ + task_wait_event(10*MSEC); + + /* Check results. Source should have discarded its message queued up + * to TX, and should have received the message from the sink. + */ + TEST_NE(mock_pe_port[port].mock_pe_message_discarded, 0, "%d"); + TEST_NE(mock_pe_port[port].mock_pe_message_received, 0, "%d"); + TEST_EQ(mock_pe_port[port].mock_pe_message_sent, 0, "%d"); + + TEST_LE(mock_pe_port[port].mock_pe_error, 0, "%d"); + TEST_EQ(mock_pe_port[port].mock_got_soft_reset, 0, "%d"); + TEST_EQ(mock_pe_port[port].mock_pe_got_hard_reset, 0, "%d"); + TEST_EQ(mock_pe_port[port].mock_pe_hard_reset_sent, 0, "%d"); + + return EC_SUCCESS; +} + void before_test(void) { + mock_tc_port_reset(); + mock_tc_port[PORT0].rev = PD_REV30; + mock_tc_port[PORT0].power_role = PD_ROLE_SOURCE; + mock_tc_port[PORT0].data_role = PD_ROLE_DFP; + + mock_tcpm_reset(); + mock_pe_port_reset(); + + prl_reset(PORT0); + enable_prl(PORT0, 1); +} + +void after_test(void) +{ + enable_prl(PORT0, 0); } void run_test(int argc, char **argv) { + RUN_TEST(test_receive_control_msg); + RUN_TEST(test_send_control_msg); + RUN_TEST(test_discard_queued_tx_when_rx_happens); /* TODO add tests here */ + /* Do basic state machine sanity checks last. */ RUN_TEST(test_prl_no_parent_cycles); RUN_TEST(test_prl_no_empty_state); @@ -43,4 +169,3 @@ void run_test(int argc, char **argv) test_print_result(); } - |