blob: 800eae7b3ddb9e279838012792d41a6a75f37994 [file] [log] [blame]
/* Copyright 2020 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_pd_console
*/
#include "common.h"
#include "math.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "usb_pe_sm.h"
#include "usb_pd.h"
#include "usb_tc_sm.h"
#include "util.h"
#include "test_util.h"
/* Defined in implementation */
int hex8tou32(char *str, uint32_t *val);
int command_pd(int argc, char **argv);
int remote_flashing(int argc, char **argv);
static enum try_src_override_t try_src_override;
static int test_port;
static enum pd_dpm_request request;
static int max_volt;
static int comm_enable;
static int dev_info;
static int vdm_cmd;
static int vdm_count;
static int vdm_vid;
static uint32_t vdm_data[10];
static enum pd_dual_role_states dr_state;
/* Mock functions */
void pe_send_vdm(int port, uint32_t vid, int cmd, const uint32_t *data,
int count)
{
int i;
test_port = port;
vdm_cmd = cmd;
vdm_count = count;
vdm_vid = vid;
if (data == NULL)
for (i = 0; i < 10; i++)
vdm_data[i] = -1;
else
for (i = 0; i < count; i++)
vdm_data[i] = data[i];
}
void pd_dpm_request(int port, enum pd_dpm_request req)
{
test_port = port;
request = req;
}
unsigned int pd_get_max_voltage(void)
{
return 10000;
}
void pd_request_source_voltage(int port, int mv)
{
test_port = port;
max_volt = mv;
}
void pd_comm_enable(int port, int enable)
{
test_port = port;
comm_enable = enable;
}
void tc_print_dev_info(int port)
{
test_port = port;
dev_info = 1;
}
void pd_set_dual_role(int port, enum pd_dual_role_states state)
{
test_port = port;
dr_state = state;
}
int pd_comm_is_enabled(int port)
{
test_port = port;
return 0;
}
int pd_get_polarity(int port)
{
test_port = port;
return 0;
}
uint32_t tc_get_flags(int port)
{
test_port = port;
return 0;
}
const char *tc_get_current_state(int port)
{
test_port = port;
return 0;
}
void tc_try_src_override(enum try_src_override_t ov)
{
if (IS_ENABLED(CONFIG_USB_PD_TRY_SRC)) {
switch (ov) {
case TRY_SRC_OVERRIDE_OFF: /* 0 */
try_src_override = TRY_SRC_OVERRIDE_OFF;
break;
case TRY_SRC_OVERRIDE_ON: /* 1 */
try_src_override = TRY_SRC_OVERRIDE_ON;
break;
default:
try_src_override = TRY_SRC_NO_OVERRIDE;
}
}
}
enum try_src_override_t tc_get_try_src_override(void)
{
return try_src_override;
}
static int test_hex8tou32(void)
{
char const *tst_str[] = {"01234567", "89abcdef",
"AABBCCDD", "EEFF0011"};
uint32_t const tst_int[] = {0x01234567, 0x89abcdef,
0xaabbccdd, 0xeeff0011};
uint32_t val;
int i;
for (i = 0; i < 4; i++) {
hex8tou32(tst_str[i], &val);
TEST_ASSERT(val == tst_int[i]);
}
return EC_SUCCESS;
}
static int test_command_pd_arg_count(void)
{
int argc;
char const *argv[] = {"pd", "", 0, 0, 0};
for (argc = 0; argc < 3; argc++)
TEST_ASSERT(command_pd(argc, argv) == EC_ERROR_PARAM_COUNT);
return EC_SUCCESS;
}
static int test_command_pd_port_num(void)
{
int argc = 3;
char const *argv[10] = {"pd", "5", 0, 0, 0};
TEST_ASSERT(command_pd(argc, argv) == EC_ERROR_PARAM2);
return EC_SUCCESS;
}
static int test_command_pd_try_src(void)
{
int argc = 3;
char const *argv[] = {"pd", "trysrc", "2", 0, 0};
try_src_override = 0;
TEST_ASSERT(command_pd(argc, argv) == EC_SUCCESS);
TEST_ASSERT(try_src_override == TRY_SRC_NO_OVERRIDE);
argv[2] = "1";
TEST_ASSERT(command_pd(argc, argv) == EC_SUCCESS);
TEST_ASSERT(try_src_override == TRY_SRC_OVERRIDE_ON);
argv[2] = "0";
TEST_ASSERT(command_pd(argc, argv) == EC_SUCCESS);
TEST_ASSERT(try_src_override == TRY_SRC_OVERRIDE_OFF);
return EC_SUCCESS;
}
static int test_command_pd_tx(void)
{
int argc = 3;
char const *argv[] = {"pd", "0", "tx", 0, 0};
request = 0;
TEST_ASSERT(command_pd(argc, argv) == EC_SUCCESS);
TEST_ASSERT(test_port == 0);
TEST_ASSERT(request == DPM_REQUEST_SNK_STARTUP);
return EC_SUCCESS;
}
static int test_command_pd_charger(void)
{
int argc = 3;
char const *argv[] = {"pd", "1", "charger", 0, 0};
request = 0;
TEST_ASSERT(command_pd(argc, argv) == EC_SUCCESS);
TEST_ASSERT(test_port == 1);
TEST_ASSERT(request == DPM_REQUEST_SRC_STARTUP);
return EC_SUCCESS;
}
static int test_command_pd_dev1(void)
{
int argc = 4;
char const *argv[] = {"pd", "0", "dev", "20", 0};
request = 0;
max_volt = 0;
TEST_ASSERT(command_pd(argc, argv) == EC_SUCCESS);
TEST_ASSERT(test_port == 0);
TEST_ASSERT(request == DPM_REQUEST_NEW_POWER_LEVEL);
TEST_ASSERT(max_volt == 20000);
return EC_SUCCESS;
}
static int test_command_pd_dev2(void)
{
int argc = 3;
char const *argv[] = {"pd", "1", "dev", 0, 0};
request = 0;
TEST_ASSERT(command_pd(argc, argv) == EC_SUCCESS);
TEST_ASSERT(test_port == 1);
TEST_ASSERT(request == DPM_REQUEST_NEW_POWER_LEVEL);
TEST_ASSERT(max_volt == 10000);
return EC_SUCCESS;
}
static int test_command_pd_disable(void)
{
int argc = 3;
char const *argv[] = {"pd", "0", "disable", 0, 0};
comm_enable = 1;
TEST_ASSERT(command_pd(argc, argv) == EC_SUCCESS);
TEST_ASSERT(test_port == 0);
TEST_ASSERT(comm_enable == 0);
return EC_SUCCESS;
}
static int test_command_pd_enable(void)
{
int argc = 3;
char const *argv[] = {"pd", "1", "enable", 0, 0};
comm_enable = 0;
TEST_ASSERT(command_pd(argc, argv) == EC_SUCCESS);
TEST_ASSERT(test_port == 1);
TEST_ASSERT(comm_enable == 1);
return EC_SUCCESS;
}
static int test_command_pd_hard(void)
{
int argc = 3;
char const *argv[] = {"pd", "0", "hard", 0, 0};
request = 0;
TEST_ASSERT(command_pd(argc, argv) == EC_SUCCESS);
TEST_ASSERT(test_port == 0);
TEST_ASSERT(request == DPM_REQUEST_HARD_RESET_SEND);
return EC_SUCCESS;
}
static int test_command_pd_soft(void)
{
int argc = 3;
char const *argv[] = {"pd", "0", "soft", 0, 0};
request = 0;
TEST_ASSERT(command_pd(argc, argv) == EC_SUCCESS);
TEST_ASSERT(test_port == 0);
TEST_ASSERT(request == DPM_REQUEST_SOFT_RESET_SEND);
return EC_SUCCESS;
}
static int test_command_pd_swap1(void)
{
int argc = 3;
char const *argv[] = {"pd", "0", "swap", 0, 0};
TEST_ASSERT(command_pd(argc, argv) == EC_ERROR_PARAM_COUNT);
return EC_SUCCESS;
}
static int test_command_pd_swap2(void)
{
int argc = 4;
char const *argv[] = {"pd", "0", "swap", "power", 0};
request = 0;
TEST_ASSERT(command_pd(argc, argv) == EC_SUCCESS);
TEST_ASSERT(test_port == 0);
TEST_ASSERT(request == DPM_REQUEST_PR_SWAP);
return EC_SUCCESS;
}
static int test_command_pd_swap3(void)
{
int argc = 4;
char const *argv[] = {"pd", "1", "swap", "data", 0};
request = 0;
TEST_ASSERT(command_pd(argc, argv) == EC_SUCCESS);
TEST_ASSERT(test_port == 1);
TEST_ASSERT(request == DPM_REQUEST_DR_SWAP);
return EC_SUCCESS;
}
static int test_command_pd_swap4(void)
{
int argc = 4;
char const *argv[] = {"pd", "0", "swap", "vconn", 0};
request = 0;
TEST_ASSERT(command_pd(argc, argv) == EC_SUCCESS);
TEST_ASSERT(test_port == 0);
TEST_ASSERT(request == DPM_REQUEST_VCONN_SWAP);
return EC_SUCCESS;
}
static int test_command_pd_swap5(void)
{
int argc = 4;
char const *argv[] = {"pd", "0", "swap", "xyz", 0};
TEST_ASSERT(command_pd(argc, argv) == EC_ERROR_PARAM3);
return EC_SUCCESS;
}
static int test_command_pd_dualrole1(void)
{
int argc = 4;
char const *argv[] = {"pd", "0", "dualrole", "on", 0};
dr_state = 0;
TEST_ASSERT(command_pd(argc, argv) == EC_SUCCESS);
TEST_ASSERT(test_port == 0);
TEST_ASSERT(dr_state == PD_DRP_TOGGLE_ON);
return EC_SUCCESS;
}
static int test_command_pd_dualrole2(void)
{
int argc = 4;
char const *argv[] = {"pd", "0", "dualrole", "off", 0};
dr_state = 0;
TEST_ASSERT(command_pd(argc, argv) == EC_SUCCESS);
TEST_ASSERT(test_port == 0);
TEST_ASSERT(dr_state == PD_DRP_TOGGLE_OFF);
return EC_SUCCESS;
}
static int test_command_pd_dualrole3(void)
{
int argc = 4;
char const *argv[] = {"pd", "0", "dualrole", "freeze", 0};
dr_state = 0;
TEST_ASSERT(command_pd(argc, argv) == EC_SUCCESS);
TEST_ASSERT(test_port == 0);
TEST_ASSERT(dr_state == PD_DRP_FREEZE);
return EC_SUCCESS;
}
static int test_command_pd_dualrole4(void)
{
int argc = 4;
char const *argv[] = {"pd", "0", "dualrole", "sink", 0};
dr_state = 0;
TEST_ASSERT(command_pd(argc, argv) == EC_SUCCESS);
TEST_ASSERT(test_port == 0);
TEST_ASSERT(dr_state == PD_DRP_FORCE_SINK);
return EC_SUCCESS;
}
static int test_command_pd_dualrole5(void)
{
int argc = 4;
char const *argv[] = {"pd", "0", "dualrole", "source", 0};
dr_state = 0;
TEST_ASSERT(command_pd(argc, argv) == EC_SUCCESS);
TEST_ASSERT(test_port == 0);
TEST_ASSERT(dr_state == PD_DRP_FORCE_SOURCE);
return EC_SUCCESS;
}
void run_test(int argc, char **argv)
{
test_reset();
RUN_TEST(test_hex8tou32);
RUN_TEST(test_command_pd_arg_count);
RUN_TEST(test_command_pd_port_num);
RUN_TEST(test_command_pd_try_src);
RUN_TEST(test_command_pd_tx);
RUN_TEST(test_command_pd_bist_tx);
RUN_TEST(test_command_pd_bist_rx);
RUN_TEST(test_command_pd_charger);
RUN_TEST(test_command_pd_dev1);
RUN_TEST(test_command_pd_dev2);
RUN_TEST(test_command_pd_disable);
RUN_TEST(test_command_pd_enable);
RUN_TEST(test_command_pd_hard);
RUN_TEST(test_command_pd_info);
RUN_TEST(test_command_pd_soft);
RUN_TEST(test_command_pd_swap1);
RUN_TEST(test_command_pd_swap2);
RUN_TEST(test_command_pd_swap3);
RUN_TEST(test_command_pd_swap4);
RUN_TEST(test_command_pd_swap5);
RUN_TEST(test_command_pd_ping);
RUN_TEST(test_command_pd_vdm1);
RUN_TEST(test_command_pd_vdm2);
RUN_TEST(test_command_pd_vdm3);
RUN_TEST(test_command_pd_vdm4);
RUN_TEST(test_command_pd_vdm5);
RUN_TEST(test_command_pd_vdm6);
RUN_TEST(test_command_pd_flash1);
RUN_TEST(test_command_pd_flash2);
RUN_TEST(test_command_pd_flash3);
RUN_TEST(test_command_pd_flash4);
RUN_TEST(test_command_pd_flash5);
RUN_TEST(test_command_pd_flash6);
RUN_TEST(test_command_pd_flash7);
RUN_TEST(test_command_pd_flash8);
RUN_TEST(test_command_pd_dualrole1);
RUN_TEST(test_command_pd_dualrole2);
RUN_TEST(test_command_pd_dualrole3);
RUN_TEST(test_command_pd_dualrole4);
RUN_TEST(test_command_pd_dualrole5);
test_print_result();
}