blob: 80717772f7d2ad041c570266ffb958e5d335d158 [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 sysmacros (major, minor, makedev).
///
//===----------------------------------------------------------------------===//
#include "hdr/types/dev_t.h"
#include "src/sys/sysmacros/major.h"
#include "src/sys/sysmacros/makedev.h"
#include "src/sys/sysmacros/minor.h"
#include "test/UnitTest/Test.h"
TEST(LlvmLibcSysmacrosTest, Zero) {
dev_t dev = LIBC_NAMESPACE::makedev(0, 0);
EXPECT_EQ(dev, static_cast<dev_t>(0));
EXPECT_EQ(LIBC_NAMESPACE::major(dev), 0u);
EXPECT_EQ(LIBC_NAMESPACE::minor(dev), 0u);
}
TEST(LlvmLibcSysmacrosTest, StandardLinuxDevices) {
// /dev/null: major 1, minor 3 -> dev = (1 << 8) | 3 = 0x103
dev_t dev_null = LIBC_NAMESPACE::makedev(1, 3);
EXPECT_EQ(dev_null, static_cast<dev_t>(0x103));
EXPECT_EQ(LIBC_NAMESPACE::major(dev_null), 1u);
EXPECT_EQ(LIBC_NAMESPACE::minor(dev_null), 3u);
// /dev/pts/0: major 136 (0x88), minor 0 -> dev = 0x8800
dev_t dev_pts0 = LIBC_NAMESPACE::makedev(136, 0);
EXPECT_EQ(dev_pts0, static_cast<dev_t>(0x8800));
EXPECT_EQ(LIBC_NAMESPACE::major(dev_pts0), 136u);
EXPECT_EQ(LIBC_NAMESPACE::minor(dev_pts0), 0u);
// /dev/sda1: major 8, minor 1 -> dev = 0x801
dev_t dev_sda1 = LIBC_NAMESPACE::makedev(8, 1);
EXPECT_EQ(dev_sda1, static_cast<dev_t>(0x801));
EXPECT_EQ(LIBC_NAMESPACE::major(dev_sda1), 8u);
EXPECT_EQ(LIBC_NAMESPACE::minor(dev_sda1), 1u);
}
TEST(LlvmLibcSysmacrosTest, LargeMinorOrMajor) {
// Minor >= 256 uses the upper bits of dev_t (bits 20..43).
// minor = 256 (0x100): lower 8 bits = 0x00, upper bits shifted by 12 =
// 0x100000.
dev_t dev1 = LIBC_NAMESPACE::makedev(0, 0x100);
EXPECT_EQ(dev1, static_cast<dev_t>(0x100000));
EXPECT_EQ(LIBC_NAMESPACE::major(dev1), 0u);
EXPECT_EQ(LIBC_NAMESPACE::minor(dev1), 0x100u);
// Major >= 4096 uses the upper bits of dev_t (bits 44..63).
// major = 4096 (0x1000): lower 12 bits = 0, upper bits shifted by 32 =
// 0x100000000000.
dev_t dev2 = LIBC_NAMESPACE::makedev(0x1000, 0);
EXPECT_EQ(dev2, static_cast<dev_t>(0x100000000000ULL));
EXPECT_EQ(LIBC_NAMESPACE::major(dev2), 0x1000u);
EXPECT_EQ(LIBC_NAMESPACE::minor(dev2), 0u);
}
TEST(LlvmLibcSysmacrosTest, MaxValues) {
// All bits set
dev_t dev_max = LIBC_NAMESPACE::makedev(0xffffffffu, 0xffffffffu);
EXPECT_EQ(dev_max, static_cast<dev_t>(0xffffffffffffffffULL));
EXPECT_EQ(LIBC_NAMESPACE::major(dev_max), 0xffffffffu);
EXPECT_EQ(LIBC_NAMESPACE::minor(dev_max), 0xffffffffu);
}
TEST(LlvmLibcSysmacrosTest, RoundTrip) {
struct TestCase {
unsigned int maj;
unsigned int min;
} test_cases[] = {
{0x0, 0x0},
{0x1, 0x1},
{0xfff, 0xffff},
{0xffff, 0xfff},
{0xdeadbeef, 0x12345678},
{0x87654321, 0xabcdef01},
};
for (const auto &tc : test_cases) {
dev_t d = LIBC_NAMESPACE::makedev(tc.maj, tc.min);
EXPECT_EQ(LIBC_NAMESPACE::major(d), tc.maj);
EXPECT_EQ(LIBC_NAMESPACE::minor(d), tc.min);
}
}