78 lines · cpp
1//===-- Unittests for sched_rr_get_interval -------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "src/sched/sched_get_priority_min.h"10#include "src/sched/sched_getscheduler.h"11#include "src/sched/sched_rr_get_interval.h"12#include "src/sched/sched_setscheduler.h"13#include "src/unistd/getuid.h"14#include "test/UnitTest/ErrnoCheckingTest.h"15#include "test/UnitTest/Test.h"16 17#include "hdr/sched_macros.h"18#include "hdr/types/struct_timespec.h"19 20using LlvmLibcSchedRRGetIntervalTest =21 LIBC_NAMESPACE::testing::ErrnoCheckingTest;22 23TEST_F(LlvmLibcSchedRRGetIntervalTest, SmokeTest) {24 auto SetSched = [&](int policy) {25 int min_priority = LIBC_NAMESPACE::sched_get_priority_min(policy);26 ASSERT_GE(min_priority, 0);27 ASSERT_ERRNO_SUCCESS();28 struct sched_param param;29 param.sched_priority = min_priority;30 ASSERT_EQ(LIBC_NAMESPACE::sched_setscheduler(0, policy, ¶m), 0);31 ASSERT_ERRNO_SUCCESS();32 };33 34 auto TimespecToNs = [](struct timespec t) {35 return static_cast<uint64_t>(t.tv_sec * 1000UL * 1000UL * 1000UL +36 t.tv_nsec);37 };38 39 struct timespec ts;40 41 // We can only set SCHED_RR with CAP_SYS_ADMIN42 if (LIBC_NAMESPACE::getuid() == 0)43 SetSched(SCHED_RR);44 45 int cur_policy = LIBC_NAMESPACE::sched_getscheduler(0);46 ASSERT_GE(cur_policy, 0);47 ASSERT_ERRNO_SUCCESS();48 49 // We can actually run meaningful tests.50 if (cur_policy == SCHED_RR) {51 // Success52 ASSERT_EQ(LIBC_NAMESPACE::sched_rr_get_interval(0, &ts), 0);53 ASSERT_ERRNO_SUCCESS();54 55 // Check that numbers make sense (liberal bound of 10ns - 30sec)56 constexpr uint64_t tenNs = 10UL;57 ASSERT_GT(TimespecToNs(ts), tenNs);58 constexpr uint64_t thirstyS = 30UL * 1000UL * 1000UL * 1000UL;59 ASSERT_LT(TimespecToNs(ts), thirstyS);60 61 // Null timespec62 ASSERT_EQ(LIBC_NAMESPACE::sched_rr_get_interval(0, nullptr), -1);63 ASSERT_ERRNO_EQ(EFAULT);64 65 // Negative pid66 ASSERT_EQ(LIBC_NAMESPACE::sched_rr_get_interval(-1, &ts), -1);67 ASSERT_ERRNO_EQ(EINVAL);68 }69 70 // Negative tests don't have SCHED_RR set71 SetSched(SCHED_OTHER);72 ASSERT_EQ(LIBC_NAMESPACE::sched_rr_get_interval(0, &ts), 0);73 ASSERT_ERRNO_SUCCESS();74 75 // TODO: Missing unkown pid -> ESRCH. This is read only so safe to try a few76 // unlikely values.77}78