mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
219 lines
5.9 KiB
219 lines
5.9 KiB
// SPDX-License-Identifier: GPL-2.0+ |
|
|
|
/* |
|
* HID driver for UC-Logic devices not fully compliant with HID standard |
|
* |
|
* Copyright (c) 2022 José Expósito <[email protected]> |
|
*/ |
|
|
|
#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 s32 params_frame_all[UCLOGIC_RDESC_PH_ID_NUM] = { |
|
[UCLOGIC_RDESC_FRAME_PH_ID_UM] = 0xFF, |
|
}; |
|
|
|
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_btn_ph_end[] = { |
|
0xAA, 0xBB, UCLOGIC_RDESC_FRAME_PH_BTN_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_frame_all_params[] = { |
|
0x01, 0x02, |
|
UCLOGIC_RDESC_FRAME_PH_BTN, |
|
0x99, |
|
}; |
|
|
|
static const __u8 expected_frame_all_params[] = { |
|
0x01, 0x02, |
|
0x2A, 0xFF, 0x00, |
|
0x99, |
|
}; |
|
|
|
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 = "frame_button_placeholder_at_the_end_without_id", |
|
.template = template_btn_ph_end, |
|
.template_size = sizeof(template_btn_ph_end), |
|
.param_list = params_frame_all, |
|
.param_num = ARRAY_SIZE(params_frame_all), |
|
.expected = template_btn_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 = "all_params_present_in_the_frame_template", |
|
.template = template_frame_all_params, |
|
.template_size = sizeof(template_frame_all_params), |
|
.param_list = params_frame_all, |
|
.param_num = ARRAY_SIZE(params_frame_all), |
|
.expected = expected_frame_all_params, |
|
}, |
|
{ |
|
.name = "some_params_present_in_the_pen_template_with_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_with_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); |
|
|
|
MODULE_DESCRIPTION("KUnit tests for the UC-Logic driver"); |
|
MODULE_LICENSE("GPL"); |
|
MODULE_AUTHOR("José Expósito <[email protected]>");
|
|
|