SimpleKernel 1.17.0
Loading...
Searching...
No Matches
dma_region_test.cpp
Go to the documentation of this file.
1
5#include <gtest/gtest.h>
6
7#include <cstring>
8
9#include "io_buffer.hpp"
10
11TEST(DmaRegionTest, DefaultConstructedIsInvalid) {
12 DmaRegion region{};
13 EXPECT_FALSE(region.IsValid());
14 EXPECT_EQ(region.virt, nullptr);
15 EXPECT_EQ(region.phys, 0u);
16 EXPECT_EQ(region.size, 0u);
17}
18
19TEST(DmaRegionTest, ValidRegion) {
20 uint8_t buf[256]{};
21 DmaRegion region{
22 .virt = buf,
23 .phys = 0x8000'0000,
24 .size = sizeof(buf),
25 };
26 EXPECT_TRUE(region.IsValid());
27 EXPECT_EQ(region.Data(), buf);
28 EXPECT_EQ(region.phys, 0x8000'0000u);
29 EXPECT_EQ(region.size, 256u);
30}
31
32TEST(DmaRegionTest, NullVirtIsInvalid) {
33 DmaRegion region{.virt = nullptr, .phys = 0x1000, .size = 4096};
34 EXPECT_FALSE(region.IsValid());
35}
36
37TEST(DmaRegionTest, ZeroSizeIsInvalid) {
38 uint8_t buf[1]{};
39 DmaRegion region{.virt = buf, .phys = 0x1000, .size = 0};
40 EXPECT_FALSE(region.IsValid());
41}
42
43TEST(DmaRegionTest, SubRegionSuccess) {
44 uint8_t buf[4096]{};
45 DmaRegion region{
46 .virt = buf,
47 .phys = 0x1'0000,
48 .size = 4096,
49 };
50
51 auto sub = region.SubRegion(256, 512);
52 ASSERT_TRUE(sub.has_value());
53 EXPECT_EQ(sub->virt, buf + 256);
54 EXPECT_EQ(sub->phys, 0x1'0000u + 256);
55 EXPECT_EQ(sub->size, 512u);
56 EXPECT_TRUE(sub->IsValid());
57}
58
59TEST(DmaRegionTest, SubRegionOutOfBoundsFails) {
60 uint8_t buf[256]{};
61 DmaRegion region{.virt = buf, .phys = 0x1000, .size = 256};
62
63 auto sub = region.SubRegion(200, 100); // 200 + 100 > 256
64 EXPECT_FALSE(sub.has_value());
65 EXPECT_EQ(sub.error().code, ErrorCode::kInvalidArgument);
66}
67
68TEST(DmaRegionTest, SubRegionExactBoundarySucceeds) {
69 uint8_t buf[256]{};
70 DmaRegion region{.virt = buf, .phys = 0x1000, .size = 256};
71
72 auto sub = region.SubRegion(0, 256); // exact fit
73 ASSERT_TRUE(sub.has_value());
74 EXPECT_EQ(sub->size, 256u);
75}
76
77TEST(DmaRegionTest, IdentityVirtToPhys) {
78 uintptr_t addr = 0xDEAD'BEEF;
79 EXPECT_EQ(IdentityVirtToPhys(addr), addr);
80}
TEST(DmaRegionTest, DefaultConstructedIsInvalid)
@ kInvalidArgument
auto IdentityVirtToPhys(uintptr_t virt) -> uintptr_t
恒等映射:物理地址 == 虚拟地址(早期启动 / 无 MMU 时的默认实现)
Definition io_buffer.hpp:25
DMA 可访问内存区域的非拥有描述符
Definition io_buffer.hpp:37
void * virt
虚拟(CPU 可访问)基地址
Definition io_buffer.hpp:39
#define EXPECT_TRUE(cond, msg)
#define EXPECT_FALSE(cond, msg)
#define EXPECT_EQ(val1, val2, msg)