xref: /openbmc/linux/drivers/hid/hid-uclogic-core-test.c (revision a251d6576d2a29fc0806ef4775719e3b6e672d91)
1*a251d657SJosé Expósito // SPDX-License-Identifier: GPL-2.0+
2*a251d657SJosé Expósito 
3*a251d657SJosé Expósito /*
4*a251d657SJosé Expósito  *  HID driver for UC-Logic devices not fully compliant with HID standard
5*a251d657SJosé Expósito  *
6*a251d657SJosé Expósito  *  Copyright (c) 2022 José Expósito <jose.exposito89@gmail.com>
7*a251d657SJosé Expósito  */
8*a251d657SJosé Expósito 
9*a251d657SJosé Expósito #include <kunit/test.h>
10*a251d657SJosé Expósito #include "./hid-uclogic-params.h"
11*a251d657SJosé Expósito 
12*a251d657SJosé Expósito #define MAX_EVENT_SIZE 12
13*a251d657SJosé Expósito 
14*a251d657SJosé Expósito struct uclogic_raw_event_hook_test {
15*a251d657SJosé Expósito 	u8 event[MAX_EVENT_SIZE];
16*a251d657SJosé Expósito 	size_t size;
17*a251d657SJosé Expósito 	bool expected;
18*a251d657SJosé Expósito };
19*a251d657SJosé Expósito 
20*a251d657SJosé Expósito static struct uclogic_raw_event_hook_test hook_events[] = {
21*a251d657SJosé Expósito 	{
22*a251d657SJosé Expósito 		.event = { 0xA1, 0xB2, 0xC3, 0xD4 },
23*a251d657SJosé Expósito 		.size = 4,
24*a251d657SJosé Expósito 	},
25*a251d657SJosé Expósito 	{
26*a251d657SJosé Expósito 		.event = { 0x1F, 0x2E, 0x3D, 0x4C, 0x5B, 0x6A },
27*a251d657SJosé Expósito 		.size = 6,
28*a251d657SJosé Expósito 	},
29*a251d657SJosé Expósito };
30*a251d657SJosé Expósito 
31*a251d657SJosé Expósito static struct uclogic_raw_event_hook_test test_events[] = {
32*a251d657SJosé Expósito 	{
33*a251d657SJosé Expósito 		.event = { 0xA1, 0xB2, 0xC3, 0xD4 },
34*a251d657SJosé Expósito 		.size = 4,
35*a251d657SJosé Expósito 		.expected = true,
36*a251d657SJosé Expósito 	},
37*a251d657SJosé Expósito 	{
38*a251d657SJosé Expósito 		.event = { 0x1F, 0x2E, 0x3D, 0x4C, 0x5B, 0x6A },
39*a251d657SJosé Expósito 		.size = 6,
40*a251d657SJosé Expósito 		.expected = true,
41*a251d657SJosé Expósito 	},
42*a251d657SJosé Expósito 	{
43*a251d657SJosé Expósito 		.event = { 0xA1, 0xB2, 0xC3 },
44*a251d657SJosé Expósito 		.size = 3,
45*a251d657SJosé Expósito 		.expected = false,
46*a251d657SJosé Expósito 	},
47*a251d657SJosé Expósito 	{
48*a251d657SJosé Expósito 		.event = { 0xA1, 0xB2, 0xC3, 0xD4, 0x00 },
49*a251d657SJosé Expósito 		.size = 5,
50*a251d657SJosé Expósito 		.expected = false,
51*a251d657SJosé Expósito 	},
52*a251d657SJosé Expósito 	{
53*a251d657SJosé Expósito 		.event = { 0x2E, 0x3D, 0x4C, 0x5B, 0x6A, 0x1F },
54*a251d657SJosé Expósito 		.size = 6,
55*a251d657SJosé Expósito 		.expected = false,
56*a251d657SJosé Expósito 	},
57*a251d657SJosé Expósito };
58*a251d657SJosé Expósito 
59*a251d657SJosé Expósito static void hid_test_uclogic_exec_event_hook_test(struct kunit *test)
60*a251d657SJosé Expósito {
61*a251d657SJosé Expósito 	struct uclogic_params p = {0, };
62*a251d657SJosé Expósito 	struct uclogic_raw_event_hook *filter;
63*a251d657SJosé Expósito 	bool res;
64*a251d657SJosé Expósito 	int n;
65*a251d657SJosé Expósito 
66*a251d657SJosé Expósito 	/* Initialize the list of events to hook */
67*a251d657SJosé Expósito 	p.event_hooks = kunit_kzalloc(test, sizeof(*p.event_hooks), GFP_KERNEL);
68*a251d657SJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, p.event_hooks);
69*a251d657SJosé Expósito 	INIT_LIST_HEAD(&p.event_hooks->list);
70*a251d657SJosé Expósito 
71*a251d657SJosé Expósito 	for (n = 0; n < ARRAY_SIZE(hook_events); n++) {
72*a251d657SJosé Expósito 		filter = kunit_kzalloc(test, sizeof(*filter), GFP_KERNEL);
73*a251d657SJosé Expósito 		KUNIT_ASSERT_NOT_ERR_OR_NULL(test, filter);
74*a251d657SJosé Expósito 
75*a251d657SJosé Expósito 		filter->size = hook_events[n].size;
76*a251d657SJosé Expósito 		filter->event = kunit_kzalloc(test, filter->size, GFP_KERNEL);
77*a251d657SJosé Expósito 		KUNIT_ASSERT_NOT_ERR_OR_NULL(test, filter->event);
78*a251d657SJosé Expósito 		memcpy(filter->event, &hook_events[n].event[0], filter->size);
79*a251d657SJosé Expósito 
80*a251d657SJosé Expósito 		list_add_tail(&filter->list, &p.event_hooks->list);
81*a251d657SJosé Expósito 	}
82*a251d657SJosé Expósito 
83*a251d657SJosé Expósito 	/* Test uclogic_exec_event_hook() */
84*a251d657SJosé Expósito 	for (n = 0; n < ARRAY_SIZE(test_events); n++) {
85*a251d657SJosé Expósito 		res = uclogic_exec_event_hook(&p, &test_events[n].event[0],
86*a251d657SJosé Expósito 					      test_events[n].size);
87*a251d657SJosé Expósito 		KUNIT_ASSERT_EQ(test, res, test_events[n].expected);
88*a251d657SJosé Expósito 	}
89*a251d657SJosé Expósito }
90*a251d657SJosé Expósito 
91*a251d657SJosé Expósito static struct kunit_case hid_uclogic_core_test_cases[] = {
92*a251d657SJosé Expósito 	KUNIT_CASE(hid_test_uclogic_exec_event_hook_test),
93*a251d657SJosé Expósito 	{}
94*a251d657SJosé Expósito };
95*a251d657SJosé Expósito 
96*a251d657SJosé Expósito static struct kunit_suite hid_uclogic_core_test_suite = {
97*a251d657SJosé Expósito 	.name = "hid_uclogic_core_test",
98*a251d657SJosé Expósito 	.test_cases = hid_uclogic_core_test_cases,
99*a251d657SJosé Expósito };
100*a251d657SJosé Expósito 
101*a251d657SJosé Expósito kunit_test_suite(hid_uclogic_core_test_suite);
102*a251d657SJosé Expósito 
103*a251d657SJosé Expósito MODULE_DESCRIPTION("KUnit tests for the UC-Logic driver");
104*a251d657SJosé Expósito MODULE_LICENSE("GPL");
105*a251d657SJosé Expósito MODULE_AUTHOR("José Expósito <jose.exposito89@gmail.com>");
106