All of lore.kernel.org
 help / color / mirror / Atom feed
From: Guenter Roeck <groeck@google.com>
To: Tzung-Bi Shih <tzungbi@kernel.org>
Cc: Benson Leung <bleung@chromium.org>,
	Guenter Roeck <groeck@chromium.org>,
	 chrome-platform@lists.linux.dev,
	linux-kernel <linux-kernel@vger.kernel.org>,
	 Doug Anderson <dianders@chromium.org>
Subject: Re: [PATCH 1/4] platform/chrome: cros_ec_proto: add Kunit tests for cros_ec_prepare_tx()
Date: Wed, 18 May 2022 09:23:34 -0700	[thread overview]
Message-ID: <CABXOdTf4QqNiCDpXvxYo8ya_9mjF+B1XdyfcxOWd8HP5_JcpjA@mail.gmail.com> (raw)
In-Reply-To: <20220518091814.2028579-2-tzungbi@kernel.org>

On Wed, May 18, 2022 at 2:18 AM Tzung-Bi Shih <tzungbi@kernel.org> wrote:
>
> cros_ec_prepare_tx() is used to fill the protocol headers according to
> the requested protocol version.
>
> Add Kunit tests cros_ec_prepare_tx() for each version.
>
> Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org>

Reviewed-by: Guenter Roeck <groeck@chromium.org>

> ---
>  drivers/platform/chrome/Kconfig              |   9 +
>  drivers/platform/chrome/Makefile             |   3 +
>  drivers/platform/chrome/cros_ec_proto_test.c | 173 +++++++++++++++++++
>  3 files changed, 185 insertions(+)
>  create mode 100644 drivers/platform/chrome/cros_ec_proto_test.c
>
> diff --git a/drivers/platform/chrome/Kconfig b/drivers/platform/chrome/Kconfig
> index 717299cbccac..4b3d2427e8dd 100644
> --- a/drivers/platform/chrome/Kconfig
> +++ b/drivers/platform/chrome/Kconfig
> @@ -267,4 +267,13 @@ config CHROMEOS_PRIVACY_SCREEN
>
>  source "drivers/platform/chrome/wilco_ec/Kconfig"
>
> +# Kunit test cases
> +config CROS_EC_PROTO_KUNIT_TEST
> +       tristate "Kunit tests for ChromeOS EC protocol" if !KUNIT_ALL_TESTS
> +       depends on KUNIT && CROS_EC
> +       default KUNIT_ALL_TESTS
> +       select CROS_EC_PROTO
> +       help
> +         Kunit tests for the ChromeOS Embedded Controller protocol.
> +
>  endif # CHROMEOS_PLATFORMS
> diff --git a/drivers/platform/chrome/Makefile b/drivers/platform/chrome/Makefile
> index 52f5a2dde8b8..3c380066c6b6 100644
> --- a/drivers/platform/chrome/Makefile
> +++ b/drivers/platform/chrome/Makefile
> @@ -30,3 +30,6 @@ obj-$(CONFIG_CROS_USBPD_LOGGER)               += cros_usbpd_logger.o
>  obj-$(CONFIG_CROS_USBPD_NOTIFY)                += cros_usbpd_notify.o
>
>  obj-$(CONFIG_WILCO_EC)                 += wilco_ec/
> +
> +# Kunit test cases
> +obj-$(CONFIG_CROS_EC_PROTO_KUNIT_TEST) += cros_ec_proto_test.o
> diff --git a/drivers/platform/chrome/cros_ec_proto_test.c b/drivers/platform/chrome/cros_ec_proto_test.c
> new file mode 100644
> index 000000000000..61abb18ac00b
> --- /dev/null
> +++ b/drivers/platform/chrome/cros_ec_proto_test.c
> @@ -0,0 +1,173 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Kunit tests for ChromeOS Embedded Controller protocol.
> + */
> +
> +#include <kunit/test.h>
> +
> +#include <linux/platform_data/cros_ec_commands.h>
> +#include <linux/platform_data/cros_ec_proto.h>
> +
> +#include "cros_ec.h"
> +
> +#define BUFSIZE 512
> +
> +struct cros_ec_proto_test_priv {
> +       struct cros_ec_device ec_dev;
> +       u8 dout[BUFSIZE];
> +       u8 din[BUFSIZE];
> +       struct cros_ec_command *msg;
> +       u8 _msg[BUFSIZE];
> +};
> +
> +static void cros_ec_proto_test_prepare_tx_legacy_normal(struct kunit *test)
> +{
> +       struct cros_ec_proto_test_priv *priv = test->priv;
> +       struct cros_ec_device *ec_dev = &priv->ec_dev;
> +       struct cros_ec_command *msg = priv->msg;
> +       int ret, i;
> +       u8 csum;
> +
> +       ec_dev->proto_version = 2;
> +
> +       msg->command = EC_CMD_HELLO;
> +       msg->outsize = EC_PROTO2_MAX_PARAM_SIZE;
> +       msg->data[0] = 0xde;
> +       msg->data[1] = 0xad;
> +       msg->data[2] = 0xbe;
> +       msg->data[3] = 0xef;
> +
> +       ret = cros_ec_prepare_tx(ec_dev, msg);
> +
> +       KUNIT_EXPECT_EQ(test, ret, EC_MSG_TX_PROTO_BYTES + EC_PROTO2_MAX_PARAM_SIZE);
> +       KUNIT_EXPECT_EQ(test, ec_dev->dout[0], EC_CMD_VERSION0);
> +       KUNIT_EXPECT_EQ(test, ec_dev->dout[1], EC_CMD_HELLO);
> +       KUNIT_EXPECT_EQ(test, ec_dev->dout[2], EC_PROTO2_MAX_PARAM_SIZE);
> +       KUNIT_EXPECT_EQ(test, EC_MSG_TX_HEADER_BYTES, 3);
> +       KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 0], 0xde);
> +       KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 1], 0xad);
> +       KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 2], 0xbe);
> +       KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 3], 0xef);
> +       for (i = 4; i < EC_PROTO2_MAX_PARAM_SIZE; ++i)
> +               KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + i], 0);
> +
> +       csum = EC_CMD_VERSION0;
> +       csum += EC_CMD_HELLO;
> +       csum += EC_PROTO2_MAX_PARAM_SIZE;
> +       csum += 0xde;
> +       csum += 0xad;
> +       csum += 0xbe;
> +       csum += 0xef;
> +       KUNIT_EXPECT_EQ(test,
> +                       ec_dev->dout[EC_MSG_TX_HEADER_BYTES + EC_PROTO2_MAX_PARAM_SIZE],
> +                       csum);
> +}
> +
> +static void cros_ec_proto_test_prepare_tx_legacy_bad_msg_outsize(struct kunit *test)
> +{
> +       struct cros_ec_proto_test_priv *priv = test->priv;
> +       struct cros_ec_device *ec_dev = &priv->ec_dev;
> +       struct cros_ec_command *msg = priv->msg;
> +       int ret;
> +
> +       ec_dev->proto_version = 2;
> +
> +       msg->outsize = EC_PROTO2_MAX_PARAM_SIZE + 1;
> +
> +       ret = cros_ec_prepare_tx(ec_dev, msg);
> +       KUNIT_EXPECT_EQ(test, ret, -EINVAL);
> +}
> +
> +static void cros_ec_proto_test_prepare_tx_normal(struct kunit *test)
> +{
> +       struct cros_ec_proto_test_priv *priv = test->priv;
> +       struct cros_ec_device *ec_dev = &priv->ec_dev;
> +       struct cros_ec_command *msg = priv->msg;
> +       struct ec_host_request *request = (struct ec_host_request *)ec_dev->dout;
> +       int ret, i;
> +       u8 csum;
> +
> +       msg->command = EC_CMD_HELLO;
> +       msg->outsize = 0x88;
> +       msg->data[0] = 0xde;
> +       msg->data[1] = 0xad;
> +       msg->data[2] = 0xbe;
> +       msg->data[3] = 0xef;
> +
> +       ret = cros_ec_prepare_tx(ec_dev, msg);
> +
> +       KUNIT_EXPECT_EQ(test, ret, sizeof(*request) + 0x88);
> +
> +       KUNIT_EXPECT_EQ(test, request->struct_version, EC_HOST_REQUEST_VERSION);
> +       KUNIT_EXPECT_EQ(test, request->command, EC_CMD_HELLO);
> +       KUNIT_EXPECT_EQ(test, request->command_version, 0);
> +       KUNIT_EXPECT_EQ(test, request->data_len, 0x88);
> +       KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 0], 0xde);
> +       KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 1], 0xad);
> +       KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 2], 0xbe);
> +       KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 3], 0xef);
> +       for (i = 4; i < 0x88; ++i)
> +               KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + i], 0);
> +
> +       csum = EC_HOST_REQUEST_VERSION;
> +       csum += EC_CMD_HELLO;
> +       csum += 0x88;
> +       csum += 0xde;
> +       csum += 0xad;
> +       csum += 0xbe;
> +       csum += 0xef;
> +       KUNIT_EXPECT_EQ(test, request->checksum, (u8)-csum);
> +}
> +
> +static void cros_ec_proto_test_prepare_tx_bad_msg_outsize(struct kunit *test)
> +{
> +       struct cros_ec_proto_test_priv *priv = test->priv;
> +       struct cros_ec_device *ec_dev = &priv->ec_dev;
> +       struct cros_ec_command *msg = priv->msg;
> +       int ret;
> +
> +       msg->outsize = ec_dev->dout_size - sizeof(struct ec_host_request) + 1;
> +
> +       ret = cros_ec_prepare_tx(ec_dev, msg);
> +       KUNIT_EXPECT_EQ(test, ret, -EINVAL);
> +}
> +
> +static int cros_ec_proto_test_init(struct kunit *test)
> +{
> +       struct cros_ec_proto_test_priv *priv;
> +       struct cros_ec_device *ec_dev;
> +
> +       priv = kunit_kzalloc(test, sizeof(*priv), GFP_KERNEL);
> +       if (!priv)
> +               return -ENOMEM;
> +       test->priv = priv;
> +
> +       ec_dev = &priv->ec_dev;
> +       ec_dev->dout = (u8 *)priv->dout;
> +       ec_dev->dout_size = ARRAY_SIZE(priv->dout);
> +       ec_dev->din = (u8 *)priv->din;
> +       ec_dev->din_size = ARRAY_SIZE(priv->din);
> +       ec_dev->proto_version = EC_HOST_REQUEST_VERSION;
> +
> +       priv->msg = (struct cros_ec_command *)priv->_msg;
> +
> +       return 0;
> +}
> +
> +static struct kunit_case cros_ec_proto_test_cases[] = {
> +       KUNIT_CASE(cros_ec_proto_test_prepare_tx_legacy_normal),
> +       KUNIT_CASE(cros_ec_proto_test_prepare_tx_legacy_bad_msg_outsize),
> +       KUNIT_CASE(cros_ec_proto_test_prepare_tx_normal),
> +       KUNIT_CASE(cros_ec_proto_test_prepare_tx_bad_msg_outsize),
> +       {}
> +};
> +
> +static struct kunit_suite cros_ec_proto_test_suite = {
> +       .name = "cros_ec_proto_test",
> +       .init = cros_ec_proto_test_init,
> +       .test_cases = cros_ec_proto_test_cases,
> +};
> +
> +kunit_test_suite(cros_ec_proto_test_suite);
> +
> +MODULE_LICENSE("GPL");
> --
> 2.36.0.550.gb090851708-goog
>

  reply	other threads:[~2022-05-18 16:23 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-18  9:18 [PATCH 0/4] platform/chrome: cros_ec_proto: add initial Kunit tests Tzung-Bi Shih
2022-05-18  9:18 ` [PATCH 1/4] platform/chrome: cros_ec_proto: add Kunit tests for cros_ec_prepare_tx() Tzung-Bi Shih
2022-05-18 16:23   ` Guenter Roeck [this message]
2022-05-18  9:18 ` [PATCH 2/4] platform/chrome: cros_ec_proto: factor legacy out from cros_ec_prepare_tx() Tzung-Bi Shih
2022-05-18 16:26   ` Guenter Roeck
2022-05-18  9:18 ` [PATCH 3/4] platform/chrome: cros_ec_proto: update cros_ec_check_result() comment Tzung-Bi Shih
2022-05-18 16:28   ` Guenter Roeck
2022-05-18  9:18 ` [PATCH 4/4] platform/chrome: cros_ec_proto: add Kunit tests for cros_ec_check_result() Tzung-Bi Shih
2022-05-18 16:31   ` Guenter Roeck
2022-05-19  1:50 ` [PATCH 0/4] platform/chrome: cros_ec_proto: add initial Kunit tests patchwork-bot+chrome-platform
2022-05-24  0:50 ` patchwork-bot+chrome-platform
2022-06-06  4:08 ` patchwork-bot+chrome-platform

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CABXOdTf4QqNiCDpXvxYo8ya_9mjF+B1XdyfcxOWd8HP5_JcpjA@mail.gmail.com \
    --to=groeck@google.com \
    --cc=bleung@chromium.org \
    --cc=chrome-platform@lists.linux.dev \
    --cc=dianders@chromium.org \
    --cc=groeck@chromium.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tzungbi@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.