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