summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorPaul Fagerburg <pfagerburg@google.com>2020-07-06 14:33:45 -0600
committerCommit Bot <commit-bot@chromium.org>2020-07-20 23:32:08 +0000
commit565fa5f2fd66c8eb64bb8c009a865380029e6666 (patch)
treefbdc8b3036d8b1c4260d3519509bd82225d66aef /test
parent395e6112a995c017c899ecb3f594cb675a516f7e (diff)
downloadchrome-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.c127
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();
}
-