summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Brockus <dbrockus@google.com>2021-03-19 11:10:23 -0600
committerCommit Bot <commit-bot@chromium.org>2021-03-23 19:23:58 +0000
commitdb67bdf3150f3dab2377da6b24b9cfed9c428e1b (patch)
tree428c8fda763b2c7bc7673437687761056f4cdc96
parent99912c96addc047faeb5de6f95e6659ca268fd48 (diff)
downloadchrome-ec-db67bdf3150f3dab2377da6b24b9cfed9c428e1b.tar.gz
TCPMv2: Compliance Unit Test - allow PROC.PD.E3 flexibility
Allow the startup messages to be optional and don't require a specific ordering. Also add PR_Swap when PD_ROLE_UFP. BUG=none BRANCH=none TEST=make run-usb_tcpmv2_compliance Signed-off-by: Denis Brockus <dbrockus@google.com> Change-Id: Ifef6fa558a789c2ce34a9f9fbf38529dc90d5e6f Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2774580 Tested-by: Denis Brockus <dbrockus@chromium.org> Auto-Submit: Denis Brockus <dbrockus@chromium.org> Reviewed-by: Diana Z <dzigterman@chromium.org> Commit-Queue: Diana Z <dzigterman@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2782371 Tested-by: Abe Levkoy <alevkoy@chromium.org> Reviewed-by: Abe Levkoy <alevkoy@chromium.org> Commit-Queue: Abe Levkoy <alevkoy@chromium.org>
-rw-r--r--common/mock/tcpci_i2c_mock.c13
-rw-r--r--test/usb_tcpmv2_compliance_common.c171
2 files changed, 130 insertions, 54 deletions
diff --git a/common/mock/tcpci_i2c_mock.c b/common/mock/tcpci_i2c_mock.c
index 0cdaf8e3a4..a9cc09fb54 100644
--- a/common/mock/tcpci_i2c_mock.c
+++ b/common/mock/tcpci_i2c_mock.c
@@ -291,12 +291,15 @@ int verify_tcpci_possible_tx(struct possible_tx possible[],
int *msg_len,
int timeout)
{
+ bool assert_on_timeout = true;
uint64_t end_time;
*found_index = -1;
- if (timeout <= 0)
+ if (timeout <= 0) {
timeout = VERIFY_TIMEOUT;
+ assert_on_timeout = false;
+ }
end_time = get_time().val + timeout;
/*
@@ -348,12 +351,14 @@ int verify_tcpci_possible_tx(struct possible_tx possible[],
tcpci_regs[TCPC_REG_TRANSMIT].value = 0;
return EC_SUCCESS;
}
- break;
+ return EC_ERROR_UNKNOWN;
}
task_wait_event(5 * MSEC);
}
- TEST_ASSERT(0);
- return EC_ERROR_UNKNOWN;
+ if (assert_on_timeout)
+ TEST_ASSERT(0);
+
+ return EC_ERROR_TIMEOUT;
}
void mock_tcpci_receive(enum pd_msg_type sop, uint16_t header,
diff --git a/test/usb_tcpmv2_compliance_common.c b/test/usb_tcpmv2_compliance_common.c
index 5273948de3..965bafacc6 100644
--- a/test/usb_tcpmv2_compliance_common.c
+++ b/test/usb_tcpmv2_compliance_common.c
@@ -364,60 +364,131 @@ int proc_pd_e3(void)
*/
int handle_attach_expected_msgs(enum pd_data_role data_role)
{
+ int rv;
+ int found_index;
+ struct possible_tx possible[4];
+
if (data_role == PD_ROLE_DFP) {
- TEST_EQ(verify_tcpci_transmit(TCPC_TX_SOP,
- PD_CTRL_GET_SOURCE_CAP, 0),
- EC_SUCCESS, "%d");
- mock_set_alert(TCPC_REG_ALERT_TX_SUCCESS);
- task_wait_event(10 * MSEC);
- partner_send_msg(PD_MSG_SOP, PD_DATA_SOURCE_CAP, 1, 0, &pdo);
-
- TEST_EQ(verify_tcpci_transmit(TCPC_TX_SOP,
- PD_CTRL_GET_SINK_CAP, 0),
- EC_SUCCESS, "%d");
- mock_set_alert(TCPC_REG_ALERT_TX_SUCCESS);
- task_wait_event(10 * MSEC);
- partner_send_msg(PD_MSG_SOP, PD_DATA_SINK_CAP, 1, 0, &pdo);
-
- TEST_EQ(verify_tcpci_transmit(TCPC_TX_SOP_PRIME, 0,
- PD_DATA_VENDOR_DEF),
- EC_SUCCESS, "%d");
- mock_set_alert(TCPC_REG_ALERT_TX_SUCCESS);
- task_wait_event(10 * MSEC);
- partner_send_msg(PD_MSG_SOP_PRIME, PD_CTRL_NOT_SUPPORTED, 0, 0,
- NULL);
-
- TEST_EQ(verify_tcpci_transmit(TCPC_TX_SOP, 0,
- PD_DATA_VENDOR_DEF),
- EC_SUCCESS, "%d");
- mock_set_alert(TCPC_REG_ALERT_TX_SUCCESS);
- task_wait_event(10 * MSEC);
- partner_send_msg(PD_MSG_SOP, PD_CTRL_NOT_SUPPORTED, 0, 0, NULL);
+ possible[0].tx_type = TCPC_TX_SOP;
+ possible[0].ctrl_msg = PD_CTRL_GET_SOURCE_CAP;
+ possible[0].data_msg = 0;
+
+ possible[1].tx_type = TCPC_TX_SOP;
+ possible[1].ctrl_msg = PD_CTRL_GET_SINK_CAP;
+ possible[1].data_msg = 0;
+
+ possible[2].tx_type = TCPC_TX_SOP_PRIME;
+ possible[2].ctrl_msg = 0;
+ possible[2].data_msg = PD_DATA_VENDOR_DEF;
+
+ possible[3].tx_type = TCPC_TX_SOP;
+ possible[3].ctrl_msg = 0;
+ possible[3].data_msg = PD_DATA_VENDOR_DEF;
+
+ do {
+ rv = verify_tcpci_possible_tx(possible,
+ 4,
+ &found_index,
+ NULL,
+ 0,
+ NULL,
+ -1);
+
+ TEST_NE(rv, EC_ERROR_UNKNOWN, "%d");
+ if (rv == EC_ERROR_TIMEOUT)
+ break;
+
+ mock_set_alert(TCPC_REG_ALERT_TX_SUCCESS);
+ task_wait_event(10 * MSEC);
+
+ switch (found_index) {
+ case 0: /* PD_MSG_SOP PD_CTRL_GET_SOURCE_CAP */
+ partner_send_msg(PD_MSG_SOP,
+ PD_DATA_SOURCE_CAP,
+ 1, 0, &pdo);
+ break;
+ case 1: /* PD_MSG_SOP PD_CTRL_GET_SINK_CAP */
+ partner_send_msg(PD_MSG_SOP,
+ PD_DATA_SINK_CAP,
+ 1, 0, &pdo);
+ break;
+ case 2: /* TCPC_TX_SOP_PRIME PD_DATA_VENDOR_DEF */
+ partner_send_msg(PD_MSG_SOP_PRIME,
+ PD_CTRL_NOT_SUPPORTED,
+ 0, 0, NULL);
+ break;
+ case 3: /* TCPC_TX_SOP PD_DATA_VENDOR_DEF */
+ partner_send_msg(PD_MSG_SOP,
+ PD_CTRL_NOT_SUPPORTED,
+ 0, 0, NULL);
+ break;
+ default:
+ TEST_ASSERT(0);
+ break;
+ }
+ } while (rv != EC_ERROR_TIMEOUT);
} else if (data_role == PD_ROLE_UFP) {
- int vcs;
-
- TEST_EQ(verify_tcpci_transmit(TCPC_TX_SOP,
- PD_CTRL_GET_SINK_CAP, 0),
- EC_SUCCESS, "%d");
- mock_set_alert(TCPC_REG_ALERT_TX_SUCCESS);
- task_wait_event(10 * MSEC);
- partner_send_msg(PD_MSG_SOP, PD_DATA_SINK_CAP, 1, 0, &pdo);
-
- TEST_EQ(verify_tcpci_transmit(TCPC_TX_SOP, PD_CTRL_DR_SWAP, 0),
- EC_SUCCESS, "%d");
- mock_set_alert(TCPC_REG_ALERT_TX_SUCCESS);
- task_wait_event(10 * MSEC);
- partner_send_msg(PD_MSG_SOP, PD_CTRL_REJECT, 0, 0, NULL);
-
- for (vcs = 0; vcs < 4; vcs++) {
- TEST_EQ(verify_tcpci_transmit(TCPC_TX_SOP,
- PD_CTRL_VCONN_SWAP, 0),
- EC_SUCCESS, "%d");
+ int vcs = 0;
+
+ possible[0].tx_type = TCPC_TX_SOP;
+ possible[0].ctrl_msg = PD_CTRL_GET_SINK_CAP;
+ possible[0].data_msg = 0;
+
+ possible[1].tx_type = TCPC_TX_SOP;
+ possible[1].ctrl_msg = PD_CTRL_DR_SWAP;
+ possible[1].data_msg = 0;
+
+ possible[2].tx_type = TCPC_TX_SOP;
+ possible[2].ctrl_msg = PD_CTRL_PR_SWAP;
+ possible[2].data_msg = 0;
+
+ possible[3].tx_type = TCPC_TX_SOP;
+ possible[3].ctrl_msg = PD_CTRL_VCONN_SWAP;
+ possible[3].data_msg = 0;
+
+ do {
+ rv = verify_tcpci_possible_tx(possible,
+ 4,
+ &found_index,
+ NULL,
+ 0,
+ NULL,
+ -1);
+
+ TEST_NE(rv, EC_ERROR_UNKNOWN, "%d");
+ if (rv == EC_ERROR_TIMEOUT)
+ break;
+
mock_set_alert(TCPC_REG_ALERT_TX_SUCCESS);
task_wait_event(10 * MSEC);
- partner_send_msg(PD_MSG_SOP, PD_CTRL_REJECT, 0, 0,
- NULL);
- }
+
+ switch (found_index) {
+ case 0: /* PD_MSG_SOP PD_CTRL_GET_SINK_CAP */
+ partner_send_msg(PD_MSG_SOP,
+ PD_DATA_SINK_CAP,
+ 1, 0, &pdo);
+ break;
+ case 1: /* TCPC_TX_SOP PD_CTRL_DR_SWAP */
+ partner_send_msg(PD_MSG_SOP,
+ PD_CTRL_REJECT,
+ 0, 0, NULL);
+ break;
+ case 2: /* PD_MSG_SOP PD_CTRL_PR_SWAP */
+ partner_send_msg(PD_MSG_SOP,
+ PD_CTRL_REJECT,
+ 0, 0, NULL);
+ break;
+ case 3: /* TCPC_TX_SOP PD_CTRL_VCONN_SWAP */
+ TEST_LT(vcs++, 4, "%d");
+ partner_send_msg(PD_MSG_SOP,
+ PD_CTRL_REJECT,
+ 0, 0, NULL);
+ break;
+ default:
+ TEST_ASSERT(0);
+ break;
+ }
+ } while (rv != EC_ERROR_TIMEOUT);
}
task_wait_event(1 * SECOND);
return EC_SUCCESS;