From 5ec8a4d481017390da5ae4de027e937bc04c21ec Mon Sep 17 00:00:00 2001 From: "Bjoern B. Brandenburg" Date: Sat, 29 Jan 2011 19:16:24 -0500 Subject: add test cases for the FMLP and SRP under GSN- and PSN-EDF --- tests/fdso.c | 21 ++++++++--- tests/locks.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+), 5 deletions(-) create mode 100644 tests/locks.c diff --git a/tests/fdso.c b/tests/fdso.c index 1e2ab29..8a2a0d0 100644 --- a/tests/fdso.c +++ b/tests/fdso.c @@ -20,7 +20,7 @@ TESTCASE(fmlp_not_active, C_EDF | PFAIR | LINUX, ASSERT(fd != -1); - SYSCALL_FAILS(EBUSY, open_fmlp_sem(fd, 0) ); + SYSCALL_FAILS(ENXIO, open_fmlp_sem(fd, 0) ); SYSCALL( close(fd) ); @@ -61,23 +61,34 @@ TESTCASE(not_inherit_od, GSN_EDF | PSN_EDF, SYSCALL( od = open_fmlp_sem(fd, 0) ); - SYSCALL( litmus_lock(od) ); - - SYSCALL( litmus_unlock(od) ); - pid = fork(); ASSERT( pid != -1 ); + /* must be an RT task to lock at all */ + SYSCALL( sporadic_partitioned(10, 100, 0) ); + SYSCALL( task_mode(LITMUS_RT_TASK) ); + if (pid == 0) { /* child */ SYSCALL_FAILS(EINVAL, litmus_lock(od) ); SYSCALL_FAILS(EINVAL, litmus_unlock(od) ); + + SYSCALL( task_mode(BACKGROUND_TASK) ); + exit(0); } else { + SYSCALL( litmus_lock(od) ); SYSCALL( litmus_unlock(od) ); + + SYSCALL( litmus_lock(od) ); + SYSCALL( litmus_unlock(od) ); + + SYSCALL( task_mode(BACKGROUND_TASK) ); + SYSCALL( waitpid(pid, &status, 0) ); + ASSERT(WEXITSTATUS(status) == 0); } diff --git a/tests/locks.c b/tests/locks.c new file mode 100644 index 0000000..65b932a --- /dev/null +++ b/tests/locks.c @@ -0,0 +1,110 @@ +#include +#include +#include + +#include "tests.h" +#include "litmus.h" + + +TESTCASE(not_lock_fmlp_be, GSN_EDF | PSN_EDF, + "don't let best-effort tasks lock FMLP semaphores") +{ + int fd, od; + + SYSCALL( fd = open(".fmlp_locks", O_RDONLY | O_CREAT) ); + + SYSCALL( od = open_fmlp_sem(fd, 0) ); + + /* BE tasks may not lock FMLP semaphores */ + SYSCALL_FAILS(EPERM, litmus_lock(od) ); + + /* tasks may not unlock resources they don't own */ + SYSCALL_FAILS(EINVAL, litmus_unlock(od) ); + + SYSCALL( od_close(od) ); + + SYSCALL( close(fd) ); + + SYSCALL( remove(".fmlp_locks") ); + +} + +TESTCASE(not_lock_srp_be, PSN_EDF, + "don't let best-effort tasks open SRP semaphores") +{ + int fd, od; + + SYSCALL( fd = open(".srp_locks", O_RDONLY | O_CREAT) ); + + /* BE tasks may not open SRP semaphores */ + + SYSCALL_FAILS(EPERM, od = open_srp_sem(fd, 0) ); + + SYSCALL( close(fd) ); + + SYSCALL( remove(".srp_locks") ); + +} + +TESTCASE(lock_srp, PSN_EDF, + "SRP acquisition and release") +{ + int fd, od; + + SYSCALL( fd = open(".srp_locks", O_RDONLY | O_CREAT) ); + + SYSCALL( sporadic_partitioned(10, 100, 0) ); + SYSCALL( task_mode(LITMUS_RT_TASK) ); + + SYSCALL( od = open_srp_sem(fd, 0) ); + + SYSCALL( litmus_lock(od) ); + SYSCALL( litmus_unlock(od) ); + + SYSCALL( litmus_lock(od) ); + SYSCALL( litmus_unlock(od) ); + + SYSCALL( litmus_lock(od) ); + SYSCALL( litmus_unlock(od) ); + + /* tasks may not unlock resources they don't own */ + SYSCALL_FAILS(EINVAL, litmus_unlock(od) ); + + SYSCALL( od_close(od) ); + + SYSCALL( close(fd) ); + + SYSCALL( remove(".srp_locks") ); +} + + +TESTCASE(lock_fmlp, PSN_EDF | GSN_EDF, + "FMLP acquisition and release") +{ + int fd, od; + + SYSCALL( fd = open(".fmlp_locks", O_RDONLY | O_CREAT) ); + + SYSCALL( sporadic_partitioned(10, 100, 0) ); + SYSCALL( task_mode(LITMUS_RT_TASK) ); + + SYSCALL( od = open_fmlp_sem(fd, 0) ); + + SYSCALL( litmus_lock(od) ); + SYSCALL( litmus_unlock(od) ); + + SYSCALL( litmus_lock(od) ); + SYSCALL( litmus_unlock(od) ); + + SYSCALL( litmus_lock(od) ); + SYSCALL( litmus_unlock(od) ); + + /* tasks may not unlock resources they don't own */ + SYSCALL_FAILS(EINVAL, litmus_unlock(od) ); + + SYSCALL( od_close(od) ); + + SYSCALL( close(fd) ); + + SYSCALL( remove(".fmlp_locks") ); +} -- cgit v1.2.2