| //===----------------------------------------------------------------------===// |
| // |
| // 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); |
| } |
| } |