From: "José Expósito" <jose.exposito89@gmail.com>
To: jikos@kernel.org
Cc: benjamin.tissoires@redhat.com, spbnick@gmail.com,
linux-input@vger.kernel.org, linux-kernel@vger.kernel.org,
stefanberzl@gmail.com,
"José Expósito" <jose.exposito89@gmail.com>
Subject: [PATCH for-5.19/uclogic 2/4] HID: uclogic: Add KUnit tests for uclogic_rdesc_template_apply()
Date: Mon, 16 May 2022 20:13:21 +0200 [thread overview]
Message-ID: <20220516181323.59554-3-jose.exposito89@gmail.com> (raw)
In-Reply-To: <20220516181323.59554-1-jose.exposito89@gmail.com>
The uclogic_rdesc_template_apply() function is used by the driver to
generate HID descriptors from templates.
In order to avoid regressions in future patches, add KUnit tests to
test the function.
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
drivers/hid/Kconfig | 7 ++
drivers/hid/Makefile | 2 +
drivers/hid/hid-uclogic-rdesc-test.c | 179 +++++++++++++++++++++++++++
3 files changed, 188 insertions(+)
create mode 100644 drivers/hid/hid-uclogic-rdesc-test.c
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
index 7a674873d794..11212963ee3d 100644
--- a/drivers/hid/Kconfig
+++ b/drivers/hid/Kconfig
@@ -458,6 +458,13 @@ config HID_UCLOGIC
help
Support for UC-Logic and Huion tablets.
+config HID_UCLOGIC_KUNIT_TEST
+ tristate "UC-Logic tests" if !KUNIT_ALL_TESTS
+ depends on KUNIT=y
+ default KUNIT_ALL_TESTS
+ help
+ KUnit tests for the UC-Logic driver.
+
config HID_WALTOP
tristate "Waltop"
depends on HID
diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile
index d5ce8d747b14..b853906f2738 100644
--- a/drivers/hid/Makefile
+++ b/drivers/hid/Makefile
@@ -127,6 +127,8 @@ hid-uclogic-objs := hid-uclogic-core.o \
hid-uclogic-rdesc.o \
hid-uclogic-params.o
obj-$(CONFIG_HID_UCLOGIC) += hid-uclogic.o
+obj-$(CONFIG_HID_UCLOGIC_KUNIT_TEST) += hid-uclogic-rdesc.o \
+ hid-uclogic-rdesc-test.o
obj-$(CONFIG_HID_UDRAW_PS3) += hid-udraw-ps3.o
obj-$(CONFIG_HID_LED) += hid-led.o
obj-$(CONFIG_HID_XIAOMI) += hid-xiaomi.o
diff --git a/drivers/hid/hid-uclogic-rdesc-test.c b/drivers/hid/hid-uclogic-rdesc-test.c
new file mode 100644
index 000000000000..71917de02b03
--- /dev/null
+++ b/drivers/hid/hid-uclogic-rdesc-test.c
@@ -0,0 +1,179 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/*
+ * HID driver for UC-Logic devices not fully compliant with HID standard
+ *
+ * Copyright (c) 2022 José Expósito <jose.exposito89@gmail.com>
+ */
+
+#include <kunit/test.h>
+#include "./hid-uclogic-rdesc.h"
+
+struct uclogic_template_case {
+ const char *name;
+ const __u8 *template;
+ size_t template_size;
+ const s32 *param_list;
+ size_t param_num;
+ const __u8 *expected;
+};
+
+static const s32 params_pen_all[UCLOGIC_RDESC_PH_ID_NUM] = {
+ [UCLOGIC_RDESC_PEN_PH_ID_X_LM] = 0xAA,
+ [UCLOGIC_RDESC_PEN_PH_ID_X_PM] = 0xBB,
+ [UCLOGIC_RDESC_PEN_PH_ID_Y_LM] = 0xCC,
+ [UCLOGIC_RDESC_PEN_PH_ID_Y_PM] = 0xDD,
+ [UCLOGIC_RDESC_PEN_PH_ID_PRESSURE_LM] = 0xEE,
+};
+
+static const s32 params_pen_some[] = {
+ [UCLOGIC_RDESC_PEN_PH_ID_X_LM] = 0xAA,
+ [UCLOGIC_RDESC_PEN_PH_ID_X_PM] = 0xBB,
+};
+
+static const __u8 template_empty[] = { };
+static const __u8 template_small[] = { 0x00 };
+static const __u8 template_no_ph[] = { 0xAA, 0xFE, 0xAA, 0xED, 0x1D };
+
+static const __u8 template_pen_ph_end[] = {
+ 0xAA, 0xBB, UCLOGIC_RDESC_PEN_PH_HEAD
+};
+
+static const __u8 template_pen_all_params[] = {
+ UCLOGIC_RDESC_PEN_PH(X_LM),
+ 0x47, UCLOGIC_RDESC_PEN_PH(X_PM),
+ 0x27, UCLOGIC_RDESC_PEN_PH(Y_LM),
+ UCLOGIC_RDESC_PEN_PH(Y_PM),
+ 0x00, UCLOGIC_RDESC_PEN_PH(PRESSURE_LM),
+};
+
+static const __u8 expected_pen_all_params[] = {
+ 0xAA, 0x00, 0x00, 0x00,
+ 0x47, 0xBB, 0x00, 0x00, 0x00,
+ 0x27, 0xCC, 0x00, 0x00, 0x00,
+ 0xDD, 0x00, 0x00, 0x00,
+ 0x00, 0xEE, 0x00, 0x00, 0x00,
+};
+
+static const __u8 template_pen_some_params[] = {
+ 0x01, 0x02,
+ UCLOGIC_RDESC_PEN_PH(X_LM),
+ 0x03, UCLOGIC_RDESC_PEN_PH(X_PM),
+ 0x04, 0x05,
+};
+
+static const __u8 expected_pen_some_params[] = {
+ 0x01, 0x02,
+ 0xAA, 0x00, 0x00, 0x00,
+ 0x03, 0xBB, 0x00, 0x00, 0x00,
+ 0x04, 0x05,
+};
+
+static const __u8 template_params_none[] = {
+ 0x27, UCLOGIC_RDESC_PEN_PH(Y_LM),
+ UCLOGIC_RDESC_PEN_PH(Y_PM),
+ 0x00, UCLOGIC_RDESC_PEN_PH(PRESSURE_LM),
+};
+
+static struct uclogic_template_case uclogic_template_cases[] = {
+ {
+ .name = "Empty template",
+ .template = template_empty,
+ .template_size = sizeof(template_empty),
+ .param_list = params_pen_all,
+ .param_num = ARRAY_SIZE(params_pen_all),
+ .expected = template_empty,
+ },
+ {
+ .name = "Template smaller than the placeholder",
+ .template = template_small,
+ .template_size = sizeof(template_small),
+ .param_list = params_pen_all,
+ .param_num = ARRAY_SIZE(params_pen_all),
+ .expected = template_small,
+ },
+ {
+ .name = "No placeholder",
+ .template = template_no_ph,
+ .template_size = sizeof(template_no_ph),
+ .param_list = params_pen_all,
+ .param_num = ARRAY_SIZE(params_pen_all),
+ .expected = template_no_ph,
+ },
+ {
+ .name = "Pen placeholder at the end, without ID",
+ .template = template_pen_ph_end,
+ .template_size = sizeof(template_pen_ph_end),
+ .param_list = params_pen_all,
+ .param_num = ARRAY_SIZE(params_pen_all),
+ .expected = template_pen_ph_end,
+ },
+ {
+ .name = "All params present in the pen template",
+ .template = template_pen_all_params,
+ .template_size = sizeof(template_pen_all_params),
+ .param_list = params_pen_all,
+ .param_num = ARRAY_SIZE(params_pen_all),
+ .expected = expected_pen_all_params,
+ },
+ {
+ .name = "Some params present in the pen template (complete param list)",
+ .template = template_pen_some_params,
+ .template_size = sizeof(template_pen_some_params),
+ .param_list = params_pen_all,
+ .param_num = ARRAY_SIZE(params_pen_all),
+ .expected = expected_pen_some_params,
+ },
+ {
+ .name = "Some params present in the pen template (incomplete param list)",
+ .template = template_pen_some_params,
+ .template_size = sizeof(template_pen_some_params),
+ .param_list = params_pen_some,
+ .param_num = ARRAY_SIZE(params_pen_some),
+ .expected = expected_pen_some_params,
+ },
+ {
+ .name = "No params present in the template",
+ .template = template_params_none,
+ .template_size = sizeof(template_params_none),
+ .param_list = params_pen_some,
+ .param_num = ARRAY_SIZE(params_pen_some),
+ .expected = template_params_none,
+ },
+};
+
+static void uclogic_template_case_desc(struct uclogic_template_case *t,
+ char *desc)
+{
+ strscpy(desc, t->name, KUNIT_PARAM_DESC_SIZE);
+}
+
+KUNIT_ARRAY_PARAM(uclogic_template, uclogic_template_cases,
+ uclogic_template_case_desc);
+
+static void uclogic_template_test(struct kunit *test)
+{
+ __u8 *res;
+ const struct uclogic_template_case *params = test->param_value;
+
+ res = uclogic_rdesc_template_apply(params->template,
+ params->template_size,
+ params->param_list,
+ params->param_num);
+ KUNIT_ASSERT_NOT_ERR_OR_NULL(test, res);
+ KUNIT_EXPECT_EQ(test, 0,
+ memcmp(res, params->expected, params->template_size));
+ kfree(res);
+}
+
+static struct kunit_case hid_uclogic_rdesc_test_cases[] = {
+ KUNIT_CASE_PARAM(uclogic_template_test, uclogic_template_gen_params),
+ {}
+};
+
+static struct kunit_suite hid_uclogic_rdesc_test_suite = {
+ .name = "hid-uclogic-rdesc-test",
+ .test_cases = hid_uclogic_rdesc_test_cases,
+};
+
+kunit_test_suite(hid_uclogic_rdesc_test_suite);
--
2.25.1
next prev parent reply other threads:[~2022-05-16 18:14 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-16 18:13 [PATCH for-5.19/uclogic 0/4] Add support for XP-PEN Deco L José Expósito
2022-05-16 18:13 ` [PATCH for-5.19/uclogic 1/4] HID: uclogic: Make template placeholder IDs generic José Expósito
2022-05-16 18:13 ` José Expósito [this message]
2022-05-17 7:16 ` [PATCH for-5.19/uclogic 2/4] HID: uclogic: Add KUnit tests for uclogic_rdesc_template_apply() kernel test robot
2022-05-16 18:13 ` [PATCH for-5.19/uclogic 3/4] HID: uclogic: Allow to generate frame templates José Expósito
2022-05-17 23:30 ` kernel test robot
2022-05-16 18:13 ` [PATCH for-5.19/uclogic 4/4] HID: uclogic: Add support for XP-PEN Deco L José Expósito
2022-05-17 4:12 ` kernel test robot
2022-05-17 22:50 ` kernel test robot
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=20220516181323.59554-3-jose.exposito89@gmail.com \
--to=jose.exposito89@gmail.com \
--cc=benjamin.tissoires@redhat.com \
--cc=jikos@kernel.org \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=spbnick@gmail.com \
--cc=stefanberzl@gmail.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).