diff options
Diffstat (limited to 'libc/test/src/sched/param_and_scheduler_test.cpp')
-rw-r--r-- | libc/test/src/sched/param_and_scheduler_test.cpp | 48 |
1 files changed, 27 insertions, 21 deletions
diff --git a/libc/test/src/sched/param_and_scheduler_test.cpp b/libc/test/src/sched/param_and_scheduler_test.cpp index 8e81f2e..747c7e34 100644 --- a/libc/test/src/sched/param_and_scheduler_test.cpp +++ b/libc/test/src/sched/param_and_scheduler_test.cpp @@ -36,7 +36,7 @@ class SchedTest : public LIBC_NAMESPACE::testing::Test { public: - void testSched(int policy, bool can_set) { + void testSched(int policy, bool is_mandatory) { LIBC_NAMESPACE::libc_errno = 0; int init_policy = LIBC_NAMESPACE::sched_getscheduler(0); @@ -74,24 +74,26 @@ public: param.sched_priority = max_priority + 1; ASSERT_EQ(LIBC_NAMESPACE::sched_setscheduler(0, policy, ¶m), -1); - // A bit hard to test as depending if we are root or not we can run into + // A bit hard to test as depending on user privileges we can run into // different issues. ASSERT_TRUE(LIBC_NAMESPACE::libc_errno == EINVAL || LIBC_NAMESPACE::libc_errno == EPERM); LIBC_NAMESPACE::libc_errno = 0; - // Some sched policies require permissions, so skip param.sched_priority = min_priority; - // Success / missing permissions. - ASSERT_EQ(LIBC_NAMESPACE::sched_setscheduler(0, policy, ¶m), - can_set ? 0 : -1); - ASSERT_TRUE(can_set ? (LIBC_NAMESPACE::libc_errno == 0) - : (LIBC_NAMESPACE::libc_errno == EINVAL || - LIBC_NAMESPACE::libc_errno == EPERM)); + // Success/unsupported policy/missing permissions. + int setscheduler_result = + LIBC_NAMESPACE::sched_setscheduler(0, policy, ¶m); + ASSERT_TRUE(setscheduler_result == 0 || setscheduler_result == -1); + ASSERT_TRUE( + setscheduler_result != -1 + ? (LIBC_NAMESPACE::libc_errno == 0) + : ((!is_mandatory && LIBC_NAMESPACE::libc_errno == EINVAL) || + LIBC_NAMESPACE::libc_errno == EPERM)); LIBC_NAMESPACE::libc_errno = 0; ASSERT_EQ(LIBC_NAMESPACE::sched_getscheduler(0), - can_set ? policy : init_policy); + setscheduler_result != -1 ? policy : init_policy); ASSERT_ERRNO_SUCCESS(); // Out of bounds priority @@ -121,17 +123,21 @@ public: ASSERT_ERRNO_EQ(EINVAL); LIBC_NAMESPACE::libc_errno = 0; - // Success / missing permissions - ASSERT_EQ(LIBC_NAMESPACE::sched_setparam(0, ¶m), can_set ? 0 : -1); - ASSERT_TRUE(can_set ? (LIBC_NAMESPACE::libc_errno == 0) - : (LIBC_NAMESPACE::libc_errno == EINVAL || - LIBC_NAMESPACE::libc_errno == EPERM)); + // Success/unsupported policy/missing permissions + int setparam_result = LIBC_NAMESPACE::sched_setparam(0, ¶m); + ASSERT_TRUE(setparam_result == 0 || setparam_result == -1); + ASSERT_TRUE(setparam_result != -1 + ? (LIBC_NAMESPACE::libc_errno == 0) + : ((setscheduler_result == -1 && + LIBC_NAMESPACE::libc_errno == EINVAL) || + LIBC_NAMESPACE::libc_errno == EPERM)); LIBC_NAMESPACE::libc_errno = 0; ASSERT_EQ(LIBC_NAMESPACE::sched_getparam(0, ¶m), 0); ASSERT_ERRNO_SUCCESS(); - ASSERT_EQ(param.sched_priority, can_set ? priority : init_priority); + ASSERT_EQ(param.sched_priority, + setparam_result != -1 ? priority : init_priority); } // Null test @@ -145,12 +151,12 @@ public: using LlvmLibcSchedTest = SchedTest; \ TEST_F(LlvmLibcSchedTest, Sched_##policy) { testSched(policy, can_set); } -// Root is required to set these policies. -LIST_SCHED_TESTS(SCHED_FIFO, LIBC_NAMESPACE::getuid() == 0) -LIST_SCHED_TESTS(SCHED_RR, LIBC_NAMESPACE::getuid() == 0) - -// No root is required to set these policies. +// Mandated by POSIX. LIST_SCHED_TESTS(SCHED_OTHER, true) +LIST_SCHED_TESTS(SCHED_FIFO, true) +LIST_SCHED_TESTS(SCHED_RR, true) + +// Linux extensions. LIST_SCHED_TESTS(SCHED_BATCH, true) LIST_SCHED_TESTS(SCHED_IDLE, true) |