Serenity Operating System
1/*
2 * Copyright (c) 2022, kleines Filmröllchen <filmroellchen@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include <LibTest/TestCase.h>
8#include <pthread.h>
9#include <sched.h>
10#include <unistd.h>
11
12#define TEST_CASE_IN_PTHREAD(x) \
13 static void* __TESTCASE_FUNC(x##__inner)(void*); \
14 TEST_CASE(x) \
15 { \
16 pthread_t thread; \
17 pthread_create(&thread, nullptr, __TESTCASE_FUNC(x##__inner), nullptr); \
18 pthread_join(thread, nullptr); \
19 } \
20 static void* __TESTCASE_FUNC(x##__inner)(void*)
21
22TEST_CASE_IN_PTHREAD(basic_priority)
23{
24 auto min_priority = sched_get_priority_min(0);
25 auto max_priority = sched_get_priority_max(0);
26 sched_param const min_priority_parameter { .sched_priority = min_priority };
27 sched_param const max_priority_parameter { .sched_priority = max_priority };
28
29 auto rc = pthread_setschedparam(0, 0, &min_priority_parameter);
30 EXPECT_EQ(rc, 0);
31 sched_param output_parameter;
32 rc = pthread_getschedparam(0, 0, &output_parameter);
33 EXPECT_EQ(rc, 0);
34 EXPECT_EQ(output_parameter.sched_priority, min_priority);
35
36 rc = pthread_setschedparam(0, 0, &max_priority_parameter);
37 EXPECT_EQ(rc, 0);
38 rc = pthread_getschedparam(0, 0, &output_parameter);
39 EXPECT_EQ(rc, 0);
40 EXPECT_EQ(output_parameter.sched_priority, max_priority);
41
42 rc = pthread_setschedparam(0, 0, &max_priority_parameter);
43 EXPECT_EQ(rc, 0);
44 return 0;
45}
46
47TEST_CASE_IN_PTHREAD(invalid_arguments)
48{
49 auto min_priority = sched_get_priority_min(0);
50 auto max_priority = sched_get_priority_max(0);
51 sched_param const under_priority_parameter { .sched_priority = min_priority - 1 };
52 sched_param const over_priority_parameter { .sched_priority = max_priority + 1 };
53 sched_param const min_priority_parameter { .sched_priority = min_priority };
54
55 // Set too high or too low priorities.
56 auto rc = pthread_setschedparam(0, 0, &over_priority_parameter);
57 EXPECT_EQ(rc, EINVAL);
58 rc = pthread_setschedparam(0, 0, &under_priority_parameter);
59 EXPECT_EQ(rc, EINVAL);
60
61 // Get and set a thread that doesn't exist.
62 rc = pthread_setschedparam(-42069, 0, &min_priority_parameter);
63 EXPECT_EQ(rc, ESRCH);
64 sched_param output_parameter;
65 rc = pthread_getschedparam(-42069, 0, &output_parameter);
66 EXPECT_EQ(rc, ESRCH);
67 return 0;
68}