mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-16 11:19:12 +08:00
selftests/hid: cleanup C tests by adding a common struct uhid_device
Allows to have an abstract class uhid_device which handles all of the uhid part without having to mess up with individual fds. struct attach_prog_args is now never used in hid_bpf.c, so drop it as well Acked-by: Shuah Khan <skhan@linuxfoundation.org> Link: https://patch.msgid.link/20241001-hid-bpf-hid-generic-v3-6-2ef1019468df@kernel.org Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
This commit is contained in:
@@ -4,13 +4,6 @@
|
||||
#include "hid_common.h"
|
||||
#include <bpf/bpf.h>
|
||||
|
||||
struct attach_prog_args {
|
||||
int prog_fd;
|
||||
unsigned int hid;
|
||||
int retval;
|
||||
int insert_head;
|
||||
};
|
||||
|
||||
struct hid_hw_request_syscall_args {
|
||||
__u8 data[10];
|
||||
unsigned int hid;
|
||||
@@ -21,11 +14,8 @@ struct hid_hw_request_syscall_args {
|
||||
};
|
||||
|
||||
FIXTURE(hid_bpf) {
|
||||
int dev_id;
|
||||
int uhid_fd;
|
||||
struct uhid_device hid;
|
||||
int hidraw_fd;
|
||||
int hid_id;
|
||||
pthread_t tid;
|
||||
struct hid *skel;
|
||||
struct bpf_link *hid_links[3]; /* max number of programs loaded in a single test */
|
||||
};
|
||||
@@ -54,10 +44,10 @@ static void detach_bpf(FIXTURE_DATA(hid_bpf) * self)
|
||||
FIXTURE_TEARDOWN(hid_bpf) {
|
||||
void *uhid_err;
|
||||
|
||||
uhid_destroy(_metadata, self->uhid_fd);
|
||||
uhid_destroy(_metadata, &self->hid);
|
||||
|
||||
detach_bpf(self);
|
||||
pthread_join(self->tid, &uhid_err);
|
||||
pthread_join(self->hid.tid, &uhid_err);
|
||||
}
|
||||
#define TEARDOWN_LOG(fmt, ...) do { \
|
||||
TH_LOG(fmt, ##__VA_ARGS__); \
|
||||
@@ -66,23 +56,10 @@ FIXTURE_TEARDOWN(hid_bpf) {
|
||||
|
||||
FIXTURE_SETUP(hid_bpf)
|
||||
{
|
||||
time_t t;
|
||||
int err;
|
||||
|
||||
/* initialize random number generator */
|
||||
srand((unsigned int)time(&t));
|
||||
|
||||
self->dev_id = rand() % 1024;
|
||||
|
||||
self->uhid_fd = setup_uhid(_metadata, self->dev_id);
|
||||
|
||||
/* locate the uev, self, variant);ent file of the created device */
|
||||
self->hid_id = get_hid_id(self->dev_id);
|
||||
ASSERT_GT(self->hid_id, 0)
|
||||
TEARDOWN_LOG("Could not locate uhid device id: %d", self->hid_id);
|
||||
|
||||
err = uhid_start_listener(_metadata, &self->tid, self->uhid_fd);
|
||||
ASSERT_EQ(0, err) TEARDOWN_LOG("could not start udev listener: %d", err);
|
||||
err = setup_uhid(_metadata, &self->hid);
|
||||
ASSERT_OK(err);
|
||||
}
|
||||
|
||||
struct test_program {
|
||||
@@ -129,7 +106,7 @@ static void load_programs(const struct test_program programs[],
|
||||
ops_hid_id = bpf_map__initial_value(map, NULL);
|
||||
ASSERT_OK_PTR(ops_hid_id) TH_LOG("unable to retrieve struct_ops data");
|
||||
|
||||
*ops_hid_id = self->hid_id;
|
||||
*ops_hid_id = self->hid.hid_id;
|
||||
}
|
||||
|
||||
/* we disable the auto-attach feature of all maps because we
|
||||
@@ -157,7 +134,7 @@ static void load_programs(const struct test_program programs[],
|
||||
|
||||
hid__attach(self->skel);
|
||||
|
||||
self->hidraw_fd = open_hidraw(self->dev_id);
|
||||
self->hidraw_fd = open_hidraw(&self->hid);
|
||||
ASSERT_GE(self->hidraw_fd, 0) TH_LOG("open_hidraw");
|
||||
}
|
||||
|
||||
@@ -192,7 +169,7 @@ TEST_F(hid_bpf, raw_event)
|
||||
/* inject one event */
|
||||
buf[0] = 1;
|
||||
buf[1] = 42;
|
||||
uhid_send_event(_metadata, self->uhid_fd, buf, 6);
|
||||
uhid_send_event(_metadata, &self->hid, buf, 6);
|
||||
|
||||
/* check that hid_first_event() was executed */
|
||||
ASSERT_EQ(self->skel->data->callback_check, 42) TH_LOG("callback_check1");
|
||||
@@ -208,7 +185,7 @@ TEST_F(hid_bpf, raw_event)
|
||||
memset(buf, 0, sizeof(buf));
|
||||
buf[0] = 1;
|
||||
buf[1] = 47;
|
||||
uhid_send_event(_metadata, self->uhid_fd, buf, 6);
|
||||
uhid_send_event(_metadata, &self->hid, buf, 6);
|
||||
|
||||
/* check that hid_first_event() was executed */
|
||||
ASSERT_EQ(self->skel->data->callback_check, 47) TH_LOG("callback_check1");
|
||||
@@ -239,7 +216,7 @@ TEST_F(hid_bpf, subprog_raw_event)
|
||||
/* inject one event */
|
||||
buf[0] = 1;
|
||||
buf[1] = 42;
|
||||
uhid_send_event(_metadata, self->uhid_fd, buf, 6);
|
||||
uhid_send_event(_metadata, &self->hid, buf, 6);
|
||||
|
||||
/* read the data from hidraw */
|
||||
memset(buf, 0, sizeof(buf));
|
||||
@@ -252,7 +229,7 @@ TEST_F(hid_bpf, subprog_raw_event)
|
||||
memset(buf, 0, sizeof(buf));
|
||||
buf[0] = 1;
|
||||
buf[1] = 47;
|
||||
uhid_send_event(_metadata, self->uhid_fd, buf, 6);
|
||||
uhid_send_event(_metadata, &self->hid, buf, 6);
|
||||
|
||||
/* read the data from hidraw */
|
||||
memset(buf, 0, sizeof(buf));
|
||||
@@ -303,7 +280,7 @@ TEST_F(hid_bpf, test_attach_detach)
|
||||
/* inject one event */
|
||||
buf[0] = 1;
|
||||
buf[1] = 42;
|
||||
uhid_send_event(_metadata, self->uhid_fd, buf, 6);
|
||||
uhid_send_event(_metadata, &self->hid, buf, 6);
|
||||
|
||||
/* read the data from hidraw */
|
||||
memset(buf, 0, sizeof(buf));
|
||||
@@ -326,14 +303,14 @@ TEST_F(hid_bpf, test_attach_detach)
|
||||
/* detach the program */
|
||||
detach_bpf(self);
|
||||
|
||||
self->hidraw_fd = open_hidraw(self->dev_id);
|
||||
self->hidraw_fd = open_hidraw(&self->hid);
|
||||
ASSERT_GE(self->hidraw_fd, 0) TH_LOG("open_hidraw");
|
||||
|
||||
/* inject another event */
|
||||
memset(buf, 0, sizeof(buf));
|
||||
buf[0] = 1;
|
||||
buf[1] = 47;
|
||||
uhid_send_event(_metadata, self->uhid_fd, buf, 6);
|
||||
uhid_send_event(_metadata, &self->hid, buf, 6);
|
||||
|
||||
/* read the data from hidraw */
|
||||
memset(buf, 0, sizeof(buf));
|
||||
@@ -352,7 +329,7 @@ TEST_F(hid_bpf, test_attach_detach)
|
||||
memset(buf, 0, sizeof(buf));
|
||||
buf[0] = 1;
|
||||
buf[1] = 42;
|
||||
uhid_send_event(_metadata, self->uhid_fd, buf, 6);
|
||||
uhid_send_event(_metadata, &self->hid, buf, 6);
|
||||
|
||||
/* read the data from hidraw */
|
||||
memset(buf, 0, sizeof(buf));
|
||||
@@ -382,7 +359,7 @@ TEST_F(hid_bpf, test_hid_change_report)
|
||||
/* inject one event */
|
||||
buf[0] = 1;
|
||||
buf[1] = 42;
|
||||
uhid_send_event(_metadata, self->uhid_fd, buf, 6);
|
||||
uhid_send_event(_metadata, &self->hid, buf, 6);
|
||||
|
||||
/* read the data from hidraw */
|
||||
memset(buf, 0, sizeof(buf));
|
||||
@@ -412,7 +389,7 @@ TEST_F(hid_bpf, test_hid_user_input_report_call)
|
||||
|
||||
LOAD_BPF;
|
||||
|
||||
args.hid = self->hid_id;
|
||||
args.hid = self->hid.hid_id;
|
||||
args.data[0] = 1; /* report ID */
|
||||
args.data[1] = 2; /* report ID */
|
||||
args.data[2] = 42; /* report ID */
|
||||
@@ -458,7 +435,7 @@ TEST_F(hid_bpf, test_hid_user_output_report_call)
|
||||
|
||||
LOAD_BPF;
|
||||
|
||||
args.hid = self->hid_id;
|
||||
args.hid = self->hid.hid_id;
|
||||
args.data[0] = 1; /* report ID */
|
||||
args.data[1] = 2; /* report ID */
|
||||
args.data[2] = 42; /* report ID */
|
||||
@@ -506,7 +483,7 @@ TEST_F(hid_bpf, test_hid_user_raw_request_call)
|
||||
|
||||
LOAD_BPF;
|
||||
|
||||
args.hid = self->hid_id;
|
||||
args.hid = self->hid.hid_id;
|
||||
args.data[0] = 1; /* report ID */
|
||||
|
||||
prog_fd = bpf_program__fd(self->skel->progs.hid_user_raw_request);
|
||||
@@ -539,7 +516,7 @@ TEST_F(hid_bpf, test_hid_filter_raw_request_call)
|
||||
/* inject one event */
|
||||
buf[0] = 1;
|
||||
buf[1] = 42;
|
||||
uhid_send_event(_metadata, self->uhid_fd, buf, 6);
|
||||
uhid_send_event(_metadata, &self->hid, buf, 6);
|
||||
|
||||
/* read the data from hidraw */
|
||||
memset(buf, 0, sizeof(buf));
|
||||
@@ -565,7 +542,7 @@ TEST_F(hid_bpf, test_hid_filter_raw_request_call)
|
||||
/* detach the program */
|
||||
detach_bpf(self);
|
||||
|
||||
self->hidraw_fd = open_hidraw(self->dev_id);
|
||||
self->hidraw_fd = open_hidraw(&self->hid);
|
||||
ASSERT_GE(self->hidraw_fd, 0) TH_LOG("open_hidraw");
|
||||
|
||||
err = ioctl(self->hidraw_fd, HIDIOCGFEATURE(sizeof(buf)), buf);
|
||||
@@ -641,7 +618,7 @@ TEST_F(hid_bpf, test_hid_filter_output_report_call)
|
||||
/* inject one event */
|
||||
buf[0] = 1;
|
||||
buf[1] = 42;
|
||||
uhid_send_event(_metadata, self->uhid_fd, buf, 6);
|
||||
uhid_send_event(_metadata, &self->hid, buf, 6);
|
||||
|
||||
/* read the data from hidraw */
|
||||
memset(buf, 0, sizeof(buf));
|
||||
@@ -667,7 +644,7 @@ TEST_F(hid_bpf, test_hid_filter_output_report_call)
|
||||
/* detach the program */
|
||||
detach_bpf(self);
|
||||
|
||||
self->hidraw_fd = open_hidraw(self->dev_id);
|
||||
self->hidraw_fd = open_hidraw(&self->hid);
|
||||
ASSERT_GE(self->hidraw_fd, 0) TH_LOG("open_hidraw");
|
||||
|
||||
err = write(self->hidraw_fd, buf, 3);
|
||||
@@ -742,7 +719,7 @@ TEST_F(hid_bpf, test_multiply_events_wq)
|
||||
/* inject one event */
|
||||
buf[0] = 1;
|
||||
buf[1] = 42;
|
||||
uhid_send_event(_metadata, self->uhid_fd, buf, 6);
|
||||
uhid_send_event(_metadata, &self->hid, buf, 6);
|
||||
|
||||
/* read the data from hidraw */
|
||||
memset(buf, 0, sizeof(buf));
|
||||
@@ -780,7 +757,7 @@ TEST_F(hid_bpf, test_multiply_events)
|
||||
/* inject one event */
|
||||
buf[0] = 1;
|
||||
buf[1] = 42;
|
||||
uhid_send_event(_metadata, self->uhid_fd, buf, 6);
|
||||
uhid_send_event(_metadata, &self->hid, buf, 6);
|
||||
|
||||
/* read the data from hidraw */
|
||||
memset(buf, 0, sizeof(buf));
|
||||
@@ -816,7 +793,7 @@ TEST_F(hid_bpf, test_hid_infinite_loop_input_report_call)
|
||||
buf[1] = 2;
|
||||
buf[2] = 42;
|
||||
|
||||
uhid_send_event(_metadata, self->uhid_fd, buf, 6);
|
||||
uhid_send_event(_metadata, &self->hid, buf, 6);
|
||||
|
||||
/* read the data from hidraw */
|
||||
memset(buf, 0, sizeof(buf));
|
||||
@@ -867,7 +844,7 @@ TEST_F(hid_bpf, test_hid_attach_flags)
|
||||
|
||||
/* inject one event */
|
||||
buf[0] = 1;
|
||||
uhid_send_event(_metadata, self->uhid_fd, buf, 6);
|
||||
uhid_send_event(_metadata, &self->hid, buf, 6);
|
||||
|
||||
/* read the data from hidraw */
|
||||
memset(buf, 0, sizeof(buf));
|
||||
|
||||
@@ -19,6 +19,13 @@
|
||||
__typeof__(b) _b = (b); \
|
||||
_a < _b ? _a : _b; })
|
||||
|
||||
struct uhid_device {
|
||||
int dev_id; /* uniq (random) number to identify the device */
|
||||
int uhid_fd;
|
||||
int hid_id; /* HID device id in the system */
|
||||
pthread_t tid; /* thread for reading uhid events */
|
||||
};
|
||||
|
||||
static unsigned char rdesc[] = {
|
||||
0x06, 0x00, 0xff, /* Usage Page (Vendor Defined Page 1) */
|
||||
0x09, 0x21, /* Usage (Vendor Usage 0x21) */
|
||||
@@ -146,14 +153,14 @@ static int uhid_create(struct __test_metadata *_metadata, int fd, int rand_nb)
|
||||
return uhid_write(_metadata, fd, &ev);
|
||||
}
|
||||
|
||||
static void uhid_destroy(struct __test_metadata *_metadata, int fd)
|
||||
static void uhid_destroy(struct __test_metadata *_metadata, struct uhid_device *hid)
|
||||
{
|
||||
struct uhid_event ev;
|
||||
|
||||
memset(&ev, 0, sizeof(ev));
|
||||
ev.type = UHID_DESTROY;
|
||||
|
||||
uhid_write(_metadata, fd, &ev);
|
||||
uhid_write(_metadata, hid->uhid_fd, &ev);
|
||||
}
|
||||
|
||||
static int uhid_event(struct __test_metadata *_metadata, int fd)
|
||||
@@ -281,7 +288,8 @@ static int uhid_start_listener(struct __test_metadata *_metadata, pthread_t *tid
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int uhid_send_event(struct __test_metadata *_metadata, int fd, __u8 *buf, size_t size)
|
||||
static int uhid_send_event(struct __test_metadata *_metadata, struct uhid_device *hid,
|
||||
__u8 *buf, size_t size)
|
||||
{
|
||||
struct uhid_event ev;
|
||||
|
||||
@@ -294,25 +302,7 @@ static int uhid_send_event(struct __test_metadata *_metadata, int fd, __u8 *buf,
|
||||
|
||||
memcpy(ev.u.input2.data, buf, size);
|
||||
|
||||
return uhid_write(_metadata, fd, &ev);
|
||||
}
|
||||
|
||||
static int setup_uhid(struct __test_metadata *_metadata, int rand_nb)
|
||||
{
|
||||
int fd;
|
||||
const char *path = "/dev/uhid";
|
||||
int ret;
|
||||
|
||||
fd = open(path, O_RDWR | O_CLOEXEC);
|
||||
ASSERT_GE(fd, 0) TH_LOG("open uhid-cdev failed; %d", fd);
|
||||
|
||||
ret = uhid_create(_metadata, fd, rand_nb);
|
||||
ASSERT_EQ(0, ret) {
|
||||
TH_LOG("create uhid device failed: %d", ret);
|
||||
close(fd);
|
||||
}
|
||||
|
||||
return fd;
|
||||
return uhid_write(_metadata, hid->uhid_fd, &ev);
|
||||
}
|
||||
|
||||
static bool match_sysfs_device(int dev_id, const char *workdir, struct dirent *dir)
|
||||
@@ -421,12 +411,12 @@ static int get_hidraw(int dev_id)
|
||||
return found;
|
||||
}
|
||||
|
||||
static int open_hidraw(int dev_id)
|
||||
static int open_hidraw(struct uhid_device *hid)
|
||||
{
|
||||
int hidraw_number;
|
||||
char hidraw_path[64] = { 0 };
|
||||
|
||||
hidraw_number = get_hidraw(dev_id);
|
||||
hidraw_number = get_hidraw(hid->dev_id);
|
||||
if (hidraw_number < 0)
|
||||
return hidraw_number;
|
||||
|
||||
@@ -434,3 +424,39 @@ static int open_hidraw(int dev_id)
|
||||
sprintf(hidraw_path, "/dev/hidraw%d", hidraw_number);
|
||||
return open(hidraw_path, O_RDWR | O_NONBLOCK);
|
||||
}
|
||||
|
||||
static int setup_uhid(struct __test_metadata *_metadata, struct uhid_device *hid)
|
||||
{
|
||||
const char *path = "/dev/uhid";
|
||||
time_t t;
|
||||
int ret;
|
||||
|
||||
/* initialize random number generator */
|
||||
srand((unsigned int)time(&t));
|
||||
|
||||
hid->dev_id = rand() % 1024;
|
||||
|
||||
hid->uhid_fd = open(path, O_RDWR | O_CLOEXEC);
|
||||
ASSERT_GE(hid->uhid_fd, 0) TH_LOG("open uhid-cdev failed; %d", hid->uhid_fd);
|
||||
|
||||
ret = uhid_create(_metadata, hid->uhid_fd, hid->dev_id);
|
||||
ASSERT_EQ(0, ret) {
|
||||
TH_LOG("create uhid device failed: %d", ret);
|
||||
close(hid->uhid_fd);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* locate the uevent file of the created device */
|
||||
hid->hid_id = get_hid_id(hid->dev_id);
|
||||
ASSERT_GT(hid->hid_id, 0)
|
||||
TH_LOG("Could not locate uhid device id: %d", hid->hid_id);
|
||||
|
||||
ret = uhid_start_listener(_metadata, &hid->tid, hid->uhid_fd);
|
||||
ASSERT_EQ(0, ret) {
|
||||
TH_LOG("could not start udev listener: %d", ret);
|
||||
close(hid->uhid_fd);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -9,11 +9,8 @@
|
||||
#endif /* HIDIOCREVOKE */
|
||||
|
||||
FIXTURE(hidraw) {
|
||||
int dev_id;
|
||||
int uhid_fd;
|
||||
struct uhid_device hid;
|
||||
int hidraw_fd;
|
||||
int hid_id;
|
||||
pthread_t tid;
|
||||
};
|
||||
static void close_hidraw(FIXTURE_DATA(hidraw) * self)
|
||||
{
|
||||
@@ -25,10 +22,10 @@ static void close_hidraw(FIXTURE_DATA(hidraw) * self)
|
||||
FIXTURE_TEARDOWN(hidraw) {
|
||||
void *uhid_err;
|
||||
|
||||
uhid_destroy(_metadata, self->uhid_fd);
|
||||
uhid_destroy(_metadata, &self->hid);
|
||||
|
||||
close_hidraw(self);
|
||||
pthread_join(self->tid, &uhid_err);
|
||||
pthread_join(self->hid.tid, &uhid_err);
|
||||
}
|
||||
#define TEARDOWN_LOG(fmt, ...) do { \
|
||||
TH_LOG(fmt, ##__VA_ARGS__); \
|
||||
@@ -37,25 +34,12 @@ FIXTURE_TEARDOWN(hidraw) {
|
||||
|
||||
FIXTURE_SETUP(hidraw)
|
||||
{
|
||||
time_t t;
|
||||
int err;
|
||||
|
||||
/* initialize random number generator */
|
||||
srand((unsigned int)time(&t));
|
||||
err = setup_uhid(_metadata, &self->hid);
|
||||
ASSERT_OK(err);
|
||||
|
||||
self->dev_id = rand() % 1024;
|
||||
|
||||
self->uhid_fd = setup_uhid(_metadata, self->dev_id);
|
||||
|
||||
/* locate the uev, self, variant);ent file of the created device */
|
||||
self->hid_id = get_hid_id(self->dev_id);
|
||||
ASSERT_GT(self->hid_id, 0)
|
||||
TEARDOWN_LOG("Could not locate uhid device id: %d", self->hid_id);
|
||||
|
||||
err = uhid_start_listener(_metadata, &self->tid, self->uhid_fd);
|
||||
ASSERT_EQ(0, err) TEARDOWN_LOG("could not start udev listener: %d", err);
|
||||
|
||||
self->hidraw_fd = open_hidraw(self->dev_id);
|
||||
self->hidraw_fd = open_hidraw(&self->hid);
|
||||
ASSERT_GE(self->hidraw_fd, 0) TH_LOG("open_hidraw");
|
||||
}
|
||||
|
||||
@@ -79,7 +63,7 @@ TEST_F(hidraw, raw_event)
|
||||
/* inject one event */
|
||||
buf[0] = 1;
|
||||
buf[1] = 42;
|
||||
uhid_send_event(_metadata, self->uhid_fd, buf, 6);
|
||||
uhid_send_event(_metadata, &self->hid, buf, 6);
|
||||
|
||||
/* read the data from hidraw */
|
||||
memset(buf, 0, sizeof(buf));
|
||||
@@ -101,7 +85,7 @@ TEST_F(hidraw, raw_event_revoked)
|
||||
/* inject one event */
|
||||
buf[0] = 1;
|
||||
buf[1] = 42;
|
||||
uhid_send_event(_metadata, self->uhid_fd, buf, 6);
|
||||
uhid_send_event(_metadata, &self->hid, buf, 6);
|
||||
|
||||
/* read the data from hidraw */
|
||||
memset(buf, 0, sizeof(buf));
|
||||
@@ -117,7 +101,7 @@ TEST_F(hidraw, raw_event_revoked)
|
||||
/* inject one other event */
|
||||
buf[0] = 1;
|
||||
buf[1] = 43;
|
||||
uhid_send_event(_metadata, self->uhid_fd, buf, 6);
|
||||
uhid_send_event(_metadata, &self->hid, buf, 6);
|
||||
|
||||
/* read the data from hidraw */
|
||||
memset(buf, 0, sizeof(buf));
|
||||
@@ -161,7 +145,7 @@ TEST_F(hidraw, poll_revoked)
|
||||
/* inject one event */
|
||||
buf[0] = 1;
|
||||
buf[1] = 42;
|
||||
uhid_send_event(_metadata, self->uhid_fd, buf, 6);
|
||||
uhid_send_event(_metadata, &self->hid, buf, 6);
|
||||
|
||||
while (true) {
|
||||
ready = poll(pfds, 1, 5000);
|
||||
|
||||
Reference in New Issue
Block a user