Serenity Operating System
at master 68 lines 2.7 kB view raw
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}