Test event-specific ioctls NTSYNC_IOC_EVENT_SET, NTSYNC_IOC_EVENT_RESET,
NTSYNC_IOC_EVENT_PULSE, NTSYNC_IOC_EVENT_READ for manual-reset events, and
waiting on manual-reset events.

Signed-off-by: Elizabeth Figura <zfig...@codeweavers.com>
---
 .../testing/selftests/drivers/ntsync/ntsync.c | 89 +++++++++++++++++++
 1 file changed, 89 insertions(+)

diff --git a/tools/testing/selftests/drivers/ntsync/ntsync.c 
b/tools/testing/selftests/drivers/ntsync/ntsync.c
index b77fb0b2c4b1..b6481c2b85cc 100644
--- a/tools/testing/selftests/drivers/ntsync/ntsync.c
+++ b/tools/testing/selftests/drivers/ntsync/ntsync.c
@@ -73,6 +73,27 @@ static int unlock_mutex(int mutex, __u32 owner, __u32 *count)
        return ret;
 }
 
+static int read_event_state(int event, __u32 *signaled, __u32 *manual)
+{
+       struct ntsync_event_args args;
+       int ret;
+
+       memset(&args, 0xcc, sizeof(args));
+       ret = ioctl(event, NTSYNC_IOC_EVENT_READ, &args);
+       *signaled = args.signaled;
+       *manual = args.manual;
+       return ret;
+}
+
+#define check_event_state(event, signaled, manual) \
+       ({ \
+               __u32 __signaled, __manual; \
+               int ret = read_event_state((event), &__signaled, &__manual); \
+               EXPECT_EQ(0, ret); \
+               EXPECT_EQ((signaled), __signaled); \
+               EXPECT_EQ((manual), __manual); \
+       })
+
 static int wait_objs(int fd, unsigned long request, __u32 count,
                     const int *objs, __u32 owner, __u32 *index)
 {
@@ -353,6 +374,74 @@ TEST(mutex_state)
        close(fd);
 }
 
+TEST(manual_event_state)
+{
+       struct ntsync_event_args event_args;
+       __u32 index, signaled;
+       int fd, event, ret;
+
+       fd = open("/dev/ntsync", O_CLOEXEC | O_RDONLY);
+       ASSERT_LE(0, fd);
+
+       event_args.manual = 1;
+       event_args.signaled = 0;
+       event_args.event = 0xdeadbeef;
+       ret = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &event_args);
+       EXPECT_EQ(0, ret);
+       EXPECT_NE(0xdeadbeef, event_args.event);
+       event = event_args.event;
+       check_event_state(event, 0, 1);
+
+       signaled = 0xdeadbeef;
+       ret = ioctl(event, NTSYNC_IOC_EVENT_SET, &signaled);
+       EXPECT_EQ(0, ret);
+       EXPECT_EQ(0, signaled);
+       check_event_state(event, 1, 1);
+
+       ret = ioctl(event, NTSYNC_IOC_EVENT_SET, &signaled);
+       EXPECT_EQ(0, ret);
+       EXPECT_EQ(1, signaled);
+       check_event_state(event, 1, 1);
+
+       ret = wait_any(fd, 1, &event, 123, &index);
+       EXPECT_EQ(0, ret);
+       EXPECT_EQ(0, index);
+       check_event_state(event, 1, 1);
+
+       signaled = 0xdeadbeef;
+       ret = ioctl(event, NTSYNC_IOC_EVENT_RESET, &signaled);
+       EXPECT_EQ(0, ret);
+       EXPECT_EQ(1, signaled);
+       check_event_state(event, 0, 1);
+
+       ret = ioctl(event, NTSYNC_IOC_EVENT_RESET, &signaled);
+       EXPECT_EQ(0, ret);
+       EXPECT_EQ(0, signaled);
+       check_event_state(event, 0, 1);
+
+       ret = wait_any(fd, 1, &event, 123, &index);
+       EXPECT_EQ(-1, ret);
+       EXPECT_EQ(ETIMEDOUT, errno);
+
+       ret = ioctl(event, NTSYNC_IOC_EVENT_SET, &signaled);
+       EXPECT_EQ(0, ret);
+       EXPECT_EQ(0, signaled);
+
+       ret = ioctl(event, NTSYNC_IOC_EVENT_PULSE, &signaled);
+       EXPECT_EQ(0, ret);
+       EXPECT_EQ(1, signaled);
+       check_event_state(event, 0, 1);
+
+       ret = ioctl(event, NTSYNC_IOC_EVENT_PULSE, &signaled);
+       EXPECT_EQ(0, ret);
+       EXPECT_EQ(0, signaled);
+       check_event_state(event, 0, 1);
+
+       close(event);
+
+       close(fd);
+}
+
 TEST(test_wait_any)
 {
        int objs[NTSYNC_MAX_WAIT_COUNT + 1], fd, ret;
-- 
2.43.0


Reply via email to