36
36
37
37
class SchedTest : public LIBC_NAMESPACE ::testing::Test {
38
38
public:
39
- void testSched (int policy, bool can_set ) {
39
+ void testSched (int policy, bool is_mandatory ) {
40
40
LIBC_NAMESPACE::libc_errno = 0 ;
41
41
42
42
int init_policy = LIBC_NAMESPACE::sched_getscheduler (0 );
@@ -74,24 +74,26 @@ class SchedTest : public LIBC_NAMESPACE::testing::Test {
74
74
75
75
param.sched_priority = max_priority + 1 ;
76
76
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
78
78
// different issues.
79
79
ASSERT_TRUE (LIBC_NAMESPACE::libc_errno == EINVAL ||
80
80
LIBC_NAMESPACE::libc_errno == EPERM);
81
81
LIBC_NAMESPACE::libc_errno = 0 ;
82
82
83
- // Some sched policies require permissions, so skip
84
83
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));
91
93
LIBC_NAMESPACE::libc_errno = 0 ;
92
94
93
95
ASSERT_EQ (LIBC_NAMESPACE::sched_getscheduler (0 ),
94
- can_set ? policy : init_policy);
96
+ setscheduler_result != - 1 ? policy : init_policy);
95
97
ASSERT_ERRNO_SUCCESS ();
96
98
97
99
// Out of bounds priority
@@ -121,17 +123,21 @@ class SchedTest : public LIBC_NAMESPACE::testing::Test {
121
123
ASSERT_ERRNO_EQ (EINVAL);
122
124
LIBC_NAMESPACE::libc_errno = 0 ;
123
125
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));
129
134
LIBC_NAMESPACE::libc_errno = 0 ;
130
135
131
136
ASSERT_EQ (LIBC_NAMESPACE::sched_getparam (0 , ¶m), 0 );
132
137
ASSERT_ERRNO_SUCCESS ();
133
138
134
- ASSERT_EQ (param.sched_priority , can_set ? priority : init_priority);
139
+ ASSERT_EQ (param.sched_priority ,
140
+ setparam_result != -1 ? priority : init_priority);
135
141
}
136
142
137
143
// Null test
@@ -145,12 +151,12 @@ class SchedTest : public LIBC_NAMESPACE::testing::Test {
145
151
using LlvmLibcSchedTest = SchedTest; \
146
152
TEST_F (LlvmLibcSchedTest, Sched_##policy) { testSched (policy, can_set); }
147
153
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.
153
155
LIST_SCHED_TESTS (SCHED_OTHER, true )
156
+ LIST_SCHED_TESTS(SCHED_FIFO, true )
157
+ LIST_SCHED_TESTS(SCHED_RR, true )
158
+
159
+ // Linux extensions.
154
160
LIST_SCHED_TESTS(SCHED_BATCH, true )
155
161
LIST_SCHED_TESTS(SCHED_IDLE, true )
156
162
0 commit comments