3636
3737class SchedTest : public LIBC_NAMESPACE ::testing::Test {
3838public:
39- void testSched (int policy, bool can_set ) {
39+ void testSched (int policy, bool is_mandatory ) {
4040 LIBC_NAMESPACE::libc_errno = 0 ;
4141
4242 int init_policy = LIBC_NAMESPACE::sched_getscheduler (0 );
@@ -74,24 +74,26 @@ class SchedTest : public LIBC_NAMESPACE::testing::Test {
7474
7575 param.sched_priority = max_priority + 1 ;
7676 ASSERT_EQ (LIBC_NAMESPACE::sched_setscheduler (0 , policy, ¶m), -1 );
77- // A bit hard to test as depending if we are root or not we can run into
77+ // A bit hard to test as depending on user privileges we can run into
7878 // different issues.
7979 ASSERT_TRUE (LIBC_NAMESPACE::libc_errno == EINVAL ||
8080 LIBC_NAMESPACE::libc_errno == EPERM);
8181 LIBC_NAMESPACE::libc_errno = 0 ;
8282
83- // Some sched policies require permissions, so skip
8483 param.sched_priority = min_priority;
85- // Success / missing permissions.
86- ASSERT_EQ (LIBC_NAMESPACE::sched_setscheduler (0 , policy, ¶m),
87- can_set ? 0 : -1 );
88- ASSERT_TRUE (can_set ? (LIBC_NAMESPACE::libc_errno == 0 )
89- : (LIBC_NAMESPACE::libc_errno == EINVAL ||
90- LIBC_NAMESPACE::libc_errno == EPERM));
84+ // Success/unsupported policy/missing permissions.
85+ int setscheduler_result =
86+ LIBC_NAMESPACE::sched_setscheduler (0 , policy, ¶m);
87+ ASSERT_TRUE (setscheduler_result == 0 || setscheduler_result == -1 );
88+ ASSERT_TRUE (
89+ setscheduler_result != -1
90+ ? (LIBC_NAMESPACE::libc_errno == 0 )
91+ : ((!is_mandatory && LIBC_NAMESPACE::libc_errno == EINVAL) ||
92+ LIBC_NAMESPACE::libc_errno == EPERM));
9193 LIBC_NAMESPACE::libc_errno = 0 ;
9294
9395 ASSERT_EQ (LIBC_NAMESPACE::sched_getscheduler (0 ),
94- can_set ? policy : init_policy);
96+ setscheduler_result != - 1 ? policy : init_policy);
9597 ASSERT_ERRNO_SUCCESS ();
9698
9799 // Out of bounds priority
@@ -121,17 +123,21 @@ class SchedTest : public LIBC_NAMESPACE::testing::Test {
121123 ASSERT_ERRNO_EQ (EINVAL);
122124 LIBC_NAMESPACE::libc_errno = 0 ;
123125
124- // Success / missing permissions
125- ASSERT_EQ (LIBC_NAMESPACE::sched_setparam (0 , ¶m), can_set ? 0 : -1 );
126- ASSERT_TRUE (can_set ? (LIBC_NAMESPACE::libc_errno == 0 )
127- : (LIBC_NAMESPACE::libc_errno == EINVAL ||
128- LIBC_NAMESPACE::libc_errno == EPERM));
126+ // Success/unsupported policy/missing permissions
127+ int setparam_result = LIBC_NAMESPACE::sched_setparam (0 , ¶m);
128+ ASSERT_TRUE (setparam_result == 0 || setparam_result == -1 );
129+ ASSERT_TRUE (setparam_result != -1
130+ ? (LIBC_NAMESPACE::libc_errno == 0 )
131+ : ((setscheduler_result == -1 &&
132+ LIBC_NAMESPACE::libc_errno == EINVAL) ||
133+ LIBC_NAMESPACE::libc_errno == EPERM));
129134 LIBC_NAMESPACE::libc_errno = 0 ;
130135
131136 ASSERT_EQ (LIBC_NAMESPACE::sched_getparam (0 , ¶m), 0 );
132137 ASSERT_ERRNO_SUCCESS ();
133138
134- ASSERT_EQ (param.sched_priority , can_set ? priority : init_priority);
139+ ASSERT_EQ (param.sched_priority ,
140+ setparam_result != -1 ? priority : init_priority);
135141 }
136142
137143 // Null test
@@ -145,12 +151,12 @@ class SchedTest : public LIBC_NAMESPACE::testing::Test {
145151 using LlvmLibcSchedTest = SchedTest; \
146152 TEST_F (LlvmLibcSchedTest, Sched_##policy) { testSched (policy, can_set); }
147153
148- // Root is required to set these policies.
149- LIST_SCHED_TESTS (SCHED_FIFO, LIBC_NAMESPACE::getuid() == 0)
150- LIST_SCHED_TESTS(SCHED_RR, LIBC_NAMESPACE::getuid() == 0)
151-
152- // No root is required to set these policies.
154+ // Mandated by POSIX.
153155LIST_SCHED_TESTS (SCHED_OTHER, true )
156+ LIST_SCHED_TESTS(SCHED_FIFO, true )
157+ LIST_SCHED_TESTS(SCHED_RR, true )
158+
159+ // Linux extensions.
154160LIST_SCHED_TESTS(SCHED_BATCH, true )
155161LIST_SCHED_TESTS(SCHED_IDLE, true )
156162
0 commit comments