summaryrefslogtreecommitdiff
path: root/test/usb_sm_framework_h3.c
diff options
context:
space:
mode:
authorJack Rosenthal <jrosenth@chromium.org>2021-11-04 12:11:58 -0600
committerCommit Bot <commit-bot@chromium.org>2021-11-05 04:22:34 +0000
commit252457d4b21f46889eebad61d4c0a65331919cec (patch)
tree01856c4d31d710b20e85a74c8d7b5836e35c3b98 /test/usb_sm_framework_h3.c
parent08f5a1e6fc2c9467230444ac9b582dcf4d9f0068 (diff)
downloadchrome-ec-stabilize-14333.B-ish.tar.gz
In the interest of making long-term branch maintenance incur as little technical debt on us as possible, we should not maintain any files on the branch we are not actually using. This has the added effect of making it extremely clear when merging CLs from the main branch when changes have the possibility to affect us. The follow-on CL adds a convenience script to actually pull updates from the main branch and generate a CL for the update. BUG=b:204206272 BRANCH=ish TEST=make BOARD=arcada_ish && make BOARD=drallion_ish Signed-off-by: Jack Rosenthal <jrosenth@chromium.org> Change-Id: I17e4694c38219b5a0823e0a3e55a28d1348f4b18 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3262038 Reviewed-by: Jett Rink <jettrink@chromium.org> Reviewed-by: Tom Hughes <tomhughes@chromium.org>
Diffstat (limited to 'test/usb_sm_framework_h3.c')
-rw-r--r--test/usb_sm_framework_h3.c1002
1 files changed, 0 insertions, 1002 deletions
diff --git a/test/usb_sm_framework_h3.c b/test/usb_sm_framework_h3.c
deleted file mode 100644
index ba544a749a..0000000000
--- a/test/usb_sm_framework_h3.c
+++ /dev/null
@@ -1,1002 +0,0 @@
-/* Copyright 2019 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- *
- * Test USB Type-C VPD and CTVPD module.
- */
-#include "common.h"
-#include "task.h"
-#include "test_util.h"
-#include "timer.h"
-#include "usb_pd.h"
-#include "usb_sm.h"
-#include "usb_tc_sm.h"
-#include "util.h"
-#include "usb_pd_test_util.h"
-#include "vpd_api.h"
-
-/*
- * Test State Hierarchy
- * SM_TEST_A4 transitions to SM_TEST_B4
- * SM_TEST_B4 transitions to SM_TEST_B5
- * SM_TEST_B5 transitions to SM_TEST_B6
- * SM_TEST_B6 transitions to SM_TEST_C
- * SM_TEST_C transitions to SM_TEST_A7
- * SM_TEST_A7 transitions to SM_TEST_A6
- * SM_TEST_A6 transitions to SM_TEST_A5
- * SM_TEST_A5 transitions to SM_TEST_A4
- *
- * --------------------------- ---------------------------
- * | SM_TEST_SUPER_A1 | | SM_TEST_SUPER_B1 |
- * | ----------------------- | | ----------------------- |
- * | | SM_TEST_SUPER_A2 | | | | SM_TEST_SUPER_B2 | |
- * | | ------------------- | | | | ------------------- | |
- * | | |SM_TEST_SUPER_A3 | | | | | |SM_TEST_SUPER_B3 | | |
- * | | | | | | | | | | | |
- * | | | ------------- | | | | | | ------------- | | |
- * | | | | SM_TEST_A4|------------------>| SM_TEST_B4| | | |
- * | | | ------------- | | | | | | ------------- | | |
- * | | | ^ | | | | | |--------|--------| | |
- * | | | | | | | | | | | |
- * | | | -------------- | | | | | \/ | |
- * | | | | SM_TEST_A5 | | | | | | -------------- | |
- * | | | -------------- | | | | | | SM_TEST_B5 | | |
- * | | |--------^--------| | | | | -------------- | |
- * | | | | | | | | | |
- * | | -------------- | | | -----------|----------- |
- * | | | SM_TEST_A6 | | | | \/ |
- * | | -------------- | | | -------------- |
- * | |----------^----------| | | | SM_TEST_B6 | |
- * | | | | -------------- |
- * | -------------- | |--------/----------------|
- * | | SM_TEST_A7 | | /
- * | -------------- | /
- * |------------------^------| /
- * \ /
- * \ \/
- * -------------
- * | SM_TEST_C |
- * -------------
- *
- * test_hierarchy_0: Tests a flat state machine without super states
- * test_hierarchy_1: Tests a hierarchical state machine with 1 super state
- * test_hierarchy_2: Tests a hierarchical state machine with 2 super states
- * test_hierarchy_3: Tests a hierarchical state machine with 3 super states
- *
- */
-
-#define SEQUENCE_SIZE 55
-
-enum state_id {
- ENTER_A1 = 1,
- RUN_A1,
- EXIT_A1,
- ENTER_A2,
- RUN_A2,
- EXIT_A2,
- ENTER_A3,
- RUN_A3,
- EXIT_A3,
- ENTER_A4,
- RUN_A4,
- EXIT_A4,
- ENTER_A5,
- RUN_A5,
- EXIT_A5,
- ENTER_A6,
- RUN_A6,
- EXIT_A6,
- ENTER_A7,
- RUN_A7,
- EXIT_A7,
- ENTER_B1,
- RUN_B1,
- EXIT_B1,
- ENTER_B2,
- RUN_B2,
- EXIT_B2,
- ENTER_B3,
- RUN_B3,
- EXIT_B3,
- ENTER_B4,
- RUN_B4,
- EXIT_B4,
- ENTER_B5,
- RUN_B5,
- EXIT_B5,
- ENTER_B6,
- RUN_B6,
- EXIT_B6,
- ENTER_C,
- RUN_C,
- EXIT_C,
-};
-
-#define PORT0 0
-
-struct sm_ {
- /* struct sm_obj must be first */
- struct sm_ctx ctx;
- int sv_tmp;
- int idx;
- int seq[SEQUENCE_SIZE];
-} sm[1];
-
-enum state {
- SM_TEST_SUPER_A1,
- SM_TEST_SUPER_A2,
- SM_TEST_SUPER_A3,
- SM_TEST_SUPER_B1,
- SM_TEST_SUPER_B2,
- SM_TEST_SUPER_B3,
- SM_TEST_A4,
- SM_TEST_A5,
- SM_TEST_A6,
- SM_TEST_A7,
- SM_TEST_B4,
- SM_TEST_B5,
- SM_TEST_B6,
- SM_TEST_C,
-};
-static const struct usb_state states[];
-
-static struct control {
- usb_state_ptr a3_entry_to;
- usb_state_ptr b3_run_to;
- usb_state_ptr b6_entry_to;
- usb_state_ptr c_entry_to;
- usb_state_ptr c_exit_to;
-} test_control;
-
-static void set_state_sm(const int port, const enum state new_state)
-{
- set_state(port, &sm[port].ctx, &states[new_state]);
-}
-
-static void sm_test_super_A1_entry(const int port)
-{
- sm[port].seq[sm[port].idx++] = ENTER_A1;
-}
-
-static void sm_test_super_A1_run(const int port)
-{
- sm[port].seq[sm[port].idx++] = RUN_A1;
-}
-
-static void sm_test_super_A1_exit(const int port)
-{
- sm[port].seq[sm[port].idx++] = EXIT_A1;
-}
-
-static void sm_test_super_B1_entry(const int port)
-{
- sm[port].seq[sm[port].idx++] = ENTER_B1;
-}
-
-static void sm_test_super_B1_run(const int port)
-{
- sm[port].seq[sm[port].idx++] = RUN_B1;
-}
-
-static void sm_test_super_B1_exit(const int port)
-{
- sm[port].seq[sm[port].idx++] = EXIT_B1;
-}
-
-static void sm_test_super_A2_entry(const int port)
-{
- sm[port].seq[sm[port].idx++] = ENTER_A2;
-}
-
-static void sm_test_super_A2_run(const int port)
-{
- sm[port].seq[sm[port].idx++] = RUN_A2;
-}
-
-static void sm_test_super_A2_exit(const int port)
-{
- sm[port].seq[sm[port].idx++] = EXIT_A2;
-}
-
-
-static void sm_test_super_B2_entry(const int port)
-{
- sm[port].seq[sm[port].idx++] = ENTER_B2;
-}
-
-static void sm_test_super_B2_run(const int port)
-{
- sm[port].seq[sm[port].idx++] = RUN_B2;
-}
-
-static void sm_test_super_B2_exit(const int port)
-{
- sm[port].seq[sm[port].idx++] = EXIT_B2;
-}
-
-static void sm_test_super_A3_entry(const int port)
-{
- sm[port].seq[sm[port].idx++] = ENTER_A3;
- if (test_control.a3_entry_to)
- set_state(port, &sm[port].ctx, test_control.a3_entry_to);
-}
-
-static void sm_test_super_A3_run(const int port)
-{
- sm[port].seq[sm[port].idx++] = RUN_A3;
-}
-
-static void sm_test_super_A3_exit(const int port)
-{
- sm[port].seq[sm[port].idx++] = EXIT_A3;
-}
-
-static void sm_test_super_B3_entry(const int port)
-{
- sm[port].seq[sm[port].idx++] = ENTER_B3;
-}
-
-static void sm_test_super_B3_run(const int port)
-{
- sm[port].seq[sm[port].idx++] = RUN_B3;
- if (test_control.b3_run_to)
- set_state(port, &sm[port].ctx, test_control.b3_run_to);
-}
-
-static void sm_test_super_B3_exit(const int port)
-{
- sm[port].seq[sm[port].idx++] = EXIT_B3;
-}
-
-static void sm_test_A4_entry(const int port)
-{
- sm[port].sv_tmp = 0;
- sm[port].seq[sm[port].idx++] = ENTER_A4;
-}
-
-static void sm_test_A4_run(const int port)
-{
- if (sm[port].sv_tmp == 0) {
- sm[port].sv_tmp = 1;
- sm[port].seq[sm[port].idx++] = RUN_A4;
- } else {
- set_state_sm(port, SM_TEST_B4);
- }
-}
-
-static void sm_test_A4_exit(const int port)
-{
- sm[port].seq[sm[port].idx++] = EXIT_A4;
-}
-
-
-static void sm_test_A5_entry(const int port)
-{
- sm[port].sv_tmp = 0;
- sm[port].seq[sm[port].idx++] = ENTER_A5;
-}
-
-static void sm_test_A5_run(const int port)
-{
- if (sm[port].sv_tmp == 0) {
- sm[port].sv_tmp = 1;
- sm[port].seq[sm[port].idx++] = RUN_A5;
- } else {
- set_state_sm(port, SM_TEST_A4);
- }
-}
-
-static void sm_test_A5_exit(const int port)
-{
- sm[port].seq[sm[port].idx++] = EXIT_A5;
-}
-
-
-static void sm_test_A6_entry(const int port)
-{
- sm[port].sv_tmp = 0;
- sm[port].seq[sm[port].idx++] = ENTER_A6;
-}
-
-static void sm_test_A6_run(const int port)
-{
- if (sm[port].sv_tmp == 0) {
- sm[port].sv_tmp = 1;
- sm[port].seq[sm[port].idx++] = RUN_A6;
- } else {
- set_state_sm(port, SM_TEST_A5);
- }
-}
-
-static void sm_test_A6_exit(const int port)
-{
- sm[port].seq[sm[port].idx++] = EXIT_A6;
-}
-
-static void sm_test_A7_entry(const int port)
-{
- sm[port].sv_tmp = 0;
- sm[port].seq[sm[port].idx++] = ENTER_A7;
-}
-
-static void sm_test_A7_run(const int port)
-{
- if (sm[port].sv_tmp == 0) {
- sm[port].sv_tmp = 1;
- sm[port].seq[sm[port].idx++] = RUN_A7;
- } else {
- set_state_sm(port, SM_TEST_A6);
- }
-}
-
-static void sm_test_A7_exit(const int port)
-{
- sm[port].seq[sm[port].idx++] = EXIT_A7;
-}
-
-static void sm_test_B4_entry(const int port)
-{
- sm[port].sv_tmp = 0;
- sm[port].seq[sm[port].idx++] = ENTER_B4;
-}
-
-static void sm_test_B4_run(const int port)
-{
- if (sm[port].sv_tmp == 0) {
- sm[port].seq[sm[port].idx++] = RUN_B4;
- sm[port].sv_tmp = 1;
- } else {
- set_state_sm(port, SM_TEST_B5);
- }
-}
-
-static void sm_test_B4_exit(const int port)
-{
- sm[port].seq[sm[port].idx++] = EXIT_B4;
-}
-
-
-static void sm_test_B5_entry(const int port)
-{
- sm[port].sv_tmp = 0;
- sm[port].seq[sm[port].idx++] = ENTER_B5;
-}
-
-static void sm_test_B5_run(const int port)
-{
- if (sm[port].sv_tmp == 0) {
- sm[port].sv_tmp = 1;
- sm[port].seq[sm[port].idx++] = RUN_B5;
- } else {
- set_state_sm(port, SM_TEST_B6);
- }
-}
-
-static void sm_test_B5_exit(const int port)
-{
- sm[port].seq[sm[port].idx++] = EXIT_B5;
-}
-
-
-static void sm_test_B6_entry(const int port)
-{
- sm[port].sv_tmp = 0;
- sm[port].seq[sm[port].idx++] = ENTER_B6;
- if (test_control.b6_entry_to)
- set_state(port, &sm[port].ctx, test_control.b6_entry_to);
-}
-
-static void sm_test_B6_run(const int port)
-{
- if (sm[port].sv_tmp == 0) {
- sm[port].sv_tmp = 1;
- sm[port].seq[sm[port].idx++] = RUN_B6;
- } else {
- set_state_sm(port, SM_TEST_C);
- }
-}
-
-static void sm_test_B6_exit(const int port)
-{
- sm[port].seq[sm[port].idx++] = EXIT_B6;
-}
-
-static void sm_test_C_entry(const int port)
-{
- sm[port].sv_tmp = 0;
- sm[port].seq[sm[port].idx++] = ENTER_C;
- if (test_control.c_entry_to)
- set_state(port, &sm[port].ctx, test_control.c_entry_to);
-}
-
-static void sm_test_C_run(const int port)
-{
- if (sm[port].sv_tmp == 0) {
- sm[port].seq[sm[port].idx++] = RUN_C;
- sm[port].sv_tmp = 1;
- } else {
- set_state_sm(port, SM_TEST_A7);
- }
-}
-
-static void sm_test_C_exit(const int port)
-{
- sm[port].seq[sm[port].idx++] = EXIT_C;
- if (test_control.c_exit_to)
- set_state(port, &sm[port].ctx, test_control.c_exit_to);
-}
-
-static void run_sm(void)
-{
- task_wake(TASK_ID_TEST);
- task_wait_event(5 * MSEC);
-}
-
-test_static int test_hierarchy_0(void)
-{
- int port = PORT0;
- int i = 0;
-
- set_state_sm(port, SM_TEST_A4);
-
- run_sm();
- TEST_EQ(sm[port].seq[i], ENTER_A4, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_A4, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_A4, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_B4, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_B4, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_B4, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_B5, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_B5, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_B5, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_B6, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_B6, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_B6, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_C, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_C, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_C, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A7, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_A7, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_A7, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A6, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_A6, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_A6, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A5, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_A5, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_A5, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A4, "%d"); ++i;
-
- for (; i < SEQUENCE_SIZE; i++)
- TEST_EQ(sm[port].seq[i], 0, "%d");
-
- return EC_SUCCESS;
-}
-
-test_static int test_hierarchy_1(void)
-{
- int port = PORT0;
- int i = 0;
-
- set_state_sm(port, SM_TEST_A4);
-
- run_sm();
- TEST_EQ(sm[port].seq[i], ENTER_A3, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A4, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_A4, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_A3, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_A4, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], EXIT_A3, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_B3, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_B4, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_B4, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_B3, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_B4, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], EXIT_B3, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_B5, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_B5, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_B5, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_B6, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_B6, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_B6, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_C, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_C, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_C, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A7, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_A7, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_A7, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A6, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_A6, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_A6, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A3, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A5, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_A5, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_A3, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_A5, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A4, "%d"); ++i;
-
- for (i = 33; i < SEQUENCE_SIZE; i++)
- TEST_EQ(sm[port].seq[i], 0, "%d");
-
- return EC_SUCCESS;
-}
-
-test_static int test_hierarchy_2(void)
-{
-
- int port = PORT0;
- int i = 0;
-
- set_state_sm(port, SM_TEST_A4);
-
- run_sm();
- TEST_EQ(sm[port].seq[i], ENTER_A2, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A3, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A4, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_A4, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_A3, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_A2, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_A4, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], EXIT_A3, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], EXIT_A2, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_B2, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_B3, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_B4, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_B4, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_B3, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_B2, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_B4, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], EXIT_B3, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_B5, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_B5, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_B2, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_B5, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], EXIT_B2, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_B6, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_B6, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_B6, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_C, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_C, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_C, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A7, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_A7, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_A7, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A2, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A6, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_A6, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_A2, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_A6, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A3, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A5, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_A5, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_A3, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_A2, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_A5, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A4, "%d"); ++i;
-
- for (; i < SEQUENCE_SIZE; i++)
- TEST_EQ(sm[port].seq[i], 0, "%d");
-
- return EC_SUCCESS;
-}
-
-test_static int test_hierarchy_3(void)
-{
-
- int port = PORT0;
- int i = 0;
-
- set_state_sm(port, SM_TEST_A4);
-
- run_sm();
- TEST_EQ(sm[port].seq[i], ENTER_A1, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A2, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A3, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A4, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_A4, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_A3, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_A2, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_A1, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_A4, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], EXIT_A3, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], EXIT_A2, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], EXIT_A1, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_B1, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_B2, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_B3, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_B4, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_B4, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_B3, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_B2, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_B1, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_B4, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], EXIT_B3, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_B5, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_B5, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_B2, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_B1, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_B5, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], EXIT_B2, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_B6, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_B6, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_B1, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_B6, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], EXIT_B1, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_C, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_C, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_C, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A1, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A7, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_A7, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_A1, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_A7, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A2, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A6, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_A6, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_A2, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_A1, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_A6, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A3, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A5, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_A5, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_A3, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_A2, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_A1, "%d"); ++i;
-
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_A5, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A4, "%d"); ++i;
-
- for (; i < SEQUENCE_SIZE; i++)
- TEST_EQ(sm[port].seq[i], 0, "%d");
-
- return EC_SUCCESS;
-}
-
-test_static int test_set_state_from_parents(void)
-{
- int port = PORT0;
- int i = 0;
-
- /* Start state machine */
- test_control.a3_entry_to = &states[SM_TEST_B4];
- run_sm();
- set_state_sm(port, SM_TEST_A4);
- TEST_EQ(sm[port].seq[i], ENTER_A1, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A2, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A3, "%d"); ++i;
- /* Does not enter or exit A4 */
- TEST_EQ(sm[port].seq[i], EXIT_A3, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], EXIT_A2, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], EXIT_A1, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_B1, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_B2, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_B3, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_B4, "%d"); ++i;
- /* Ensure we didn't go further than above statements */
- TEST_EQ(sm[port].seq[i], 0, "%d");
-
- test_control.b3_run_to = &states[SM_TEST_B5];
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_B4, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_B3, "%d"); ++i;
- /* Does not run b2 or b1 */
- TEST_EQ(sm[port].seq[i], EXIT_B4, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], EXIT_B3, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_B5, "%d"); ++i;
- /* Ensure we didn't go further than above statements */
- TEST_EQ(sm[port].seq[i], 0, "%d");
-
- run_sm();
- TEST_EQ(sm[port].seq[i], RUN_B5, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_B2, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], RUN_B1, "%d"); ++i;
- /* Ensure we didn't go further than above statements */
- TEST_EQ(sm[port].seq[i], 0, "%d");
-
- /*
- * Ensure that multiple chains of parent entry works. Also ensure
- * that set states in exit are ignored.
- */
- test_control.b6_entry_to = &states[SM_TEST_C];
- test_control.c_entry_to = &states[SM_TEST_A7];
- test_control.c_exit_to = &states[SM_TEST_A4];
- run_sm();
- TEST_EQ(sm[port].seq[i], EXIT_B5, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], EXIT_B2, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_B6, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], EXIT_B6, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], EXIT_B1, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_C, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], EXIT_C, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A1, "%d"); ++i;
- TEST_EQ(sm[port].seq[i], ENTER_A7, "%d"); ++i;
- /* Ensure we didn't go further than above statements */
- TEST_EQ(sm[port].seq[i], 0, "%d");
-
- for (; i < SEQUENCE_SIZE; i++)
- TEST_EQ(sm[port].seq[i], 0, "%d");
-
- return EC_SUCCESS;
-}
-
-#ifdef TEST_USB_SM_FRAMEWORK_H3
-#define TEST_AT_LEAST_3
-#endif
-
-#if defined(TEST_AT_LEAST_3) || defined(TEST_USB_SM_FRAMEWORK_H2)
-#define TEST_AT_LEAST_2
-#endif
-
-#if defined(TEST_AT_LEAST_2) || defined(TEST_USB_SM_FRAMEWORK_H1)
-#define TEST_AT_LEAST_1
-#endif
-
-static const struct usb_state states[] = {
- [SM_TEST_SUPER_A1] = {
- .entry = sm_test_super_A1_entry,
- .run = sm_test_super_A1_run,
- .exit = sm_test_super_A1_exit,
- },
- [SM_TEST_SUPER_A2] = {
- .entry = sm_test_super_A2_entry,
- .run = sm_test_super_A2_run,
- .exit = sm_test_super_A2_exit,
-#ifdef TEST_AT_LEAST_3
- .parent = &states[SM_TEST_SUPER_A1],
-#endif
- },
- [SM_TEST_SUPER_A3] = {
- .entry = sm_test_super_A3_entry,
- .run = sm_test_super_A3_run,
- .exit = sm_test_super_A3_exit,
-#ifdef TEST_AT_LEAST_2
- .parent = &states[SM_TEST_SUPER_A2],
-#endif
- },
- [SM_TEST_SUPER_B1] = {
- .entry = sm_test_super_B1_entry,
- .run = sm_test_super_B1_run,
- .exit = sm_test_super_B1_exit,
- },
- [SM_TEST_SUPER_B2] = {
- .entry = sm_test_super_B2_entry,
- .run = sm_test_super_B2_run,
- .exit = sm_test_super_B2_exit,
-#ifdef TEST_AT_LEAST_3
- .parent = &states[SM_TEST_SUPER_B1],
-#endif
- },
- [SM_TEST_SUPER_B3] = {
- .entry = sm_test_super_B3_entry,
- .run = sm_test_super_B3_run,
- .exit = sm_test_super_B3_exit,
-#ifdef TEST_AT_LEAST_2
- .parent = &states[SM_TEST_SUPER_B2],
-#endif
- },
- [SM_TEST_A4] = {
- .entry = sm_test_A4_entry,
- .run = sm_test_A4_run,
- .exit = sm_test_A4_exit,
-#ifdef TEST_AT_LEAST_1
- .parent = &states[SM_TEST_SUPER_A3],
-#endif
- },
- [SM_TEST_A5] = {
- .entry = sm_test_A5_entry,
- .run = sm_test_A5_run,
- .exit = sm_test_A5_exit,
-#ifdef TEST_AT_LEAST_1
- .parent = &states[SM_TEST_SUPER_A3],
-#endif
- },
- [SM_TEST_A6] = {
- .entry = sm_test_A6_entry,
- .run = sm_test_A6_run,
- .exit = sm_test_A6_exit,
-#ifdef TEST_AT_LEAST_2
- .parent = &states[SM_TEST_SUPER_A2],
-#endif
- },
- [SM_TEST_A7] = {
- .entry = sm_test_A7_entry,
- .run = sm_test_A7_run,
- .exit = sm_test_A7_exit,
-#ifdef TEST_AT_LEAST_3
- .parent = &states[SM_TEST_SUPER_A1],
-#endif
- },
- [SM_TEST_B4] = {
- .entry = sm_test_B4_entry,
- .run = sm_test_B4_run,
- .exit = sm_test_B4_exit,
-#ifdef TEST_AT_LEAST_1
- .parent = &states[SM_TEST_SUPER_B3],
-#endif
- },
- [SM_TEST_B5] = {
- .entry = sm_test_B5_entry,
- .run = sm_test_B5_run,
- .exit = sm_test_B5_exit,
-#ifdef TEST_AT_LEAST_2
- .parent = &states[SM_TEST_SUPER_B2],
-#endif
- },
- [SM_TEST_B6] = {
- .entry = sm_test_B6_entry,
- .run = sm_test_B6_run,
- .exit = sm_test_B6_exit,
-#ifdef TEST_AT_LEAST_3
- .parent = &states[SM_TEST_SUPER_B1],
-#endif
- },
- [SM_TEST_C] = {
- .entry = sm_test_C_entry,
- .run = sm_test_C_run,
- .exit = sm_test_C_exit,
- },
-};
-
-/* Run before each RUN_TEST line */
-void before_test(void)
-{
- /* Rest test variables */
- memset(&sm[PORT0], 0, sizeof(struct sm_));
- memset(&test_control, 0, sizeof(struct control));
-}
-
-int test_task(void *u)
-{
- int port = PORT0;
-
- while (1) {
- /* wait for next event/packet or timeout expiration */
- task_wait_event(-1);
- /* run state machine */
- run_state(port, &sm[port].ctx);
- }
-
- return EC_SUCCESS;
-}
-
-void run_test(int argc, char **argv)
-{
- test_reset();
-#if defined(TEST_USB_SM_FRAMEWORK_H3)
- RUN_TEST(test_hierarchy_3);
- RUN_TEST(test_set_state_from_parents);
-#elif defined(TEST_USB_SM_FRAMEWORK_H2)
- RUN_TEST(test_hierarchy_2);
-#elif defined(TEST_USB_SM_FRAMEWORK_H1)
- RUN_TEST(test_hierarchy_1);
-#else
- RUN_TEST(test_hierarchy_0);
-#endif
- test_print_result();
-}