1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16
17 #include <unistd.h>
18 #include <sys/resource.h>
19 #include <sys/shm.h>
20 #include <gtest/gtest.h>
21 #include "log.h"
22 #include "utils.h"
23 #include "KernelConstants.h"
24 #include "mt_utils.h"
25
26 using namespace testing::ext;
27
28 class ProcessSchedApiTest : public testing::Test {
29 };
30
31 /**
32 * @tc.number SUB_KERNEL_SCHED_API_GETPRIORITY_0100
33 * @tc.name getpriority api test.
34 * @tc.desc [C- SOFTWARE -0200]
35 */
HWTEST_F(ProcessSchedApiTest, testGetPriority, Function | MediumTest | Level1)36 HWTEST_F(ProcessSchedApiTest, testGetPriority, Function | MediumTest | Level1)
37 {
38 int priority = getpriority(PRIO_PROCESS, INIT_PROCESS_ID);
39 EXPECT_EQ(priority, DEFAULT_INIT_PROCESS_PRIORITY) << "check 'init' priority failed.";
40 priority = getpriority(PRIO_PROCESS, KERNEL_PROCESS_ID);
41 EXPECT_EQ(priority, DEFAULT_KERNEL_PROCESS_PRIORITY) << "check 'KProcess' priority failed.";
42 }
43
44 /**
45 * @tc.number SUB_KERNEL_SCHED_API_GETPRIORITY_0200
46 * @tc.name getpriority error test with unsupport parameter 1.
47 * @tc.desc [C- SOFTWARE -0200]
48 */
HWTEST_F(ProcessSchedApiTest, testGetPriorityError0200, Function | MediumTest | Level3)49 HWTEST_F(ProcessSchedApiTest, testGetPriorityError0200, Function | MediumTest | Level3)
50 {
51 LOG("invalid 'which' test:");
52 errno = 0;
53 int priority = getpriority(PRIO_PGRP, 0);
54 EXPECT_EQ(priority, -1);
55 EXPECT_EQ(errno, EINVAL);
56 errno = 0;
57 priority = getpriority(PRIO_USER, 0);
58 EXPECT_EQ(priority, -1);
59 EXPECT_EQ(errno, EINVAL);
60 }
61
62 /**
63 * @tc.number SUB_KERNEL_SCHED_API_GETPRIORITY_0300
64 * @tc.name getpriority error test with invalid parameter 1.
65 * @tc.desc [C- SOFTWARE -0200]
66 */
HWTEST_F(ProcessSchedApiTest, testGetPriorityError0300, Function | MediumTest | Level3)67 HWTEST_F(ProcessSchedApiTest, testGetPriorityError0300, Function | MediumTest | Level3)
68 {
69 int priority;
70
71 LOG("invalid 'which' test:");
72 errno = 0;
73 priority = getpriority(PRIO_USER + GetRandom(1000), 0);
74 EXPECT_EQ(priority, -1);
75 EXPECT_EQ(errno, EINVAL);
76 errno = 0;
77 priority = getpriority(-GetRandom(1000), 0);
78 EXPECT_EQ(priority, -1);
79 EXPECT_EQ(errno, EINVAL);
80 }
81
82 /**
83 * @tc.number SUB_KERNEL_SCHED_API_GETPRIORITY_0400
84 * @tc.name getpriority error test with invalid parameter 2.
85 * @tc.desc [C- SOFTWARE -0200]
86 */
HWTEST_F(ProcessSchedApiTest, testGetPriorityError0400, Function | MediumTest | Level3)87 HWTEST_F(ProcessSchedApiTest, testGetPriorityError0400, Function | MediumTest | Level3)
88 {
89 int priority;
90 LOG("invalid 'who' test:");
91 errno = 0;
92 priority = getpriority(PRIO_PROCESS, -1);
93 EXPECT_EQ(priority, -1);
94 EXPECT_EQ(errno, EINVAL);
95 errno = 0;
96 priority = getpriority(PRIO_PROCESS, MAX_PROCESS_NUMBER + 1);
97 EXPECT_EQ(priority, -1);
98 EXPECT_EQ(errno, EINVAL);
99 errno = 0;
100 priority = getpriority(PRIO_PROCESS, MAX_PROCESS_NUMBER + GetRandom(100000));
101 EXPECT_EQ(priority, -1);
102 EXPECT_EQ(errno, EINVAL);
103 }
104
105 /**
106 * @tc.number SUB_KERNEL_SCHED_API_GETPRIORITY_0500
107 * @tc.name getpriority error test with not exist parameter 2.
108 * @tc.desc [C- SOFTWARE -0200]
109 */
HWTEST_F(ProcessSchedApiTest, testGetPriorityError0500, Function | MediumTest | Level3)110 HWTEST_F(ProcessSchedApiTest, testGetPriorityError0500, Function | MediumTest | Level3)
111 {
112 int priority;
113 LOG("invalid 'who' test:");
114 LOG("not exist pid test:");
115 pid_t nonExitPid = GetNonExistPid(); // valid but not exist pid
116 if (nonExitPid != -1) {
117 priority = getpriority(PRIO_PROCESS, nonExitPid);
118 EXPECT_EQ(priority, -1);
119 EXPECT_EQ(errno, ESRCH);
120 }
121 }
122
SetPriorityAllTest()123 void SetPriorityAllTest()
124 {
125 int rt, newPrio;
126 struct sched_param param;
127 LOG("test pid '0' and cover all supported priority:");
128 for (int prio = HIGHEST_USER_PROCESS_PRIORITY; prio <= LOWEST_USER_PROCESS_PRIORITY; prio++) {
129 rt = setpriority(PRIO_PROCESS, 0, prio);
130 EXPECT_EQ(rt, 0) << "setpriority failed for prio=" << prio << ", errno=" << errno;
131 newPrio = getpriority(PRIO_PROCESS, 0);
132 EXPECT_EQ(newPrio, prio);
133 rt = sched_getparam(getpid(), ¶m);
134 EXPECT_EQ(rt, 0);
135 newPrio = param.sched_priority;
136 EXPECT_EQ(newPrio, prio);
137 }
138 LOG("set back to default value:");
139 rt = setpriority(PRIO_PROCESS, getpid(), DEFAULT_SHELL_PROCESS_PRIORITY);
140 EXPECT_EQ(rt, 0);
141 newPrio = getpriority(PRIO_PROCESS, 0);
142 EXPECT_EQ(newPrio, DEFAULT_SHELL_PROCESS_PRIORITY);
143 }
144 /**
145 * @tc.number SUB_KERNEL_SCHED_API_SETPRIORITY_0100
146 * @tc.name test setpriority for all supported priority.
147 * @tc.desc [C- SOFTWARE -0200]
148 */
HWTEST_F(ProcessSchedApiTest, testSetPriority, Function | MediumTest | Level1)149 HWTEST_F(ProcessSchedApiTest, testSetPriority, Function | MediumTest | Level1)
150 {
151 SetPriorityAllTest();
152 }
153 /**
154 * @tc.number SUB_KERNEL_SCHED_API_SETPRIORITY_0200
155 * @tc.name test setpriority for all supported priority, in RR mode
156 * @tc.desc [C- SOFTWARE -0200]
157 */
HWTEST_F(ProcessSchedApiTest, testSetPriorityFiFo, Function | MediumTest | Level3)158 HWTEST_F(ProcessSchedApiTest, testSetPriorityFiFo, Function | MediumTest | Level3)
159 {
160 LOG("change sched policy");
161 struct sched_param param;
162 int rt = sched_getparam(0, ¶m);
163 ASSERT_EQ(rt, 0) << "get sched param failed, errno=" << errno;
164
165 SetPriorityAllTest();
166
167 LOG("set back to RR");
168 rt = sched_setscheduler(0, SCHED_RR, ¶m);
169 ASSERT_EQ(rt, 0) << "set SCHED_RR failed, errno=" << errno;
170 }
171
172 /**
173 * @tc.number SUB_KERNEL_SCHED_API_SETPRIORITY_0300
174 * @tc.name setpriority error test with unsupport parameter 1.
175 * @tc.desc [C- SOFTWARE -0200]
176 */
HWTEST_F(ProcessSchedApiTest, testSetPriorityError0300, Function | MediumTest | Level3)177 HWTEST_F(ProcessSchedApiTest, testSetPriorityError0300, Function | MediumTest | Level3)
178 {
179 const int testPrio = 18;
180 LOG("invalid 'which' test:");
181 errno = 0;
182 int rt = setpriority(PRIO_PGRP, 0, testPrio);
183 EXPECT_EQ(rt, -1);
184 EXPECT_EQ(errno, EINVAL);
185 errno = 0;
186 rt = setpriority(PRIO_USER, 0, testPrio);
187 EXPECT_EQ(rt, -1);
188 EXPECT_EQ(errno, EINVAL);
189 }
190
191 /**
192 * @tc.number SUB_KERNEL_SCHED_API_SETPRIORITY_0400
193 * @tc.name setpriority error test with invlid parameter 1.
194 * @tc.desc [C- SOFTWARE -0200]
195 */
HWTEST_F(ProcessSchedApiTest, testSetPriorityError0400, Function | MediumTest | Level3)196 HWTEST_F(ProcessSchedApiTest, testSetPriorityError0400, Function | MediumTest | Level3)
197 {
198 const int testPrio = 18;
199 int rt;
200 LOG("invalid 'which' test:");
201 errno = 0;
202 rt = setpriority(PRIO_USER + GetRandom(1000), 0, testPrio);
203 EXPECT_EQ(rt, -1);
204 EXPECT_EQ(errno, EINVAL);
205 errno = 0;
206 rt = setpriority(-GetRandom(1000), 0, testPrio);
207 EXPECT_EQ(rt, -1);
208 EXPECT_EQ(errno, EINVAL);
209 }
210
211 /**
212 * @tc.number SUB_KERNEL_SCHED_API_SETPRIORITY_0500
213 * @tc.name setpriority error test with invalid parameter 2.
214 * @tc.desc [C- SOFTWARE -0200]
215 */
HWTEST_F(ProcessSchedApiTest, testSetPriorityError0500, Function | MediumTest | Level3)216 HWTEST_F(ProcessSchedApiTest, testSetPriorityError0500, Function | MediumTest | Level3)
217 {
218 int rt;
219 const int testPrio = 18;
220 LOG("invalid 'pid' test:");
221 errno = 0;
222 rt = setpriority(PRIO_PROCESS, -1, testPrio);
223 EXPECT_EQ(rt, -1);
224 EXPECT_EQ(errno, EINVAL);
225 errno = 0;
226 rt = setpriority(PRIO_PROCESS, MAX_PROCESS_NUMBER + 1, testPrio);
227 EXPECT_EQ(rt, -1);
228 EXPECT_EQ(errno, EINVAL);
229 errno = 0;
230 rt = setpriority(PRIO_PROCESS, MAX_PROCESS_NUMBER + GetRandom(1000), testPrio);
231 EXPECT_EQ(rt, -1);
232 EXPECT_EQ(errno, EINVAL);
233 }
234
235 /**
236 * @tc.number SUB_KERNEL_SCHED_API_SETPRIORITY_0600
237 * @tc.name setpriority error test with not exist parameter 2.
238 * @tc.desc [C- SOFTWARE -0200]
239 */
HWTEST_F(ProcessSchedApiTest, testSetPriorityError0600, Function | MediumTest | Level3)240 HWTEST_F(ProcessSchedApiTest, testSetPriorityError0600, Function | MediumTest | Level3)
241 {
242 const int testPrio = 18;
243 int rt;
244 LOG("not exist pid test:");
245 pid_t nonExitPid = GetNonExistPid(); // valid but not exist pid
246 if (nonExitPid != -1) {
247 rt = setpriority(PRIO_PROCESS, nonExitPid, testPrio);
248 EXPECT_EQ(rt, -1);
249 EXPECT_EQ(errno, ESRCH);
250 }
251 }
252
253 /**
254 * @tc.number SUB_KERNEL_SCHED_API_SETPRIORITY_0700
255 * @tc.name setpriority error test with invalid parameter 3.
256 * @tc.desc [C- SOFTWARE -0200]
257 */
HWTEST_F(ProcessSchedApiTest, testSetPriorityError0700, Function | MediumTest | Level3)258 HWTEST_F(ProcessSchedApiTest, testSetPriorityError0700, Function | MediumTest | Level3)
259 {
260 int rt;
261 LOG("invalid 'priority' test:");
262 errno = 0;
263 rt = setpriority(PRIO_PROCESS, 0, -1);
264 EXPECT_EQ(rt, -1);
265 EXPECT_EQ(errno, EINVAL);
266 errno = 0;
267 rt = setpriority(PRIO_PROCESS, 0, -GetRandom(1000));
268 EXPECT_EQ(rt, -1);
269 EXPECT_EQ(errno, EINVAL);
270 errno = 0;
271 rt = setpriority(PRIO_PROCESS, 0, 0);
272 EXPECT_EQ(rt, -1);
273 EXPECT_EQ(errno, EINVAL);
274 errno = 0;
275 rt = setpriority(PRIO_PROCESS, 0, HIGHEST_USER_PROCESS_PRIORITY - 1);
276 EXPECT_EQ(rt, -1);
277 EXPECT_EQ(errno, EINVAL);
278 LOG("check the default priority not changed:");
279 int newPrio = getpriority(PRIO_PROCESS, 0);
280 if (newPrio != DEFAULT_SHELL_PROCESS_PRIORITY) {
281 rt = setpriority(PRIO_PROCESS, 0, DEFAULT_SHELL_PROCESS_PRIORITY);
282 EXPECT_EQ(rt, 0);
283 FAIL() << "setpriority failed but priority has changed";
284 }
285 }
286
287 /**
288 * @tc.number SUB_KERNEL_SCHED_API_SETPRIORITY_0800
289 * @tc.name setpriority error test with no permission.
290 * @tc.desc [C- SOFTWARE -0200]
291 */
HWTEST_F(ProcessSchedApiTest, testSetPriorityError0800, Function | MediumTest | Level3)292 HWTEST_F(ProcessSchedApiTest, testSetPriorityError0800, Function | MediumTest | Level3)
293 {
294 const int testPrio = 18;
295 int rt;
296 LOG("no permission test:");
297 errno = 0;
298 rt = setpriority(PRIO_PROCESS, INIT_PROCESS_ID, testPrio);
299 EXPECT_EQ(rt, -1);
300 EXPECT_EQ(errno, EPERM);
301 errno = 0;
302 rt = setpriority(PRIO_PROCESS, KERNEL_PROCESS_ID, testPrio);
303 EXPECT_EQ(rt, -1);
304 EXPECT_EQ(errno, EPERM);
305 }
306
307 /**
308 * @tc.number SUB_KERNEL_SCHED_API_SCHED_GETPARAM_0100
309 * @tc.name sched_getparam api test.
310 * @tc.desc [C- SOFTWARE -0200]
311 */
HWTEST_F(ProcessSchedApiTest, testSchedGetParam, Function | MediumTest | Level1)312 HWTEST_F(ProcessSchedApiTest, testSchedGetParam, Function | MediumTest | Level1)
313 {
314 struct sched_param param;
315 int rt = sched_getparam(0, ¶m);
316 EXPECT_EQ(rt, 0) << "sched_getparam failed, errno=" << errno;
317 EXPECT_EQ(param.sched_priority, DEFAULT_SHELL_PROCESS_PRIORITY);
318
319 rt = sched_getparam(getpid(), ¶m);
320 EXPECT_EQ(rt, 0) << "sched_getparam failed, errno=" << errno;
321 EXPECT_EQ(param.sched_priority, DEFAULT_SHELL_PROCESS_PRIORITY);
322
323 rt = sched_getparam(INIT_PROCESS_ID, ¶m);
324 EXPECT_EQ(rt, 0) << "sched_getparam failed, errno=" << errno;
325 EXPECT_EQ(param.sched_priority, DEFAULT_INIT_PROCESS_PRIORITY);
326
327 rt = sched_getparam(KERNEL_PROCESS_ID, ¶m);
328 EXPECT_EQ(rt, 0) << "sched_getparam failed, errno=" << errno;
329 EXPECT_EQ(param.sched_priority, DEFAULT_KERNEL_PROCESS_PRIORITY);
330 }
331
332 /**
333 * @tc.number SUB_KERNEL_SCHED_API_SCHED_GETPARAM_0200
334 * @tc.name sched_getparam error test with invalid parameter 1.
335 * @tc.desc [C- SOFTWARE -0200]
336 */
HWTEST_F(ProcessSchedApiTest, testSchedGetParamError0200, Function | MediumTest | Level3)337 HWTEST_F(ProcessSchedApiTest, testSchedGetParamError0200, Function | MediumTest | Level3)
338 {
339 struct sched_param param;
340 LOG("invalid 'pid' test:");
341 errno = 0;
342 int rt = sched_getparam(-1, ¶m);
343 EXPECT_EQ(rt, -1);
344 EXPECT_EQ(errno, EINVAL);
345 errno = 0;
346 rt = sched_getparam(MAX_PROCESS_NUMBER + 1, ¶m);
347 EXPECT_EQ(rt, -1);
348 EXPECT_EQ(errno, EINVAL);
349 errno = 0;
350 rt = sched_getparam(MAX_PROCESS_NUMBER + GetRandom(100000), ¶m);
351 EXPECT_EQ(rt, -1);
352 EXPECT_EQ(errno, EINVAL);
353 }
354
355 /**
356 * @tc.number SUB_KERNEL_SCHED_API_SCHED_GETPARAM_0300
357 * @tc.name sched_getparam error test with not exist pid.
358 * @tc.desc [C- SOFTWARE -0200]
359 */
HWTEST_F(ProcessSchedApiTest, testSchedGetParamError0300, Function | MediumTest | Level3)360 HWTEST_F(ProcessSchedApiTest, testSchedGetParamError0300, Function | MediumTest | Level3)
361 {
362 struct sched_param param;
363 int rt;
364 LOG("not exist pid test:");
365 pid_t nonExitPid = GetNonExistPid(); // valid but not exist pid
366 if (nonExitPid != -1) {
367 rt = sched_getparam(nonExitPid, ¶m);
368 EXPECT_EQ(rt, -1);
369 EXPECT_EQ(errno, ESRCH);
370 }
371 }
372
373 /**
374 * @tc.number SUB_KERNEL_SCHED_API_SCHED_GETPARAM_0400
375 * @tc.name sched_getparam error test with invalid parameter 2.
376 * @tc.desc [C- SOFTWARE -0200]
377 */
HWTEST_F(ProcessSchedApiTest, testSchedGetParamError0400, Function | MediumTest | Level3)378 HWTEST_F(ProcessSchedApiTest, testSchedGetParamError0400, Function | MediumTest | Level3)
379 {
380 int rt;
381 LOG("invalid 'param' test:");
382 rt = sched_getparam(0, NULL);
383 EXPECT_EQ(rt, -1);
384 EXPECT_EQ(errno, EINVAL);
385 }
386
SchedSetParamAllTest()387 void SchedSetParamAllTest()
388 {
389 int rt, newPrio;
390 struct sched_param param;
391 LOG("test all supported priority:");
392 for (int prio = HIGHEST_USER_PROCESS_PRIORITY; prio <= LOWEST_USER_PROCESS_PRIORITY; prio++) {
393 param.sched_priority = prio;
394 rt = sched_setparam(0, ¶m);
395 EXPECT_EQ(rt, 0) << "sched_setparam failed for prio=" << prio << ", errno=" << errno;
396 newPrio = getpriority(PRIO_PROCESS, getpid());
397 EXPECT_EQ(prio, newPrio);
398 rt = sched_getparam(0, ¶m);
399 EXPECT_EQ(rt, 0);
400 EXPECT_EQ(prio, param.sched_priority);
401 }
402 LOG("set back to default value:");
403 param.sched_priority = DEFAULT_SHELL_PROCESS_PRIORITY;
404 rt = sched_setparam(getpid(), ¶m);
405 EXPECT_EQ(rt, 0);
406 newPrio = getpriority(PRIO_PROCESS, 0);
407 EXPECT_EQ(newPrio, DEFAULT_SHELL_PROCESS_PRIORITY);
408 }
409 /**
410 * @tc.number SUB_KERNEL_SCHED_API_SCHED_SETPARAM_0100
411 * @tc.name test sched_setparam for all supported priority.
412 * @tc.desc [C- SOFTWARE -0200]
413 */
HWTEST_F(ProcessSchedApiTest, testSchedSetParam, Function | MediumTest | Level1)414 HWTEST_F(ProcessSchedApiTest, testSchedSetParam, Function | MediumTest | Level1)
415 {
416 SchedSetParamAllTest();
417 }
418 /**
419 * @tc.number SUB_KERNEL_SCHED_API_SCHED_SETPARAM_0200
420 * @tc.name test sched_setparam for all supported priority, in FIFO mode
421 * @tc.desc [C- SOFTWARE -0200]
422 */
HWTEST_F(ProcessSchedApiTest, testSchedSetParamFiFo, Function | MediumTest | Level3)423 HWTEST_F(ProcessSchedApiTest, testSchedSetParamFiFo, Function | MediumTest | Level3)
424 {
425 struct sched_param param;
426 int rt = sched_getparam(0, ¶m);
427 ASSERT_EQ(rt, 0) << "get sched param failed, errno=" << errno;
428
429 SchedSetParamAllTest();
430
431 LOG("set to RR");
432 rt = sched_setscheduler(0, SCHED_RR, ¶m);
433 ASSERT_EQ(rt, 0) << "set SCHED_RR failed, errno=" << errno;
434 }
435
436 /**
437 * @tc.number SUB_KERNEL_SCHED_API_SCHED_SETPARAM_0300
438 * @tc.name sched_setparam error test with invalid pid.
439 * @tc.desc [C- SOFTWARE -0200]
440 */
HWTEST_F(ProcessSchedApiTest, testSchedSetParamError0300, Function | MediumTest | Level3)441 HWTEST_F(ProcessSchedApiTest, testSchedSetParamError0300, Function | MediumTest | Level3)
442 {
443 int rt;
444 struct sched_param param;
445 param.sched_priority = 18;
446
447 LOG("invalid 'pid' test:");
448 errno = 0;
449 rt = sched_setparam(-1, ¶m);
450 EXPECT_EQ(rt, -1);
451 EXPECT_EQ(errno, EINVAL);
452 errno = 0;
453 rt = sched_setparam(MAX_PROCESS_NUMBER + 1, ¶m);
454 EXPECT_EQ(rt, -1);
455 EXPECT_EQ(errno, EINVAL);
456 errno = 0;
457 rt = sched_setparam(MAX_PROCESS_NUMBER + GetRandom(100000), ¶m);
458 EXPECT_EQ(rt, -1);
459 EXPECT_EQ(errno, EINVAL);
460 }
461
462 /**
463 * @tc.number SUB_KERNEL_SCHED_API_SCHED_SETPARAM_0400
464 * @tc.name sched_setparam error test with not exist pid.
465 * @tc.desc [C- SOFTWARE -0200]
466 */
HWTEST_F(ProcessSchedApiTest, testSchedSetParamError0400, Function | MediumTest | Level3)467 HWTEST_F(ProcessSchedApiTest, testSchedSetParamError0400, Function | MediumTest | Level3)
468 {
469 int rt;
470 struct sched_param param;
471 param.sched_priority = 18;
472
473 LOG("not exist pid test:");
474 pid_t nonExitPid = GetNonExistPid(); // valid but not exist pid
475 if (nonExitPid != -1) {
476 rt = sched_setparam(nonExitPid, ¶m);
477 EXPECT_EQ(rt, -1);
478 EXPECT_EQ(errno, ESRCH);
479 }
480 }
481
482 /**
483 * @tc.number SUB_KERNEL_SCHED_API_SCHED_SETPARAM_0500
484 * @tc.name sched_setparam error test with invalid parameter 2.
485 * @tc.desc [C- SOFTWARE -0200]
486 */
HWTEST_F(ProcessSchedApiTest, testSchedSetParamError0500, Function | MediumTest | Level3)487 HWTEST_F(ProcessSchedApiTest, testSchedSetParamError0500, Function | MediumTest | Level3)
488 {
489 int rt;
490 LOG("invalid 'param' test:");
491 rt = sched_setparam(0, NULL);
492 EXPECT_EQ(rt, -1);
493 EXPECT_EQ(errno, EINVAL);
494 }
495
496 /**
497 * @tc.number SUB_KERNEL_SCHED_API_SCHED_SETPARAM_0600
498 * @tc.name sched_setparam error test with invalid priority.
499 * @tc.desc [C- SOFTWARE -0200]
500 */
HWTEST_F(ProcessSchedApiTest, testSchedSetParamError0600, Function | MediumTest | Level3)501 HWTEST_F(ProcessSchedApiTest, testSchedSetParamError0600, Function | MediumTest | Level3)
502 {
503 int rt;
504 struct sched_param param;
505 param.sched_priority = 18;
506
507 LOG("invalid 'priority' test:");
508 errno = 0;
509 param.sched_priority = -1;
510 rt = sched_setparam(0, ¶m);
511 EXPECT_EQ(rt, -1);
512 EXPECT_EQ(errno, EINVAL);
513 errno = 0;
514 param.sched_priority = -GetRandom(1000);
515 rt = sched_setparam(0, ¶m);
516 EXPECT_EQ(rt, -1);
517 EXPECT_EQ(errno, EINVAL);
518 errno = 0;
519 param.sched_priority = 0;
520 rt = sched_setparam(0, ¶m);
521 EXPECT_EQ(rt, -1);
522 EXPECT_EQ(errno, EINVAL);
523 errno = 0;
524 param.sched_priority = HIGHEST_USER_PROCESS_PRIORITY - 1;
525 rt = sched_setparam(0, ¶m);
526 EXPECT_EQ(rt, -1);
527 EXPECT_EQ(errno, EINVAL);
528
529 LOG("check the default priority not changed:");
530 int newPrio = getpriority(PRIO_PROCESS, 0);
531 if (newPrio != DEFAULT_SHELL_PROCESS_PRIORITY) {
532 rt = setpriority(PRIO_PROCESS, 0, DEFAULT_SHELL_PROCESS_PRIORITY);
533 EXPECT_EQ(rt, 0);
534 FAIL() << "sched_setparam failed but priority has changed";
535 }
536 }
537
538 /**
539 * @tc.number SUB_KERNEL_SCHED_API_SCHED_SETPARAM_0700
540 * @tc.name sched_setparam error test with no permission.
541 * @tc.desc [C- SOFTWARE -0200]
542 */
HWTEST_F(ProcessSchedApiTest, testSchedSetParamError0700, Function | MediumTest | Level3)543 HWTEST_F(ProcessSchedApiTest, testSchedSetParamError0700, Function | MediumTest | Level3)
544 {
545 int rt;
546 struct sched_param param;
547 param.sched_priority = 18;
548
549 LOG("no permission test:");
550 errno = 0;
551 rt = sched_setparam(INIT_PROCESS_ID, ¶m);
552 EXPECT_EQ(rt, -1);
553 EXPECT_EQ(errno, EPERM);
554 errno = 0;
555 rt = sched_setparam(KERNEL_PROCESS_ID, ¶m);
556 EXPECT_EQ(rt, -1);
557 EXPECT_EQ(errno, EPERM);
558
559 LOG("check the default priority not changed:");
560 int newPrio = getpriority(PRIO_PROCESS, 0);
561 if (newPrio != DEFAULT_SHELL_PROCESS_PRIORITY) {
562 rt = setpriority(PRIO_PROCESS, 0, DEFAULT_SHELL_PROCESS_PRIORITY);
563 EXPECT_EQ(rt, 0);
564 FAIL() << "sched_setparam failed but priority has changed";
565 }
566 }
567
568 /**
569 * @tc.number SUB_KERNEL_SCHED_API_GET_PRIORITY_MAX_0100
570 * @tc.name sched_get_priority_max api test.
571 * @tc.desc [C- SOFTWARE -0200]
572 */
HWTEST_F(ProcessSchedApiTest, testSchedGetPriorityMax, Function | MediumTest | Level3)573 HWTEST_F(ProcessSchedApiTest, testSchedGetPriorityMax, Function | MediumTest | Level3)
574 {
575 int prio = sched_get_priority_max(SCHED_RR);
576 EXPECT_EQ(prio, LOWEST_USER_PROCESS_PRIORITY);
577 }
578
579 /**
580 * @tc.number SUB_KERNEL_SCHED_API_GET_PRIORITY_MAX_0200
581 * @tc.name sched_get_priority_max api error test with unsupport policy.
582 * @tc.desc [C- SOFTWARE -0200]
583 */
HWTEST_F(ProcessSchedApiTest, testSchedGetPriorityMaxError0200, Function | MediumTest | Level3)584 HWTEST_F(ProcessSchedApiTest, testSchedGetPriorityMaxError0200, Function | MediumTest | Level3)
585 {
586 // SCHED_RR is 2
587 int invalidPolicy[] = {SCHED_FIFO, SCHED_OTHER, SCHED_BATCH, SCHED_IDLE, SCHED_DEADLINE, SCHED_RESET_ON_FORK};
588 int testLoop = sizeof(invalidPolicy)/sizeof(int);
589 for (int i = 0; i < testLoop; i++) {
590 errno = 0;
591 int prio = sched_get_priority_max(invalidPolicy[i]);
592 EXPECT_EQ(prio, -1) << "sched_get_priority_max ok for policy=" << invalidPolicy[i];
593 EXPECT_EQ(errno, EINVAL) << "errno check fail for policy=" << invalidPolicy[i];
594 }
595 }
596
597 /**
598 * @tc.number SUB_KERNEL_SCHED_API_GET_PRIORITY_MAX_0300
599 * @tc.name sched_get_priority_max api error test with invalid policy.
600 * @tc.desc [C- SOFTWARE -0200]
601 */
HWTEST_F(ProcessSchedApiTest, testSchedGetPriorityMaxError0300, Function | MediumTest | Level3)602 HWTEST_F(ProcessSchedApiTest, testSchedGetPriorityMaxError0300, Function | MediumTest | Level3)
603 {
604 // SCHED_RR is 2
605 int invalidPolicyVal;
606 int prio;
607
608 invalidPolicyVal = -GetRandom(10000);
609 errno = 0;
610 prio = sched_get_priority_max(invalidPolicyVal);
611 EXPECT_EQ(prio, -1) << "sched_get_priority_max ok for policy=" << invalidPolicyVal;
612 EXPECT_EQ(errno, EINVAL) << "errno check fail for policy=" << invalidPolicyVal;
613
614 invalidPolicyVal = GetRandom(10000) + SCHED_DEADLINE;
615 errno = 0;
616 prio = sched_get_priority_max(invalidPolicyVal);
617 EXPECT_EQ(prio, -1) << "sched_get_priority_max ok for policy=" << invalidPolicyVal;
618 EXPECT_EQ(errno, EINVAL) << "errno check fail for policy=" << invalidPolicyVal;
619 }
620
621 /**
622 * @tc.number SUB_KERNEL_SCHED_API_GET_PRIORITY_MIN_0100
623 * @tc.name sched_get_priority_min api test.
624 * @tc.desc [C- SOFTWARE -0200]
625 */
HWTEST_F(ProcessSchedApiTest, testSchedGetPriorityMin, Function | MediumTest | Level3)626 HWTEST_F(ProcessSchedApiTest, testSchedGetPriorityMin, Function | MediumTest | Level3)
627 {
628 int prio = sched_get_priority_min(SCHED_RR);
629 EXPECT_EQ(prio, HIGHEST_USER_PROCESS_PRIORITY);
630 }
631
632 /**
633 * @tc.number SUB_KERNEL_SCHED_API_GET_PRIORITY_MIN_0200
634 * @tc.name sched_get_priority_min api error test with unsupport policy.
635 * @tc.desc [C- SOFTWARE -0200]
636 */
HWTEST_F(ProcessSchedApiTest, testSchedGetPriorityMinError0200, Function | MediumTest | Level3)637 HWTEST_F(ProcessSchedApiTest, testSchedGetPriorityMinError0200, Function | MediumTest | Level3)
638 {
639 // SCHED_RR is 2
640 int invalidPolicy[] = {SCHED_FIFO, SCHED_OTHER, SCHED_BATCH, SCHED_IDLE, SCHED_DEADLINE, SCHED_RESET_ON_FORK};
641 int testLoop = sizeof(invalidPolicy)/sizeof(int);
642 for (int i = 0; i < testLoop; i++) {
643 errno = 0;
644 int prio = sched_get_priority_min(invalidPolicy[i]);
645 EXPECT_EQ(prio, -1) << "sched_get_priority_min ok for policy=" << invalidPolicy[i];
646 EXPECT_EQ(errno, EINVAL) << "errno check fail for policy=" << invalidPolicy[i];
647 }
648 }
649
650 /**
651 * @tc.number SUB_KERNEL_SCHED_API_GET_PRIORITY_MIN_0300
652 * @tc.name sched_get_priority_min api error test with invalid policy.
653 * @tc.desc [C- SOFTWARE -0200]
654 */
HWTEST_F(ProcessSchedApiTest, testSchedGetPriorityMinError0300, Function | MediumTest | Level3)655 HWTEST_F(ProcessSchedApiTest, testSchedGetPriorityMinError0300, Function | MediumTest | Level3)
656 {
657 int invalidPolicyVal;
658 int prio;
659 invalidPolicyVal = -GetRandom(10000);
660 errno = 0;
661 prio = sched_get_priority_min(invalidPolicyVal);
662 EXPECT_EQ(prio, -1) << "sched_get_priority_min ok for policy=" << invalidPolicyVal;
663 EXPECT_EQ(errno, EINVAL) << "errno check fail for policy=" << invalidPolicyVal;
664
665 invalidPolicyVal = GetRandom(10000) + SCHED_DEADLINE;
666 errno = 0;
667 prio = sched_get_priority_min(invalidPolicyVal);
668 EXPECT_EQ(prio, -1) << "sched_get_priority_min ok for policy=" << invalidPolicyVal;
669 EXPECT_EQ(errno, EINVAL) << "errno check fail for policy=" << invalidPolicyVal;
670 }
671
672 /**
673 * @tc.number SUB_KERNEL_SCHED_API_GETSCHEDULER_0100
674 * @tc.name sched_getscheduler api test.
675 * @tc.desc [C- SOFTWARE -0200]
676 */
HWTEST_F(ProcessSchedApiTest, testSchedGetScheduler, Function | MediumTest | Level1)677 HWTEST_F(ProcessSchedApiTest, testSchedGetScheduler, Function | MediumTest | Level1)
678 {
679 int policy = sched_getscheduler(0);
680 EXPECT_EQ(policy, SCHED_RR);
681 policy = sched_getscheduler(getpid());
682 EXPECT_EQ(policy, SCHED_RR) << "check 'shell' policy failed.";
683 policy = sched_getscheduler(INIT_PROCESS_ID);
684 EXPECT_EQ(policy, SCHED_RR) << "check 'init' policy failed.";
685 policy = sched_getscheduler(KERNEL_PROCESS_ID);
686 EXPECT_EQ(policy, SCHED_RR) << "check 'KProcess' policy failed.";
687 }
688
689 /**
690 * @tc.number SUB_KERNEL_SCHED_API_GETSCHEDULER_0200
691 * @tc.name sched_getscheduler api error test with invalid pid.
692 * @tc.desc [C- SOFTWARE -0200]
693 */
HWTEST_F(ProcessSchedApiTest, testSchedGetSchedulerError0200, Function | MediumTest | Level1)694 HWTEST_F(ProcessSchedApiTest, testSchedGetSchedulerError0200, Function | MediumTest | Level1)
695 {
696 LOG("invalid pid test:");
697 errno = 0;
698 int rt = sched_getscheduler(-1);
699 EXPECT_EQ(rt, -1);
700 EXPECT_EQ(errno, EINVAL);
701 errno = 0;
702 rt = sched_getscheduler(MAX_PROCESS_NUMBER + 1);
703 EXPECT_EQ(rt, -1);
704 EXPECT_EQ(errno, EINVAL);
705 errno = 0;
706 rt = sched_getscheduler(MAX_PROCESS_NUMBER + GetRandom(1000));
707 EXPECT_EQ(rt, -1);
708 EXPECT_EQ(errno, EINVAL);
709 }
710
711 /**
712 * @tc.number SUB_KERNEL_SCHED_API_GETSCHEDULER_0300
713 * @tc.name sched_getscheduler api error test with not exist pid.
714 * @tc.desc [C- SOFTWARE -0200]
715 */
HWTEST_F(ProcessSchedApiTest, testSchedGetSchedulerError0300, Function | MediumTest | Level1)716 HWTEST_F(ProcessSchedApiTest, testSchedGetSchedulerError0300, Function | MediumTest | Level1)
717 {
718 int rt;
719 errno = 0;
720 LOG("not exist pid test:");
721 pid_t nonExitPid = GetNonExistPid(); // valid but not exist pid
722 if (nonExitPid != -1) {
723 rt = sched_getscheduler(nonExitPid);
724 EXPECT_EQ(rt, -1);
725 EXPECT_EQ(errno, ESRCH);
726 }
727 }
728
729 /**
730 * @tc.number SUB_KERNEL_SCHED_API_SETSCHEDULER_0100
731 * @tc.name sched_setscheduler api test.
732 * @tc.desc [C- SOFTWARE -0200]
733 */
HWTEST_F(ProcessSchedApiTest, testSchedSetScheduler, Function | MediumTest | Level1)734 HWTEST_F(ProcessSchedApiTest, testSchedSetScheduler, Function | MediumTest | Level1)
735 {
736 struct sched_param param;
737 int rt = sched_getparam(0, ¶m);
738 ASSERT_EQ(rt, 0) << "get sched param failed, errno=" << errno;
739
740 LOG("change policy and priority:");
741 rt = sched_setscheduler(0, SCHED_RR, ¶m);
742 ASSERT_EQ(rt, 0) << "set RR failed, errno=" << errno;
743 int policy = sched_getscheduler(0);
744 EXPECT_EQ(policy, SCHED_RR);
745 rt = sched_setscheduler(getpid(), SCHED_RR, ¶m);
746 EXPECT_EQ(rt, 0) << "set RR again failed, errno=" << errno;
747 policy = sched_getscheduler(0);
748 EXPECT_EQ(policy, SCHED_RR);
749
750 param.sched_priority = LOWEST_USER_PROCESS_PRIORITY;
751 rt = sched_setscheduler(getpid(), SCHED_RR, ¶m);
752 EXPECT_EQ(rt, 0) << "set RR again failed, errno=" << errno;
753 policy = sched_getscheduler(0);
754 EXPECT_EQ(policy, SCHED_RR);
755 int newPrio = getpriority(PRIO_PROCESS, 0);
756 EXPECT_EQ(newPrio, LOWEST_USER_PROCESS_PRIORITY);
757
758 LOG("set back to SCHED_RR and default priority:");
759 param.sched_priority = DEFAULT_SHELL_PROCESS_PRIORITY;
760 rt = sched_setscheduler(getpid(), SCHED_RR, ¶m);
761 EXPECT_EQ(rt, 0) << "set back to SCHED_RR failed, errno=" << errno;
762 policy = sched_getscheduler(0);
763 EXPECT_EQ(policy, SCHED_RR);
764 }
765
766 /**
767 * @tc.number SUB_KERNEL_SCHED_API_SETSCHEDULER_0200
768 * @tc.name sched_setscheduler api error test with invalid pid.
769 * @tc.desc [C- SOFTWARE -0200]
770 */
HWTEST_F(ProcessSchedApiTest, testSchedSetSchedulerError0200, Function | MediumTest | Level1)771 HWTEST_F(ProcessSchedApiTest, testSchedSetSchedulerError0200, Function | MediumTest | Level1)
772 {
773 struct sched_param param;
774 int rt = sched_getparam(0, ¶m);
775 ASSERT_EQ(rt, 0) << "get sched param failed, errno=" << errno;
776
777 LOG("invalid pid test:");
778 errno = 0;
779 rt = sched_setscheduler(-1, SCHED_RR, ¶m);
780 EXPECT_EQ(rt, -1);
781 EXPECT_EQ(errno, EINVAL);
782 errno = 0;
783 rt = sched_setscheduler(MAX_PROCESS_NUMBER + 1, SCHED_RR, ¶m);
784 EXPECT_EQ(rt, -1);
785 EXPECT_EQ(errno, EINVAL);
786 errno = 0;
787 rt = sched_setscheduler(MAX_PROCESS_NUMBER + GetRandom(1000), SCHED_RR, ¶m);
788 EXPECT_EQ(rt, -1);
789 EXPECT_EQ(errno, EINVAL);
790 }
791
792 /**
793 * @tc.number SUB_KERNEL_SCHED_API_SETSCHEDULER_0300
794 * @tc.name sched_setscheduler api error test with not exist pid.
795 * @tc.desc [C- SOFTWARE -0200]
796 */
HWTEST_F(ProcessSchedApiTest, testSchedSetSchedulerError0300, Function | MediumTest | Level1)797 HWTEST_F(ProcessSchedApiTest, testSchedSetSchedulerError0300, Function | MediumTest | Level1)
798 {
799 struct sched_param param;
800 int rt = sched_getparam(0, ¶m);
801 ASSERT_EQ(rt, 0) << "get sched param failed, errno=" << errno;
802
803 LOG("not exist pid test:");
804 pid_t nonExitPid = GetNonExistPid(); // valid but not exist pid
805 if (nonExitPid != -1) {
806 rt = sched_setscheduler(nonExitPid, SCHED_RR, ¶m);
807 EXPECT_EQ(rt, -1);
808 EXPECT_EQ(errno, ESRCH);
809 }
810 }
811
812 /**
813 * @tc.number SUB_KERNEL_SCHED_API_SETSCHEDULER_0400
814 * @tc.name sched_setscheduler api error test with unsupport policy.
815 * @tc.desc [C- SOFTWARE -0200]
816 */
HWTEST_F(ProcessSchedApiTest, testSchedSetSchedulerError0400, Function | MediumTest | Level1)817 HWTEST_F(ProcessSchedApiTest, testSchedSetSchedulerError0400, Function | MediumTest | Level1)
818 {
819 struct sched_param param;
820 int rt = sched_getparam(0, ¶m);
821 ASSERT_EQ(rt, 0) << "get sched param failed, errno=" << errno;
822
823 LOG("invalid policy test:");
824 //and SCHED_RR is 2
825 int invalidPolicy[] = {SCHED_FIFO, SCHED_OTHER, SCHED_BATCH, SCHED_IDLE, SCHED_DEADLINE, SCHED_RESET_ON_FORK};
826 int testLoop = sizeof(invalidPolicy)/sizeof(int);
827 for (int i = 0; i < testLoop; i++) {
828 errno = 0;
829 rt = sched_setscheduler(0, invalidPolicy[i], ¶m);
830 EXPECT_EQ(rt, -1) << "sched_get_priority_min ok for policy=" << invalidPolicy[i];
831 EXPECT_EQ(errno, EINVAL) << "errno check fail for policy=" << invalidPolicy[i];
832 }
833
834 LOG("check the default priority not changed:");
835 int policy = sched_getscheduler(0);
836 if (policy != SCHED_RR) {
837 rt = sched_setscheduler(0, SCHED_RR, ¶m);
838 EXPECT_EQ(rt, 0);
839 FAIL() << "sched_setscheduler failed but policy has changed";
840 }
841 }
842
843 /**
844 * @tc.number SUB_KERNEL_SCHED_API_SETSCHEDULER_0500
845 * @tc.name sched_setscheduler api error test with invalid policy.
846 * @tc.desc [C- SOFTWARE -0200]
847 */
HWTEST_F(ProcessSchedApiTest, testSchedSetSchedulerError0500, Function | MediumTest | Level1)848 HWTEST_F(ProcessSchedApiTest, testSchedSetSchedulerError0500, Function | MediumTest | Level1)
849 {
850 struct sched_param param;
851 int rt = sched_getparam(0, ¶m);
852 ASSERT_EQ(rt, 0) << "get sched param failed, errno=" << errno;
853
854 LOG("invalid policy test:");
855 int invalidPolicy = -GetRandom(10000);
856 errno = 0;
857 rt = sched_setscheduler(0, invalidPolicy, ¶m);
858 EXPECT_EQ(rt, -1) << "sched_get_priority_min ok for policy=" << invalidPolicy;
859 EXPECT_EQ(errno, EINVAL) << "errno check fail for policy=" << invalidPolicy;
860 invalidPolicy = GetRandom(10000) + SCHED_DEADLINE;
861 errno = 0;
862 rt = sched_setscheduler(0, invalidPolicy, ¶m);
863 EXPECT_EQ(rt, -1) << "sched_get_priority_min ok for policy=" << invalidPolicy;
864 EXPECT_EQ(errno, EINVAL) << "errno check fail for policy=" << invalidPolicy;
865
866 LOG("check the default priority not changed:");
867 int policy = sched_getscheduler(0);
868 if (policy != SCHED_RR) {
869 rt = sched_setscheduler(0, SCHED_RR, ¶m);
870 EXPECT_EQ(rt, 0);
871 FAIL() << "sched_setscheduler failed but policy has changed";
872 }
873 }
874
875 /**
876 * @tc.number SUB_KERNEL_SCHED_API_SETSCHEDULER_0600
877 * @tc.name sched_setscheduler api error test with invalid parameter.
878 * @tc.desc [C- SOFTWARE -0200]
879 */
HWTEST_F(ProcessSchedApiTest, testSchedSetSchedulerError0600, Function | MediumTest | Level1)880 HWTEST_F(ProcessSchedApiTest, testSchedSetSchedulerError0600, Function | MediumTest | Level1)
881 {
882 struct sched_param param;
883 int rt = sched_getparam(0, ¶m);
884 ASSERT_EQ(rt, 0) << "get sched param failed, errno=" << errno;
885
886 LOG("invalid param test:");
887 rt = sched_setscheduler(0, SCHED_RR, NULL);
888 EXPECT_EQ(rt, -1);
889 EXPECT_EQ(errno, EINVAL);
890 }
891
892 /**
893 * @tc.number SUB_KERNEL_SCHED_API_SETSCHEDULER_0700
894 * @tc.name sched_setscheduler api error test with no permission.
895 * @tc.desc [C- SOFTWARE -0200]
896 */
HWTEST_F(ProcessSchedApiTest, testSchedSetSchedulerError0700, Function | MediumTest | Level1)897 HWTEST_F(ProcessSchedApiTest, testSchedSetSchedulerError0700, Function | MediumTest | Level1)
898 {
899 struct sched_param param;
900 int rt = sched_getparam(0, ¶m);
901 ASSERT_EQ(rt, 0) << "get sched param failed, errno=" << errno;
902
903 LOG("no permission test:");
904 errno = 0;
905 rt = sched_setscheduler(INIT_PROCESS_ID, SCHED_RR, ¶m);
906 EXPECT_EQ(rt, -1);
907 EXPECT_EQ(errno, EPERM);
908 errno = 0;
909 rt = sched_setscheduler(KERNEL_PROCESS_ID, SCHED_RR, ¶m);
910 EXPECT_EQ(rt, -1);
911 EXPECT_EQ(errno, EPERM);
912 }
913
914 /**
915 * @tc.number SUB_KERNEL_SCHED_API_GETRRINTERVAL_0100
916 * @tc.name sched_rr_get_interval api test
917 * @tc.desc [C- SOFTWARE -0200]
918 */
HWTEST_F(ProcessSchedApiTest, testSchedRRGetInterval, Function | MediumTest | Level1)919 HWTEST_F(ProcessSchedApiTest, testSchedRRGetInterval, Function | MediumTest | Level1)
920 {
921 struct timespec time1 = {1, 0};
922 int rt = sched_rr_get_interval(0, &time1);
923 printf("%llu, %u\n", time1.tv_sec, time1.tv_nsec);
924 EXPECT_EQ(rt, 0);
925 EXPECT_EQ(time1.tv_sec, 0);
926 EXPECT_GE (time1.tv_nsec, DEFAULT_RR_SCHED_INTERVAL);
927
928 time1.tv_sec = 1;
929 time1.tv_nsec = 0;
930 rt = sched_rr_get_interval(getpid(), &time1);
931 printf("%llu, %u\n", time1.tv_sec, time1.tv_nsec);
932 EXPECT_EQ(rt, 0);
933 EXPECT_EQ(time1.tv_sec, 0);
934 EXPECT_GE(time1.tv_nsec, DEFAULT_RR_SCHED_INTERVAL);
935 }
936
937 /**
938 * @tc.number SUB_KERNEL_SCHED_API_GETRRINTERVAL_0200
939 * @tc.name sched_rr_get_interval error test with invalid pid
940 * @tc.desc [C- SOFTWARE -0200]
941 */
HWTEST_F(ProcessSchedApiTest, testSchedRRGetIntervalError0200, Function | MediumTest | Level1)942 HWTEST_F(ProcessSchedApiTest, testSchedRRGetIntervalError0200, Function | MediumTest | Level1)
943 {
944 struct timespec time1 = {0, 0};
945 LOG("invalid 'pid' test:");
946 errno = 0;
947 int rt = sched_rr_get_interval(-1, &time1);
948 EXPECT_EQ(rt, -1);
949 EXPECT_EQ(errno, EINVAL);
950 errno = 0;
951 rt = sched_rr_get_interval(MAX_PROCESS_NUMBER + 1, &time1);
952 EXPECT_EQ(rt, -1);
953 EXPECT_EQ(errno, EINVAL);
954 errno = 0;
955 rt = sched_rr_get_interval(MAX_PROCESS_NUMBER + GetRandom(1000), &time1);
956 EXPECT_EQ(rt, -1);
957 EXPECT_EQ(errno, EINVAL);
958 }
959
960 /**
961 * @tc.number SUB_KERNEL_SCHED_API_GETRRINTERVAL_0300
962 * @tc.name sched_rr_get_interval error test with not exist pid
963 * @tc.desc [C- SOFTWARE -0200]
964 */
HWTEST_F(ProcessSchedApiTest, testSchedRRGetIntervalError0300, Function | MediumTest | Level1)965 HWTEST_F(ProcessSchedApiTest, testSchedRRGetIntervalError0300, Function | MediumTest | Level1)
966 {
967 struct timespec time1 = {0, 0};
968 int rt;
969
970 LOG("not exist pid test:");
971 pid_t nonExitPid = GetNonExistPid(); // valid but not exist pid
972 if (nonExitPid != -1) {
973 rt = sched_rr_get_interval(nonExitPid, &time1);
974 EXPECT_EQ(rt, -1);
975 EXPECT_EQ(errno, ESRCH);
976 }
977
978 LOG("invalid 'timespec' test:");
979 rt = sched_rr_get_interval(0, NULL);
980 EXPECT_EQ(rt, -1);
981 EXPECT_EQ(errno, EINVAL);
982 }
983
984 /**
985 * @tc.number SUB_KERNEL_SCHED_API_GETRRINTERVAL_0400
986 * @tc.name sched_rr_get_interval error test with invalid timespec
987 * @tc.desc [C- SOFTWARE -0200]
988 */
HWTEST_F(ProcessSchedApiTest, testSchedRRGetIntervalError0400, Function | MediumTest | Level1)989 HWTEST_F(ProcessSchedApiTest, testSchedRRGetIntervalError0400, Function | MediumTest | Level1)
990 {
991 int rt;
992
993 LOG("invalid 'timespec' test:");
994 rt = sched_rr_get_interval(0, NULL);
995 EXPECT_EQ(rt, -1);
996 EXPECT_EQ(errno, EINVAL);
997 }
998
999 /**
1000 * @tc.number SUB_KERNEL_SCHED_API_YIELD_0100
1001 * @tc.name test sched_yield with two process
1002 * @tc.desc [C- SOFTWARE -0200]
1003 */
HWTEST_F(ProcessSchedApiTest, testSchedYieldBasic, Function | MediumTest | Level1)1004 HWTEST_F(ProcessSchedApiTest, testSchedYieldBasic, Function | MediumTest | Level1)
1005 {
1006 int ret;
1007 int cpuCnt = 0;
1008 cpu_set_t oldMask;
1009 CPU_ZERO(&oldMask);
1010 cpuCnt = GetCpuCount();
1011 LOG("GetCpuCount=%d", cpuCnt);
1012 if (cpuCnt > 1) {
1013 ret = FixCurProcessToOneCpu(0, &oldMask);
1014 ASSERT_EQ(ret, 0);
1015 }
1016
1017 ASSERT_EQ(InitPipe(), 0) << "> parent: pipe errno = " << errno;
1018 EXPECT_NE(InitGlobalVariable(), -1);
1019 pid_t pid = fork();
1020 ASSERT_TRUE(pid >= 0) << "> parent: fork errno = " << errno;
1021 if (pid == 0) {
1022 if (cpuCnt > 1) {
1023 ret = FixCurProcessToOneCpu(0, &oldMask);
1024 EXPECT_EQ(ret, 0);
1025 }
1026 // control step 2
1027 BlockOnPipe();
1028 SetGlobalVariable(1);
1029 LOG("222");
1030 exit(0);
1031 }
1032 Msleep(50);
1033 // control step 1
1034 UnBlockPipe();
1035 LOG("111");
1036 EXPECT_EQ(sched_yield(), 0) << "> sched_yield error";
1037 // control step 3
1038 EXPECT_NE(SetGlobalVariable(2), -1);
1039 LOG("333");
1040 // control step 4
1041 WaitProcExitedOK(pid);
1042 EXPECT_EQ(GetGlobalVariable(), 2);
1043 EXPECT_NE(DeleteGlobalVariable(), -1);
1044 if (cpuCnt > 1) {
1045 ret = sched_setaffinity(0, sizeof(oldMask), &oldMask);
1046 ASSERT_EQ(ret, 0);
1047 }
1048 }
1049