test: use drop caps, not reject caps as terminology

And add a test that tests for dropped caps

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Peter Hutterer 2020-08-11 12:37:00 +10:00
parent 7ae661a029
commit 7d75b3eb8c
3 changed files with 91 additions and 42 deletions

View file

@ -115,22 +115,27 @@ peck_enable_eis_behavior(struct peck *peck, enum peck_eis_behavior behavior)
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_TOUCH);
break;
case PECK_EIS_BEHAVIOR_REJECT_DEVICE:
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_REJECT_POINTER);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_REJECT_KEYBOARD);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_REJECT_TOUCH);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_DROP_POINTER);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_DROP_KEYBOARD);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_DROP_TOUCH);
break;
case PECK_EIS_BEHAVIOR_REJECT_CLIENT:
case PECK_EIS_BEHAVIOR_REJECT_POINTER:
case PECK_EIS_BEHAVIOR_REJECT_KEYBOARD:
case PECK_EIS_BEHAVIOR_REJECT_TOUCH:
case PECK_EIS_BEHAVIOR_DROP_POINTER:
case PECK_EIS_BEHAVIOR_DROP_KEYBOARD:
case PECK_EIS_BEHAVIOR_DROP_TOUCH:
flag_clear(peck->eis_behavior, behavior - 1);
flag_set(peck->eis_behavior, behavior);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_DEVICE);
break;
case PECK_EIS_BEHAVIOR_ACCEPT_CLIENT:
case PECK_EIS_BEHAVIOR_ACCEPT_POINTER:
case PECK_EIS_BEHAVIOR_ACCEPT_KEYBOARD:
case PECK_EIS_BEHAVIOR_ACCEPT_TOUCH:
flag_clear(peck->eis_behavior, behavior + 1);
flag_set(peck->eis_behavior, behavior);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_DEVICE);
break;
case PECK_EIS_BEHAVIOR_HANDLE_DEVICE:
flag_set(peck->eis_behavior, behavior);
break;
}
@ -172,34 +177,40 @@ peck_handle_eis_connect(struct peck *peck, struct eis_event *e)
}
}
static inline tristate
peck_check_eis_added(struct peck *peck, struct eis_event *e)
static inline void
peck_handle_eis_added(struct peck *peck, struct eis_event *e)
{
struct eis_device *device = eis_event_get_device(e);
tristate accept = tristate_unset;
uint32_t mask = 0;
struct map {
enum eis_device_capability cap;
enum peck_eis_behavior behavior;
} map[] = {
{ EIS_DEVICE_CAP_POINTER, PECK_EIS_BEHAVIOR_ACCEPT_POINTER },
// { EIS_DEVICE_CAP_POINTER_ABSOLUTE, PECK_EIS_BEHAVIOR_ACCEPT_POINTER_ABSOLUTE },
{ EIS_DEVICE_CAP_KEYBOARD, PECK_EIS_BEHAVIOR_ACCEPT_KEYBOARD },
{ EIS_DEVICE_CAP_TOUCH, PECK_EIS_BEHAVIOR_ACCEPT_TOUCH },
};
struct map *m;
if (eis_device_has_capability(device, EIS_DEVICE_CAP_POINTER)) {
if (flag_is_set(peck->eis_behavior, PECK_EIS_BEHAVIOR_ACCEPT_POINTER))
accept = tristate_yes;
else if (flag_is_set(peck->eis_behavior, PECK_EIS_BEHAVIOR_REJECT_POINTER))
accept = tristate_no;
ARRAY_FOR_EACH(map, m) {
if (eis_device_has_capability(device, m->cap)) {
if (flag_is_set(peck->eis_behavior, m->behavior)) {
mask |= bit(m->cap);
} else {
log_debug(peck, "Dropping cap %d\n", m->cap);
eis_device_disable_capability(device, m->cap);
}
}
}
if (eis_device_has_capability(device, EIS_DEVICE_CAP_KEYBOARD)) {
if (flag_is_set(peck->eis_behavior, PECK_EIS_BEHAVIOR_ACCEPT_KEYBOARD))
accept = tristate_yes;
else if (flag_is_set(peck->eis_behavior, PECK_EIS_BEHAVIOR_REJECT_KEYBOARD))
accept = tristate_no;
if (!mask) {
log_debug(peck, "EIS refusing device\n");
eis_device_disconnect(eis_event_get_device(e));
} else {
log_debug(peck, "EIS adding device\n");
eis_device_connect(eis_event_get_device(e));
}
if (eis_device_has_capability(device, EIS_DEVICE_CAP_TOUCH)) {
if (flag_is_set(peck->eis_behavior, PECK_EIS_BEHAVIOR_ACCEPT_TOUCH))
accept = tristate_yes;
else if (flag_is_set(peck->eis_behavior, PECK_EIS_BEHAVIOR_REJECT_TOUCH))
accept = tristate_no;
}
return accept;
}
void
@ -230,10 +241,10 @@ peck_dispatch_eis(struct peck *peck)
break;
case EIS_EVENT_DEVICE_ADDED:
case EIS_EVENT_DEVICE_REMOVED:
if (tristate_is_unset(peck_check_eis_added(peck, e)))
process_event = tristate_no;
else
if (flag_is_set(peck->eis_behavior, PECK_EIS_BEHAVIOR_HANDLE_DEVICE))
process_event = tristate_yes;
else
process_event = tristate_no;
break;
default:
break;
@ -261,13 +272,7 @@ peck_dispatch_eis(struct peck *peck)
eis_client_disconnect(eis_event_get_client(e));
break;
case EIS_EVENT_DEVICE_ADDED:
if (tristate_is_yes(peck_check_eis_added(peck, e))) {
log_debug(peck, "EIS adding device\n");
eis_device_connect(eis_event_get_device(e));
} else {
log_debug(peck, "EIS refusing device\n");
eis_device_disconnect(eis_event_get_device(e));
}
peck_handle_eis_added(peck, e);
break;
case EIS_EVENT_DEVICE_REMOVED:
log_debug(peck, "EIS removing device\n");

View file

@ -61,17 +61,18 @@ enum peck_eis_behavior {
/**
* Process add/remove requests from the client.
*/
PECK_EIS_BEHAVIOR_HANDLE_DEVICE, /* Implied by the various ones below */
PECK_EIS_BEHAVIOR_ACCEPT_DEVICE,
PECK_EIS_BEHAVIOR_REJECT_DEVICE,
PECK_EIS_BEHAVIOR_ACCEPT_POINTER,
PECK_EIS_BEHAVIOR_REJECT_POINTER,
PECK_EIS_BEHAVIOR_DROP_POINTER,
PECK_EIS_BEHAVIOR_ACCEPT_KEYBOARD,
PECK_EIS_BEHAVIOR_REJECT_KEYBOARD,
PECK_EIS_BEHAVIOR_DROP_KEYBOARD,
PECK_EIS_BEHAVIOR_ACCEPT_TOUCH,
PECK_EIS_BEHAVIOR_REJECT_TOUCH,
PECK_EIS_BEHAVIOR_DROP_TOUCH,
};
enum peck_ei_behavior {

View file

@ -177,6 +177,48 @@ test_ei_device_add(const MunitParameter params[], void *user_data)
return MUNIT_OK;
}
static MunitResult
test_ei_device_add_drop_caps(const MunitParameter params[], void *user_data)
{
_cleanup_peck_ struct peck *peck = peck_new();
/* Device with pointer and keyboard caps but pointer is dropped */
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_DROP_POINTER);
peck_dispatch_eis(peck);
peck_dispatch_ei(peck);
peck_dispatch_eis(peck);
peck_dispatch_ei(peck);
_cleanup_ei_device_ struct ei_device *device = NULL;
with_client(peck) {
device = ei_device_new(ei);
ei_device_configure_name(device, __func__);
ei_device_configure_capability(device, EI_DEVICE_CAP_POINTER);
ei_device_configure_capability(device, EI_DEVICE_CAP_KEYBOARD);
ei_device_add(device);
}
peck_dispatch_eis(peck);
with_client(peck) {
ei_dispatch(ei);
_cleanup_ei_event_ struct ei_event *event = ei_get_event(ei);
munit_assert_ptr_not_null(event);
munit_assert_int(ei_event_get_type(event), ==, EI_EVENT_DEVICE_ADDED);
struct ei_device *d = ei_event_get_device(event);
munit_assert_ptr_equal(d, device);
munit_assert(ei_device_has_capability(d, EI_DEVICE_CAP_KEYBOARD));
munit_assert(!ei_device_has_capability(d, EI_DEVICE_CAP_POINTER));
}
return MUNIT_OK;
}
static MunitResult
test_ei_device_add_zero_caps(const MunitParameter params[], void *user_data)
{
@ -185,7 +227,7 @@ test_ei_device_add_zero_caps(const MunitParameter params[], void *user_data)
/* Device with pointer caps but those caps are rejected -> device
immediately removed by EIS */
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_REJECT_POINTER);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_DROP_POINTER);
peck_dispatch_eis(peck);
peck_dispatch_ei(peck);
@ -220,6 +262,7 @@ static MunitTest ei_tests[] = {
{ .name = "/ei/reject_after_connect", .test = test_ei_reject_after_connect },
{ .name = "/device/basics", .test = test_ei_device_basics },
{ .name = "/device/add", .test = test_ei_device_add },
{ .name = "/device/add_drop_caps", .test = test_ei_device_add_drop_caps },
{ .name = "/device/add_zero_caps", .test = test_ei_device_add_zero_caps },
};