Skip to content

Commit

Permalink
selftests: winesync: Add tests for WINESYNC_IOC_PULSE_SEM.
Browse files Browse the repository at this point in the history
Signed-off-by: Kai Krakow <kai@kaishome.de>
  • Loading branch information
zfigura authored and kakra committed Jul 3, 2021
1 parent e871a00 commit d344c33
Showing 1 changed file with 159 additions and 2 deletions.
161 changes: 159 additions & 2 deletions tools/testing/selftests/drivers/winesync/winesync.c
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,61 @@ TEST(semaphore_state)
EXPECT_EQ(1, sem_args.count);
EXPECT_EQ(2, sem_args.max);

/* Test PULSE. */

sem_args.count = 2;
ret = ioctl(fd, WINESYNC_IOC_PULSE_SEM, &sem_args);
EXPECT_EQ(-1, ret);
EXPECT_EQ(EOVERFLOW, errno);

sem_args.count = 0xdeadbeef;
sem_args.max = 0xdeadbeef;
ret = ioctl(fd, WINESYNC_IOC_READ_SEM, &sem_args);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, sem_args.count);
EXPECT_EQ(2, sem_args.max);

sem_args.count = 1;
ret = ioctl(fd, WINESYNC_IOC_PUT_SEM, &sem_args);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, sem_args.count);

sem_args.count = 1;
ret = ioctl(fd, WINESYNC_IOC_PULSE_SEM, &sem_args);
EXPECT_EQ(0, ret);
EXPECT_EQ(1, sem_args.count);

sem_args.count = 0xdeadbeef;
sem_args.max = 0xdeadbeef;
ret = ioctl(fd, WINESYNC_IOC_READ_SEM, &sem_args);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, sem_args.count);
EXPECT_EQ(2, sem_args.max);

sem_args.count = 1;
ret = ioctl(fd, WINESYNC_IOC_PULSE_SEM, &sem_args);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, sem_args.count);

sem_args.count = 0xdeadbeef;
sem_args.max = 0xdeadbeef;
ret = ioctl(fd, WINESYNC_IOC_READ_SEM, &sem_args);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, sem_args.count);
EXPECT_EQ(2, sem_args.max);

sem_args.count = 2;
ret = ioctl(fd, WINESYNC_IOC_PULSE_SEM, &sem_args);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, sem_args.count);

sem_args.count = 0xdeadbeef;
sem_args.max = 0xdeadbeef;
ret = ioctl(fd, WINESYNC_IOC_READ_SEM, &sem_args);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, sem_args.count);
EXPECT_EQ(2, sem_args.max);

ret = ioctl(fd, WINESYNC_IOC_DELETE, &sem_args.sem);
EXPECT_EQ(0, ret);

Expand Down Expand Up @@ -330,6 +385,61 @@ TEST(semaphore_state_getonwait)
EXPECT_EQ(1, sem_args.count);
EXPECT_EQ(2, sem_args.max);

/* Test PULSE. */

sem_args.count = 2;
ret = ioctl(fd, WINESYNC_IOC_PULSE_SEM, &sem_args);
EXPECT_EQ(-1, ret);
EXPECT_EQ(EOVERFLOW, errno);

sem_args.count = 0xdeadbeef;
sem_args.max = 0xdeadbeef;
ret = ioctl(fd, WINESYNC_IOC_READ_SEM, &sem_args);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, sem_args.count);
EXPECT_EQ(2, sem_args.max);

sem_args.count = 1;
ret = ioctl(fd, WINESYNC_IOC_PUT_SEM, &sem_args);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, sem_args.count);

sem_args.count = 1;
ret = ioctl(fd, WINESYNC_IOC_PULSE_SEM, &sem_args);
EXPECT_EQ(0, ret);
EXPECT_EQ(1, sem_args.count);

sem_args.count = 0xdeadbeef;
sem_args.max = 0xdeadbeef;
ret = ioctl(fd, WINESYNC_IOC_READ_SEM, &sem_args);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, sem_args.count);
EXPECT_EQ(2, sem_args.max);

sem_args.count = 1;
ret = ioctl(fd, WINESYNC_IOC_PULSE_SEM, &sem_args);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, sem_args.count);

sem_args.count = 0xdeadbeef;
sem_args.max = 0xdeadbeef;
ret = ioctl(fd, WINESYNC_IOC_READ_SEM, &sem_args);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, sem_args.count);
EXPECT_EQ(2, sem_args.max);

sem_args.count = 2;
ret = ioctl(fd, WINESYNC_IOC_PULSE_SEM, &sem_args);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, sem_args.count);

sem_args.count = 0xdeadbeef;
sem_args.max = 0xdeadbeef;
ret = ioctl(fd, WINESYNC_IOC_READ_SEM, &sem_args);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, sem_args.count);
EXPECT_EQ(2, sem_args.max);

ret = ioctl(fd, WINESYNC_IOC_DELETE, &sem_args.sem);
EXPECT_EQ(0, ret);

Expand Down Expand Up @@ -951,6 +1061,10 @@ TEST(invalid_objects)
EXPECT_EQ(-1, ret);
EXPECT_EQ(EINVAL, errno);

ret = ioctl(fd, WINESYNC_IOC_PULSE_SEM, &sem_args);
EXPECT_EQ(-1, ret);
EXPECT_EQ(EINVAL, errno);

ret = ioctl(fd, WINESYNC_IOC_READ_SEM, &sem_args);
EXPECT_EQ(-1, ret);
EXPECT_EQ(EINVAL, errno);
Expand Down Expand Up @@ -1136,6 +1250,30 @@ TEST(wake_any)
EXPECT_EQ(0, thread_args.ret);
EXPECT_EQ(0, wait_args.index);

/* test waking the semaphore via pulse */

get_abs_timeout(&timeout, CLOCK_MONOTONIC, 1000);
wait_args.owner = 456;
ret = pthread_create(&thread, NULL, wait_thread, &thread_args);
EXPECT_EQ(0, ret);

ret = wait_for_thread(thread, 100);
EXPECT_EQ(ETIMEDOUT, ret);

sem_args.count = 2;
ret = ioctl(fd, WINESYNC_IOC_PULSE_SEM, &sem_args);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, sem_args.count);

ret = ioctl(fd, WINESYNC_IOC_READ_SEM, &sem_args);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, sem_args.count);

ret = wait_for_thread(thread, 100);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, thread_args.ret);
EXPECT_EQ(0, wait_args.index);

/* test waking the mutex */

/* first grab it again for owner 123 */
Expand Down Expand Up @@ -1281,14 +1419,14 @@ TEST(wake_all)
EXPECT_EQ(0, mutex_args.count);
EXPECT_EQ(0, mutex_args.owner);

sem_args.count = 2;
sem_args.count = 1;
ret = ioctl(fd, WINESYNC_IOC_PUT_SEM, &sem_args);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, sem_args.count);

ret = ioctl(fd, WINESYNC_IOC_READ_SEM, &sem_args);
EXPECT_EQ(0, ret);
EXPECT_EQ(1, sem_args.count);
EXPECT_EQ(0, sem_args.count);

ret = ioctl(fd, WINESYNC_IOC_READ_MUTEX, &mutex_args);
EXPECT_EQ(0, ret);
Expand All @@ -1299,6 +1437,25 @@ TEST(wake_all)
EXPECT_EQ(0, ret);
EXPECT_EQ(0, thread_args.ret);

/* test waking the semaphore via pulse */

get_abs_timeout(&timeout, CLOCK_MONOTONIC, 1000);
wait_args.owner = 456;
ret = pthread_create(&thread, NULL, wait_thread, &thread_args);
EXPECT_EQ(0, ret);

ret = wait_for_thread(thread, 100);
EXPECT_EQ(ETIMEDOUT, ret);

sem_args.count = 1;
ret = ioctl(fd, WINESYNC_IOC_PULSE_SEM, &sem_args);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, sem_args.count);

ret = wait_for_thread(thread, 100);
EXPECT_EQ(0, ret);
EXPECT_EQ(0, thread_args.ret);

/* delete an object while it's being waited on */

get_abs_timeout(&timeout, CLOCK_MONOTONIC, 200);
Expand Down

0 comments on commit d344c33

Please sign in to comment.