#include "src/errno/libc_errno.h"
#include "src/sched/sched_get_priority_min.h"
#include "src/sched/sched_getscheduler.h"
#include "src/sched/sched_rr_get_interval.h"
#include "src/sched/sched_setscheduler.h"
#include "src/unistd/getuid.h"
#include "test/UnitTest/Test.h"
#include <sched.h>
TEST(LlvmLibcSchedRRGetIntervalTest, SmokeTest) {
LIBC_NAMESPACE::libc_errno = 0;
auto SetSched = [&](int policy) {
int min_priority = LIBC_NAMESPACE::sched_get_priority_min(policy);
ASSERT_GE(min_priority, 0);
ASSERT_ERRNO_SUCCESS();
struct sched_param param;
param.sched_priority = min_priority;
ASSERT_EQ(LIBC_NAMESPACE::sched_setscheduler(0, policy, ¶m), 0);
ASSERT_ERRNO_SUCCESS();
};
auto TimespecToNs = [](struct timespec t) {
return static_cast<uint64_t>(t.tv_sec * 1000UL * 1000UL * 1000UL +
t.tv_nsec);
};
struct timespec ts;
if (LIBC_NAMESPACE::getuid() == 0)
SetSched(SCHED_RR);
int cur_policy = LIBC_NAMESPACE::sched_getscheduler(0);
ASSERT_GE(cur_policy, 0);
ASSERT_ERRNO_SUCCESS();
if (cur_policy == SCHED_RR) {
ASSERT_EQ(LIBC_NAMESPACE::sched_rr_get_interval(0, &ts), 0);
ASSERT_ERRNO_SUCCESS();
constexpr uint64_t tenNs = 10UL;
ASSERT_GT(TimespecToNs(ts), tenNs);
constexpr uint64_t thirstyS = 30UL * 1000UL * 1000UL * 1000UL;
ASSERT_LT(TimespecToNs(ts), thirstyS);
ASSERT_EQ(LIBC_NAMESPACE::sched_rr_get_interval(0, nullptr), -1);
ASSERT_ERRNO_EQ(EFAULT);
LIBC_NAMESPACE::libc_errno = 0;
ASSERT_EQ(LIBC_NAMESPACE::sched_rr_get_interval(-1, &ts), -1);
ASSERT_ERRNO_EQ(EINVAL);
LIBC_NAMESPACE::libc_errno = 0;
}
SetSched(SCHED_OTHER);
ASSERT_EQ(LIBC_NAMESPACE::sched_rr_get_interval(0, &ts), 0);
ASSERT_ERRNO_SUCCESS();
LIBC_NAMESPACE::libc_errno = 0;
}