From 51d625244d5a56ee696b80971beda046b45d0496 Mon Sep 17 00:00:00 2001 From: Benjamin Tissoires Date: Tue, 11 Jul 2017 20:00:17 +0200 Subject: [PATCH] ratbagd: add a method to reset the test device to its defaults Make sure we keep the defaults as such by duplicating them in driver-test.c (and mark the input data as const). Add a dbus method to reset the test device from the caller. This is much useful when running tests given we have no guarantees on the ordering. Signed-off-by: Benjamin Tissoires --- ratbagd/ratbagd.c | 34 ++++++++++++++++++++++++++++++---- src/driver-test.c | 8 ++++++-- src/libratbag-private.h | 4 ++-- src/libratbag-test.c | 2 +- src/libratbag-test.h | 2 +- src/libratbag.c | 4 ++-- 6 files changed, 42 insertions(+), 12 deletions(-) diff --git a/ratbagd/ratbagd.c b/ratbagd/ratbagd.c index 84f0da9f..bcf741fc 100644 --- a/ratbagd/ratbagd.c +++ b/ratbagd/ratbagd.c @@ -188,7 +188,7 @@ static int ratbagd_get_themes(sd_bus *bus, /* A pre-setup sane device. Use for sanity testing by toggling the various * error conditions. */ -static struct ratbag_test_device ratbagd_test_device_descr = { +static const struct ratbag_test_device ratbagd_test_device_descr = { .num_profiles = 3, .num_resolutions = 3, .num_buttons = 4, @@ -290,12 +290,26 @@ static struct ratbag_test_device ratbagd_test_device_descr = { .destroyed_data = NULL, }; -static int ratbagd_create_test_device(struct ratbagd *ctx) +static int ratbagd_reset_test_device(sd_bus_message *m, + void *userdata, + sd_bus_error *error) { - struct ratbagd_device *ratbagd_test_device = NULL; + static struct ratbagd_device *ratbagd_test_device = NULL; + struct ratbagd *ctx = userdata; struct ratbag_device *device; int r; + if (ratbagd_test_device) { + (void) sd_bus_emit_signal(ctx->bus, + RATBAGD_OBJ_ROOT, + RATBAGD_NAME_ROOT ".Manager", + "DeviceRemoved", + "o", + ratbagd_device_get_path(ratbagd_test_device)); + ratbagd_device_unlink(ratbagd_test_device); + ratbagd_device_free(ratbagd_test_device); + } + device = ratbag_device_new_test_device(ctx->lib_ctx, &ratbagd_test_device_descr); r = ratbagd_device_new(&ratbagd_test_device, ctx, "test_device", device); @@ -309,6 +323,15 @@ static int ratbagd_create_test_device(struct ratbagd *ctx) } ratbagd_device_link(ratbagd_test_device); + if (m) { + (void) sd_bus_emit_signal(ctx->bus, + RATBAGD_OBJ_ROOT, + RATBAGD_NAME_ROOT ".Manager", + "DeviceNew", + "o", + ratbagd_device_get_path(ratbagd_test_device)); + sd_bus_reply_method_return(m, "u", r); + } return 0; } @@ -317,7 +340,7 @@ static void ratbagd_init_test_device(struct ratbagd *ctx) { setenv("RATBAG_TEST", "1", 0); - ratbagd_create_test_device(ctx); + ratbagd_reset_test_device(NULL, ctx, NULL); } #else /* RATBAG_DEVELOPER_EDITION */ @@ -330,6 +353,9 @@ static const sd_bus_vtable ratbagd_vtable[] = { SD_BUS_PROPERTY("Themes", "as", ratbagd_get_themes, 0, 0), SD_BUS_SIGNAL("DeviceNew", "o", 0), SD_BUS_SIGNAL("DeviceRemoved", "o", 0), +#ifdef RATBAG_DEVELOPER_EDITION + SD_BUS_METHOD("ResetTestDevice", "", "u", ratbagd_reset_test_device, SD_BUS_VTABLE_UNPRIVILEGED), +#endif /* RATBAG_DEVELOPER_EDITION */ SD_BUS_VTABLE_END, }; diff --git a/src/driver-test.c b/src/driver-test.c index 29944318..a8fb65c7 100644 --- a/src/driver-test.c +++ b/src/driver-test.c @@ -184,9 +184,12 @@ test_fake_probe(struct ratbag_device *device) } static int -test_probe(struct ratbag_device *device, void *data) +test_probe(struct ratbag_device *device, const void *data) { - struct ratbag_test_device *test_device = data; + struct ratbag_test_device *test_device; + + test_device = zalloc(sizeof(*test_device)); + memcpy(test_device, data, sizeof(*test_device)); ratbag_set_drv_data(device, test_device); ratbag_device_init_profiles(device, @@ -210,6 +213,7 @@ test_remove(struct ratbag_device *device) if (d->destroyed) d->destroyed(device, d->destroyed_data); ratbag_set_drv_data(device, NULL); + free(d); } struct ratbag_driver test_driver = { diff --git a/src/libratbag-private.h b/src/libratbag-private.h index 3674d14e..e8b98373 100644 --- a/src/libratbag-private.h +++ b/src/libratbag-private.h @@ -224,7 +224,7 @@ struct ratbag_driver { unsigned int brightness); /* private */ - int (*test_probe)(struct ratbag_device *device, void *data); + int (*test_probe)(struct ratbag_device *device, const void *data); struct list link; }; @@ -503,7 +503,7 @@ ratbag_device_get_udev_property(const struct ratbag_device* device, bool ratbag_assign_driver(struct ratbag_device *device, const struct input_id *dev_id, - struct ratbag_test_device *test_device); + const struct ratbag_test_device *test_device); void ratbag_register_driver(struct ratbag *ratbag, struct ratbag_driver *driver); diff --git a/src/libratbag-test.c b/src/libratbag-test.c index 79393054..6dc3cf44 100644 --- a/src/libratbag-test.c +++ b/src/libratbag-test.c @@ -50,7 +50,7 @@ ratbag_register_test_drivers(struct ratbag *ratbag) LIBRATBAG_EXPORT struct ratbag_device* ratbag_device_new_test_device(struct ratbag *ratbag, - struct ratbag_test_device *test_device) + const struct ratbag_test_device *test_device) { struct ratbag_device* device = NULL; #if BUILD_TESTS diff --git a/src/libratbag-test.h b/src/libratbag-test.h index 38500890..f9755358 100644 --- a/src/libratbag-test.h +++ b/src/libratbag-test.h @@ -82,5 +82,5 @@ struct ratbag_test_device { }; struct ratbag_device* ratbag_device_new_test_device(struct ratbag *ratbag, - struct ratbag_test_device *test_device); + const struct ratbag_test_device *test_device); diff --git a/src/libratbag.c b/src/libratbag.c index 858d9d15..104dbb44 100644 --- a/src/libratbag.c +++ b/src/libratbag.c @@ -290,7 +290,7 @@ static inline bool ratbag_test_driver(struct ratbag_device *device, const struct input_id *dev_id, const char *driver_name, - struct ratbag_test_device *test_device) + const struct ratbag_test_device *test_device) { struct ratbag *ratbag = device->ratbag; struct ratbag_driver *driver; @@ -353,7 +353,7 @@ ratbag_driver_fallback_logitech(struct ratbag_device *device, bool ratbag_assign_driver(struct ratbag_device *device, const struct input_id *dev_id, - struct ratbag_test_device *test_device) + const struct ratbag_test_device *test_device) { bool rc; const char *driver_name;