diff --git a/unit/test-uhid.c b/unit/test-uhid.c
index 573da31..2765feb 100644
--- a/unit/test-uhid.c
+++ b/unit/test-uhid.c
size_t size;
};
+struct test_device {
+ const char *name;
+ uint32_t vendor;
+ uint32_t product;
+ uint32_t version;
+ uint32_t country;
+ uint8_t type;
+ struct iovec map;
+};
+
struct test_data {
char *test_name;
+ struct test_device *test_device;
struct test_pdu *pdu_list;
};
.size = sizeof(*args), \
}
-#define define_test(name, function, args...) \
+#define define_test_device(name, function, device, args...) \
do { \
const struct test_pdu pdus[] = { \
args, { } \
}; \
static struct test_data data; \
data.test_name = g_strdup(name); \
+ data.test_device = device; \
data.pdu_list = util_memdup(pdus, sizeof(pdus)); \
tester_add(name, &data, NULL, function, NULL); \
} while (0)
+#define define_test(name, function, args...) \
+ define_test_device(name, function, NULL, args)
+
static void test_debug(const char *str, void *user_data)
{
const char *prefix = user_data;
static struct context *create_context(gconstpointer data)
{
struct context *context = g_new0(struct context, 1);
+ const struct test_data *test_data = data;
GIOChannel *channel;
int err, sv[2];
+ uid_t uid = getuid();
+
+ context->data = data;
+
+ /* Device testings requires extra permissions in order to be able to
+ * create devices.
+ */
+ if (test_data->test_device && !uid) {
+ context->uhid = bt_uhid_new_default();
+ return context;
+ }
err = socketpair(AF_UNIX, SOCK_SEQPACKET | SOCK_CLOEXEC, 0, sv);
g_assert(err == 0);
g_io_channel_unref(channel);
context->fd = sv[1];
- context->data = data;
return context;
}
static void test_client(gconstpointer data)
{
struct context *context = create_context(data);
+ struct test_device *device = context->data->test_device;
int err;
- err = bt_uhid_create(context->uhid, "", NULL, NULL, 0, 0, 0, 0,
- BT_UHID_NONE, NULL, 0);
+ if (device)
+ err = bt_uhid_create(context->uhid, device->name,
+ BDADDR_ANY, BDADDR_ANY,
+ device->vendor, device->product,
+ device->version, device->country,
+ device->type, device->map.iov_base,
+ device->map.iov_len);
+ else
+ err = bt_uhid_create(context->uhid, "", NULL, NULL, 0, 0, 0, 0,
+ BT_UHID_NONE, NULL, 0);
+
if (err < 0) {
tester_debug("create failed: %s\n", strerror(-err));
tester_test_failed();
g_idle_add(send_pdu, context);
}
+
+static struct test_device mx_anywhere_3 = {
+ .name = "MX Anywhere 3",
+ .vendor = 0x46D,
+ .product = 0xB025,
+ .version = 0x14,
+ .country = 0x00,
+ .type = BT_UHID_MOUSE,
+ .map = UTIL_IOV_INIT(0x05, 0x01, 0x09, 0x02, 0xA1, 0x01, 0x85, 0x02,
+ 0x09, 0x01, 0xA1, 0x00, 0x95, 0x10, 0x75, 0x01,
+ 0x15, 0x00, 0x25, 0x01, 0x05, 0x09, 0x19, 0x01,
+ 0x29, 0x10, 0x81, 0x02, 0x05, 0x01, 0x16, 0x01,
+ 0xF8, 0x26, 0xFF, 0x07, 0x75, 0x0C, 0x95, 0x02,
+ 0x09, 0x30, 0x09, 0x31, 0x81, 0x06, 0x15, 0x81,
+ 0x25, 0x7F, 0x75, 0x08, 0x95, 0x01, 0x09, 0x38,
+ 0x81, 0x06, 0x95, 0x01, 0x05, 0x0C, 0x0A, 0x38,
+ 0x02, 0x81, 0x06, 0xC0, 0xC0, 0x06, 0x43, 0xFF,
+ 0x0A, 0x02, 0x02, 0xA1, 0x01, 0x85, 0x11, 0x75,
+ 0x08, 0x95, 0x13, 0x15, 0x00, 0x26, 0xFF, 0x00,
+ 0x09, 0x02, 0x81, 0x00, 0x09, 0x02, 0x91, 0x00,
+ 0xC0),
+};
+
int main(int argc, char *argv[])
{
tester_init(&argc, &argv);
define_test("/uhid/event/output", test_server, event(&ev_output));
define_test("/uhid/event/feature", test_server, event(&ev_feature));
+ define_test_device("/uhid/device/mx_anywhere_3", test_client,
+ &mx_anywhere_3, event(&ev_create));
+
return tester_run();
}