221 lines · c
1// SPDX-License-Identifier: GPL-2.0+2 3/*4 * HID driver for UC-Logic devices not fully compliant with HID standard5 *6 * Copyright (c) 2022 José Expósito <jose.exposito89@gmail.com>7 */8 9#include <kunit/test.h>10#include "./hid-uclogic-rdesc.h"11 12MODULE_IMPORT_NS(EXPORTED_FOR_KUNIT_TESTING);13 14struct uclogic_template_case {15 const char *name;16 const __u8 *template;17 size_t template_size;18 const s32 *param_list;19 size_t param_num;20 const __u8 *expected;21};22 23static const s32 params_pen_all[UCLOGIC_RDESC_PH_ID_NUM] = {24 [UCLOGIC_RDESC_PEN_PH_ID_X_LM] = 0xAA,25 [UCLOGIC_RDESC_PEN_PH_ID_X_PM] = 0xBB,26 [UCLOGIC_RDESC_PEN_PH_ID_Y_LM] = 0xCC,27 [UCLOGIC_RDESC_PEN_PH_ID_Y_PM] = 0xDD,28 [UCLOGIC_RDESC_PEN_PH_ID_PRESSURE_LM] = 0xEE,29};30 31static const s32 params_pen_some[] = {32 [UCLOGIC_RDESC_PEN_PH_ID_X_LM] = 0xAA,33 [UCLOGIC_RDESC_PEN_PH_ID_X_PM] = 0xBB,34};35 36static const s32 params_frame_all[UCLOGIC_RDESC_PH_ID_NUM] = {37 [UCLOGIC_RDESC_FRAME_PH_ID_UM] = 0xFF,38};39 40static const __u8 template_empty[] = { };41static const __u8 template_small[] = { 0x00 };42static const __u8 template_no_ph[] = { 0xAA, 0xFE, 0xAA, 0xED, 0x1D };43 44static const __u8 template_pen_ph_end[] = {45 0xAA, 0xBB, UCLOGIC_RDESC_PEN_PH_HEAD46};47 48static const __u8 template_btn_ph_end[] = {49 0xAA, 0xBB, UCLOGIC_RDESC_FRAME_PH_BTN_HEAD50};51 52static const __u8 template_pen_all_params[] = {53 UCLOGIC_RDESC_PEN_PH(X_LM),54 0x47, UCLOGIC_RDESC_PEN_PH(X_PM),55 0x27, UCLOGIC_RDESC_PEN_PH(Y_LM),56 UCLOGIC_RDESC_PEN_PH(Y_PM),57 0x00, UCLOGIC_RDESC_PEN_PH(PRESSURE_LM),58};59 60static const __u8 expected_pen_all_params[] = {61 0xAA, 0x00, 0x00, 0x00,62 0x47, 0xBB, 0x00, 0x00, 0x00,63 0x27, 0xCC, 0x00, 0x00, 0x00,64 0xDD, 0x00, 0x00, 0x00,65 0x00, 0xEE, 0x00, 0x00, 0x00,66};67 68static const __u8 template_frame_all_params[] = {69 0x01, 0x02,70 UCLOGIC_RDESC_FRAME_PH_BTN,71 0x99,72};73 74static const __u8 expected_frame_all_params[] = {75 0x01, 0x02,76 0x2A, 0xFF, 0x00,77 0x99,78};79 80static const __u8 template_pen_some_params[] = {81 0x01, 0x02,82 UCLOGIC_RDESC_PEN_PH(X_LM),83 0x03, UCLOGIC_RDESC_PEN_PH(X_PM),84 0x04, 0x05,85};86 87static const __u8 expected_pen_some_params[] = {88 0x01, 0x02,89 0xAA, 0x00, 0x00, 0x00,90 0x03, 0xBB, 0x00, 0x00, 0x00,91 0x04, 0x05,92};93 94static const __u8 template_params_none[] = {95 0x27, UCLOGIC_RDESC_PEN_PH(Y_LM),96 UCLOGIC_RDESC_PEN_PH(Y_PM),97 0x00, UCLOGIC_RDESC_PEN_PH(PRESSURE_LM),98};99 100static struct uclogic_template_case uclogic_template_cases[] = {101 {102 .name = "empty_template",103 .template = template_empty,104 .template_size = sizeof(template_empty),105 .param_list = params_pen_all,106 .param_num = ARRAY_SIZE(params_pen_all),107 .expected = template_empty,108 },109 {110 .name = "template_smaller_than_the_placeholder",111 .template = template_small,112 .template_size = sizeof(template_small),113 .param_list = params_pen_all,114 .param_num = ARRAY_SIZE(params_pen_all),115 .expected = template_small,116 },117 {118 .name = "no_placeholder",119 .template = template_no_ph,120 .template_size = sizeof(template_no_ph),121 .param_list = params_pen_all,122 .param_num = ARRAY_SIZE(params_pen_all),123 .expected = template_no_ph,124 },125 {126 .name = "pen_placeholder_at_the_end_without_id",127 .template = template_pen_ph_end,128 .template_size = sizeof(template_pen_ph_end),129 .param_list = params_pen_all,130 .param_num = ARRAY_SIZE(params_pen_all),131 .expected = template_pen_ph_end,132 },133 {134 .name = "frame_button_placeholder_at_the_end_without_id",135 .template = template_btn_ph_end,136 .template_size = sizeof(template_btn_ph_end),137 .param_list = params_frame_all,138 .param_num = ARRAY_SIZE(params_frame_all),139 .expected = template_btn_ph_end,140 },141 {142 .name = "all_params_present_in_the_pen_template",143 .template = template_pen_all_params,144 .template_size = sizeof(template_pen_all_params),145 .param_list = params_pen_all,146 .param_num = ARRAY_SIZE(params_pen_all),147 .expected = expected_pen_all_params,148 },149 {150 .name = "all_params_present_in_the_frame_template",151 .template = template_frame_all_params,152 .template_size = sizeof(template_frame_all_params),153 .param_list = params_frame_all,154 .param_num = ARRAY_SIZE(params_frame_all),155 .expected = expected_frame_all_params,156 },157 {158 .name = "some_params_present_in_the_pen_template_with_complete_param_list",159 .template = template_pen_some_params,160 .template_size = sizeof(template_pen_some_params),161 .param_list = params_pen_all,162 .param_num = ARRAY_SIZE(params_pen_all),163 .expected = expected_pen_some_params,164 },165 {166 .name = "some_params_present_in_the_pen_template_with_incomplete_param_list",167 .template = template_pen_some_params,168 .template_size = sizeof(template_pen_some_params),169 .param_list = params_pen_some,170 .param_num = ARRAY_SIZE(params_pen_some),171 .expected = expected_pen_some_params,172 },173 {174 .name = "no_params_present_in_the_template",175 .template = template_params_none,176 .template_size = sizeof(template_params_none),177 .param_list = params_pen_some,178 .param_num = ARRAY_SIZE(params_pen_some),179 .expected = template_params_none,180 },181};182 183static void uclogic_template_case_desc(struct uclogic_template_case *t,184 char *desc)185{186 strscpy(desc, t->name, KUNIT_PARAM_DESC_SIZE);187}188 189KUNIT_ARRAY_PARAM(uclogic_template, uclogic_template_cases,190 uclogic_template_case_desc);191 192static void hid_test_uclogic_template(struct kunit *test)193{194 __u8 *res;195 const struct uclogic_template_case *params = test->param_value;196 197 res = uclogic_rdesc_template_apply(params->template,198 params->template_size,199 params->param_list,200 params->param_num);201 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, res);202 KUNIT_EXPECT_MEMEQ(test, res, params->expected, params->template_size);203 kfree(res);204}205 206static struct kunit_case hid_uclogic_rdesc_test_cases[] = {207 KUNIT_CASE_PARAM(hid_test_uclogic_template, uclogic_template_gen_params),208 {}209};210 211static struct kunit_suite hid_uclogic_rdesc_test_suite = {212 .name = "hid_uclogic_rdesc_test",213 .test_cases = hid_uclogic_rdesc_test_cases,214};215 216kunit_test_suite(hid_uclogic_rdesc_test_suite);217 218MODULE_DESCRIPTION("KUnit tests for the UC-Logic driver");219MODULE_LICENSE("GPL");220MODULE_AUTHOR("José Expósito <jose.exposito89@gmail.com>");221