brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.5 KiB · d5eecb5 Raw
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, &param), 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