blob: 2a3fd6c640cf890169b37e289dc1e1d2aa3b9c21 [file] [edit]
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
///
/// \file
/// Unittests for clock_getcpuclockid.
///
//===----------------------------------------------------------------------===//
#include "hdr/errno_macros.h"
#include "hdr/types/clockid_t.h"
#include "hdr/types/pid_t.h"
#include "hdr/types/struct_timespec.h"
#include "src/time/clock_getcpuclockid.h"
#include "src/time/clock_gettime.h"
#include "src/unistd/getpid.h"
#include "test/UnitTest/ErrnoCheckingTest.h"
#include "test/UnitTest/Test.h"
using LlvmLibcClockGetCpuClockIdTest =
LIBC_NAMESPACE::testing::ErrnoCheckingTest;
TEST_F(LlvmLibcClockGetCpuClockIdTest, CurrentProcessZeroPid) {
clockid_t clock_id = 0;
ASSERT_EQ(LIBC_NAMESPACE::clock_getcpuclockid(0, &clock_id), 0);
// On Linux, pid 0 translates to (~0 << 3) | 2 == -6.
EXPECT_EQ(clock_id, static_cast<clockid_t>(-6));
// Validate that we can use resulting clock_id to get time.
struct timespec ts;
EXPECT_EQ(LIBC_NAMESPACE::clock_gettime(clock_id, &ts), 0);
EXPECT_GE(ts.tv_sec, static_cast<time_t>(0));
}
TEST_F(LlvmLibcClockGetCpuClockIdTest, CurrentProcessExplicitPid) {
pid_t pid = LIBC_NAMESPACE::getpid();
clockid_t clock_id = 0;
ASSERT_EQ(LIBC_NAMESPACE::clock_getcpuclockid(pid, &clock_id), 0);
EXPECT_EQ(clock_id,
static_cast<clockid_t>((static_cast<unsigned int>(~pid) << 3) | 2));
// Validate that we can use resulting clock_id to get time.
struct timespec ts;
EXPECT_EQ(LIBC_NAMESPACE::clock_gettime(clock_id, &ts), 0);
EXPECT_GE(ts.tv_sec, static_cast<time_t>(0));
}
TEST_F(LlvmLibcClockGetCpuClockIdTest, InvalidPid) {
clockid_t clock_id = 0;
// Invalid PIDs should fail with ESRCH.
EXPECT_EQ(LIBC_NAMESPACE::clock_getcpuclockid(-1, &clock_id), ESRCH);
EXPECT_EQ(LIBC_NAMESPACE::clock_getcpuclockid(1000000000, &clock_id), ESRCH);
}