Skip to content

Commit da95f69

Browse files
author
Tzung-Bi Shih
committed
platform/chrome: cros_ec_proto: add Kunit tests for cros_ec_send_command()
cros_ec_cmd_xfer() is the only exported function that calls static function cros_ec_send_command(). Add Kunit tests for cros_ec_send_command() through calling cros_ec_cmd_xfer(). Reviewed-by: Guenter Roeck <groeck@chromium.org> Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org> Link: https://lore.kernel.org/r/20220718050914.2267370-5-tzungbi@kernel.org
1 parent 82f4def commit da95f69

3 files changed

Lines changed: 289 additions & 0 deletions

File tree

drivers/platform/chrome/cros_ec_proto_test.c

Lines changed: 265 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1680,6 +1680,262 @@ static void cros_ec_proto_test_cmd_xfer_excess_msg_outsize_with_passthru(struct
16801680
KUNIT_EXPECT_EQ(test, ret, -EMSGSIZE);
16811681
}
16821682

1683+
static void cros_ec_proto_test_cmd_xfer_protocol_v3_normal(struct kunit *test)
1684+
{
1685+
struct cros_ec_proto_test_priv *priv = test->priv;
1686+
struct cros_ec_device *ec_dev = &priv->ec_dev;
1687+
int ret;
1688+
struct cros_ec_command msg;
1689+
1690+
memset(&msg, 0, sizeof(msg));
1691+
1692+
ec_dev->proto_version = 3;
1693+
ec_dev->cmd_xfer = cros_kunit_ec_cmd_xfer_mock;
1694+
ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
1695+
1696+
ret = cros_ec_cmd_xfer(ec_dev, &msg);
1697+
KUNIT_EXPECT_EQ(test, ret, 0);
1698+
1699+
KUNIT_EXPECT_EQ(test, cros_kunit_ec_cmd_xfer_mock_called, 0);
1700+
KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 1);
1701+
}
1702+
1703+
static void cros_ec_proto_test_cmd_xfer_protocol_v3_no_op(struct kunit *test)
1704+
{
1705+
struct cros_ec_proto_test_priv *priv = test->priv;
1706+
struct cros_ec_device *ec_dev = &priv->ec_dev;
1707+
int ret;
1708+
struct cros_ec_command msg;
1709+
1710+
memset(&msg, 0, sizeof(msg));
1711+
1712+
ec_dev->proto_version = 3;
1713+
ec_dev->cmd_xfer = cros_kunit_ec_cmd_xfer_mock;
1714+
ec_dev->pkt_xfer = NULL;
1715+
1716+
ret = cros_ec_cmd_xfer(ec_dev, &msg);
1717+
KUNIT_EXPECT_EQ(test, ret, -EIO);
1718+
}
1719+
1720+
static void cros_ec_proto_test_cmd_xfer_protocol_v2_normal(struct kunit *test)
1721+
{
1722+
struct cros_ec_proto_test_priv *priv = test->priv;
1723+
struct cros_ec_device *ec_dev = &priv->ec_dev;
1724+
int ret;
1725+
struct cros_ec_command msg;
1726+
1727+
memset(&msg, 0, sizeof(msg));
1728+
1729+
ec_dev->proto_version = 2;
1730+
ec_dev->cmd_xfer = cros_kunit_ec_cmd_xfer_mock;
1731+
ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
1732+
1733+
ret = cros_ec_cmd_xfer(ec_dev, &msg);
1734+
KUNIT_EXPECT_EQ(test, ret, 0);
1735+
1736+
KUNIT_EXPECT_EQ(test, cros_kunit_ec_cmd_xfer_mock_called, 1);
1737+
KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 0);
1738+
}
1739+
1740+
static void cros_ec_proto_test_cmd_xfer_protocol_v2_no_op(struct kunit *test)
1741+
{
1742+
struct cros_ec_proto_test_priv *priv = test->priv;
1743+
struct cros_ec_device *ec_dev = &priv->ec_dev;
1744+
int ret;
1745+
struct cros_ec_command msg;
1746+
1747+
memset(&msg, 0, sizeof(msg));
1748+
1749+
ec_dev->proto_version = 2;
1750+
ec_dev->cmd_xfer = NULL;
1751+
ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
1752+
1753+
ret = cros_ec_cmd_xfer(ec_dev, &msg);
1754+
KUNIT_EXPECT_EQ(test, ret, -EIO);
1755+
}
1756+
1757+
static void cros_ec_proto_test_cmd_xfer_in_progress_normal(struct kunit *test)
1758+
{
1759+
struct cros_ec_proto_test_priv *priv = test->priv;
1760+
struct cros_ec_device *ec_dev = &priv->ec_dev;
1761+
struct ec_xfer_mock *mock;
1762+
int ret;
1763+
struct cros_ec_command msg;
1764+
1765+
memset(&msg, 0, sizeof(msg));
1766+
1767+
ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
1768+
1769+
/* For the first host command to return EC_RES_IN_PROGRESS. */
1770+
{
1771+
mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0);
1772+
KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1773+
}
1774+
1775+
/* For EC_CMD_GET_COMMS_STATUS. */
1776+
{
1777+
struct ec_response_get_comms_status *data;
1778+
1779+
mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
1780+
KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1781+
1782+
data = (struct ec_response_get_comms_status *)mock->o_data;
1783+
data->flags = 0;
1784+
}
1785+
1786+
ret = cros_ec_cmd_xfer(ec_dev, &msg);
1787+
KUNIT_EXPECT_EQ(test, ret, sizeof(struct ec_response_get_comms_status));
1788+
1789+
KUNIT_EXPECT_EQ(test, msg.result, EC_RES_SUCCESS);
1790+
1791+
/* For the first host command to return EC_RES_IN_PROGRESS. */
1792+
{
1793+
mock = cros_kunit_ec_xfer_mock_next();
1794+
KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1795+
}
1796+
1797+
/* For EC_CMD_GET_COMMS_STATUS. */
1798+
{
1799+
mock = cros_kunit_ec_xfer_mock_next();
1800+
KUNIT_EXPECT_PTR_NE(test, mock, NULL);
1801+
1802+
KUNIT_EXPECT_EQ(test, mock->msg.version, 0);
1803+
KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_COMMS_STATUS);
1804+
KUNIT_EXPECT_EQ(test, mock->msg.insize,
1805+
sizeof(struct ec_response_get_comms_status));
1806+
KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0);
1807+
}
1808+
1809+
KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 2);
1810+
}
1811+
1812+
static void cros_ec_proto_test_cmd_xfer_in_progress_retries_eagain(struct kunit *test)
1813+
{
1814+
struct cros_ec_proto_test_priv *priv = test->priv;
1815+
struct cros_ec_device *ec_dev = &priv->ec_dev;
1816+
struct ec_xfer_mock *mock;
1817+
int ret;
1818+
struct cros_ec_command msg;
1819+
1820+
memset(&msg, 0, sizeof(msg));
1821+
1822+
ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
1823+
1824+
/* For the first host command to return EC_RES_IN_PROGRESS. */
1825+
{
1826+
mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0);
1827+
KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1828+
}
1829+
1830+
/* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */
1831+
cros_kunit_ec_xfer_mock_default_ret = -EAGAIN;
1832+
1833+
ret = cros_ec_cmd_xfer(ec_dev, &msg);
1834+
KUNIT_EXPECT_EQ(test, ret, -EAGAIN);
1835+
1836+
/* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */
1837+
KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 51);
1838+
}
1839+
1840+
static void cros_ec_proto_test_cmd_xfer_in_progress_retries_status_processing(struct kunit *test)
1841+
{
1842+
struct cros_ec_proto_test_priv *priv = test->priv;
1843+
struct cros_ec_device *ec_dev = &priv->ec_dev;
1844+
struct ec_xfer_mock *mock;
1845+
int ret;
1846+
struct cros_ec_command msg;
1847+
1848+
memset(&msg, 0, sizeof(msg));
1849+
1850+
ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
1851+
1852+
/* For the first host command to return EC_RES_IN_PROGRESS. */
1853+
{
1854+
mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0);
1855+
KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1856+
}
1857+
1858+
/* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */
1859+
{
1860+
struct ec_response_get_comms_status *data;
1861+
int i;
1862+
1863+
for (i = 0; i < 50; ++i) {
1864+
mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data));
1865+
KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1866+
1867+
data = (struct ec_response_get_comms_status *)mock->o_data;
1868+
data->flags |= EC_COMMS_STATUS_PROCESSING;
1869+
}
1870+
}
1871+
1872+
ret = cros_ec_cmd_xfer(ec_dev, &msg);
1873+
KUNIT_EXPECT_EQ(test, ret, sizeof(struct ec_response_get_comms_status));
1874+
1875+
KUNIT_EXPECT_EQ(test, msg.result, EC_RES_SUCCESS);
1876+
1877+
/* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */
1878+
KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 51);
1879+
}
1880+
1881+
static void cros_ec_proto_test_cmd_xfer_in_progress_xfer_error(struct kunit *test)
1882+
{
1883+
struct cros_ec_proto_test_priv *priv = test->priv;
1884+
struct cros_ec_device *ec_dev = &priv->ec_dev;
1885+
struct ec_xfer_mock *mock;
1886+
int ret;
1887+
struct cros_ec_command msg;
1888+
1889+
memset(&msg, 0, sizeof(msg));
1890+
1891+
/* For the first host command to return EC_RES_IN_PROGRESS. */
1892+
{
1893+
mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0);
1894+
KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1895+
}
1896+
1897+
/* For EC_CMD_GET_COMMS_STATUS. */
1898+
{
1899+
mock = cros_kunit_ec_xfer_mock_addx(test, -EIO, EC_RES_SUCCESS, 0);
1900+
KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1901+
}
1902+
1903+
ret = cros_ec_cmd_xfer(ec_dev, &msg);
1904+
KUNIT_EXPECT_EQ(test, ret, -EIO);
1905+
}
1906+
1907+
static void cros_ec_proto_test_cmd_xfer_in_progress_return_error(struct kunit *test)
1908+
{
1909+
struct cros_ec_proto_test_priv *priv = test->priv;
1910+
struct cros_ec_device *ec_dev = &priv->ec_dev;
1911+
struct ec_xfer_mock *mock;
1912+
int ret;
1913+
struct cros_ec_command msg;
1914+
1915+
memset(&msg, 0, sizeof(msg));
1916+
1917+
ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock;
1918+
1919+
/* For the first host command to return EC_RES_IN_PROGRESS. */
1920+
{
1921+
mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0);
1922+
KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1923+
}
1924+
1925+
/* For EC_CMD_GET_COMMS_STATUS. */
1926+
{
1927+
mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0);
1928+
KUNIT_ASSERT_PTR_NE(test, mock, NULL);
1929+
}
1930+
1931+
ret = cros_ec_cmd_xfer(ec_dev, &msg);
1932+
KUNIT_EXPECT_EQ(test, ret, 0);
1933+
1934+
KUNIT_EXPECT_EQ(test, msg.result, EC_RES_INVALID_COMMAND);
1935+
1936+
KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 2);
1937+
}
1938+
16831939
static void cros_ec_proto_test_release(struct device *dev)
16841940
{
16851941
}
@@ -1750,6 +2006,15 @@ static struct kunit_case cros_ec_proto_test_cases[] = {
17502006
KUNIT_CASE(cros_ec_proto_test_cmd_xfer_excess_msg_insize),
17512007
KUNIT_CASE(cros_ec_proto_test_cmd_xfer_excess_msg_outsize_without_passthru),
17522008
KUNIT_CASE(cros_ec_proto_test_cmd_xfer_excess_msg_outsize_with_passthru),
2009+
KUNIT_CASE(cros_ec_proto_test_cmd_xfer_protocol_v3_normal),
2010+
KUNIT_CASE(cros_ec_proto_test_cmd_xfer_protocol_v3_no_op),
2011+
KUNIT_CASE(cros_ec_proto_test_cmd_xfer_protocol_v2_normal),
2012+
KUNIT_CASE(cros_ec_proto_test_cmd_xfer_protocol_v2_no_op),
2013+
KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_normal),
2014+
KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_retries_eagain),
2015+
KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_retries_status_processing),
2016+
KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_xfer_error),
2017+
KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_return_error),
17532018
{}
17542019
};
17552020

drivers/platform/chrome/cros_kunit_util.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515

1616
int cros_kunit_ec_xfer_mock_default_ret;
1717
EXPORT_SYMBOL_GPL(cros_kunit_ec_xfer_mock_default_ret);
18+
int cros_kunit_ec_cmd_xfer_mock_called;
19+
EXPORT_SYMBOL_GPL(cros_kunit_ec_cmd_xfer_mock_called);
20+
int cros_kunit_ec_pkt_xfer_mock_called;
21+
EXPORT_SYMBOL_GPL(cros_kunit_ec_pkt_xfer_mock_called);
1822

1923
static struct list_head cros_kunit_ec_xfer_mock_in;
2024
static struct list_head cros_kunit_ec_xfer_mock_out;
@@ -46,6 +50,20 @@ int cros_kunit_ec_xfer_mock(struct cros_ec_device *ec_dev, struct cros_ec_comman
4650
}
4751
EXPORT_SYMBOL_GPL(cros_kunit_ec_xfer_mock);
4852

53+
int cros_kunit_ec_cmd_xfer_mock(struct cros_ec_device *ec_dev, struct cros_ec_command *msg)
54+
{
55+
++cros_kunit_ec_cmd_xfer_mock_called;
56+
return cros_kunit_ec_xfer_mock(ec_dev, msg);
57+
}
58+
EXPORT_SYMBOL_GPL(cros_kunit_ec_cmd_xfer_mock);
59+
60+
int cros_kunit_ec_pkt_xfer_mock(struct cros_ec_device *ec_dev, struct cros_ec_command *msg)
61+
{
62+
++cros_kunit_ec_pkt_xfer_mock_called;
63+
return cros_kunit_ec_xfer_mock(ec_dev, msg);
64+
}
65+
EXPORT_SYMBOL_GPL(cros_kunit_ec_pkt_xfer_mock);
66+
4967
struct ec_xfer_mock *cros_kunit_ec_xfer_mock_add(struct kunit *test, size_t size)
5068
{
5169
return cros_kunit_ec_xfer_mock_addx(test, size, EC_RES_SUCCESS, size);
@@ -90,6 +108,8 @@ EXPORT_SYMBOL_GPL(cros_kunit_ec_xfer_mock_next);
90108
void cros_kunit_mock_reset(void)
91109
{
92110
cros_kunit_ec_xfer_mock_default_ret = 0;
111+
cros_kunit_ec_cmd_xfer_mock_called = 0;
112+
cros_kunit_ec_pkt_xfer_mock_called = 0;
93113
INIT_LIST_HEAD(&cros_kunit_ec_xfer_mock_in);
94114
INIT_LIST_HEAD(&cros_kunit_ec_xfer_mock_out);
95115
}

drivers/platform/chrome/cros_kunit_util.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,12 @@ struct ec_xfer_mock {
2424
};
2525

2626
extern int cros_kunit_ec_xfer_mock_default_ret;
27+
extern int cros_kunit_ec_cmd_xfer_mock_called;
28+
extern int cros_kunit_ec_pkt_xfer_mock_called;
2729

2830
int cros_kunit_ec_xfer_mock(struct cros_ec_device *ec_dev, struct cros_ec_command *msg);
31+
int cros_kunit_ec_cmd_xfer_mock(struct cros_ec_device *ec_dev, struct cros_ec_command *msg);
32+
int cros_kunit_ec_pkt_xfer_mock(struct cros_ec_device *ec_dev, struct cros_ec_command *msg);
2933
struct ec_xfer_mock *cros_kunit_ec_xfer_mock_add(struct kunit *test, size_t size);
3034
struct ec_xfer_mock *cros_kunit_ec_xfer_mock_addx(struct kunit *test,
3135
int ret, int result, size_t size);

0 commit comments

Comments
 (0)