#include "c_FixedPool.h" #include #include #include "c_Test.h" #include "c_Memory.h" /* ============================================================================== * 🧪 1. 测试静态“零堆分配”初始化与边界耗尽拦截 * ============================================================================== */ C_TEST_CASE(test_fixed_pool_zero_heap_allocation) { /* 1. 模拟在外部开辟一块 64 字节的纯裸静态缓冲区(预期能刚好容纳 2 个 32 字节网格) */ int static_buffer_size = 64; void* my_external_static_buffer = C_ALLOC(static_buffer_size); c_FixedPool_t pool; /* 🛠️ 核心调用:在初始化时直接绑定外部给定的裸空间,内部绝对不发生任何系统级 malloc */ c_err_t err = c_FixedPool_Init(&pool, 24, my_external_static_buffer, static_buffer_size); C_ASSERT_INT_EQ(err, C_SUCCESS, "静态内存池绑定初始化必须返回 C_OK"); C_ASSERT_INT_EQ(pool.objSize, 32, "对象尺寸自动向上休整为最大自然对齐边界(16字节倍数)"); /* 2. 连续分发出仅有的 2 个格子 */ void* node_1 = c_FixedPool_Alloc(&pool); void* node_2 = c_FixedPool_Alloc(&pool); C_ASSERT(node_1 != NULL && node_2 != NULL, "静态网格正常分配通过"); C_ASSERT_INT_EQ(pool.instanceCount, 2, "当前贷出活跃数为 2"); /* 3. 🚨 边界触碰:由于外部给的空间已用尽,且本池严禁私自动态扩容,再次 Alloc 必须安全返回 NULL */ void* overflow_node = c_FixedPool_Alloc(&pool); C_ASSERT(overflow_node == NULL, "静态内存池耗尽后,再次 Alloc 必须严格拦截并安全回传 NULL"); // 清理测试用的外部大模拟区 c_FixedPool_DryUp(&pool); c_FixedPool_Destroy(&pool); C_FREE(my_external_static_buffer); } /* ============================================================================== * 🧪 2. 测试中途外部喂入新页补充弹药 (c_FixedPool_AddBlock) * ============================================================================== */ C_TEST_CASE(test_fixed_pool_external_ammunition_supply) { /* 准备初始极微小外部缓冲区(仅容纳 1 个对象) */ int buf_size_1 = 32; void* ext_buf_1 = C_ALLOC(buf_size_1); c_FixedPool_t pool; c_FixedPool_Init(&pool, 32, ext_buf_1, buf_size_1); /* 掏空这仅有的一个额度 */ void* active_ptr = c_FixedPool_Alloc(&pool); C_ASSERT(active_ptr != NULL, "初始第一发额度分配成功"); C_ASSERT(c_FixedPool_Alloc(&pool) == NULL, "此时池子已瞬间干瘪"); /* 🛠️ 核心调用:外部在中途遇到短缺时,手动申请一块新静态大页,通过 AddBlock 喂给池子 */ int buf_size_2 = 96; /* 预期能额外提供 3 个全新格子 */ void* ext_buf_2 = C_ALLOC(buf_size_2); c_err_t add_err = c_FixedPool_AddBlock(&pool, ext_buf_2, buf_size_2); C_ASSERT_INT_EQ(add_err, C_ERR_OK, "手动注入新页弹药必须返回 C_OK"); /* 4. 再次检验:池子应当立刻恢复发牌能力,连续顺畅吐出 3 个新对象 */ void* extra_node_1 = c_FixedPool_Alloc(&pool); void* extra_node_2 = c_FixedPool_Alloc(&pool); void* extra_node_3 = c_FixedPool_Alloc(&pool); C_ASSERT(extra_node_1 != NULL && extra_node_2 != NULL && extra_node_3 != NULL, "补给新弹药后,FixedPool 必须成功复活"); C_ASSERT_INT_EQ(pool.instanceCount, 4, "当前总计贷出 4 个活跃对象"); /* 5. 验证 DryUp 强行重置计数 */ c_FixedPool_DryUp(&pool); C_ASSERT_INT_EQ(pool.instanceCount, 0, "执行 DryUp 后,贷出追踪计数必须瞬间斩断强制复位为 0"); /* 清理现场 */ // c_FixedPool_Free(&pool, extra_node_3); /* 侵入式回收依然畅通 */ // c_FixedPool_DryUp(&pool); c_FixedPool_Destroy(&pool); C_FREE(ext_buf_1); C_FREE(ext_buf_2); } /* ============================================================================== * 🚀 测试套件统一注册调度主函数 * ============================================================================== */ int main(int argc, char** argv){ C_TEST_SUITE_BEGIN(MemoryFixedPoolCoreTestSuite) C_RUN_TEST_CASE(test_fixed_pool_zero_heap_allocation); C_RUN_TEST_CASE(test_fixed_pool_external_ammunition_supply); C_TEST_SUITE_END() return 0; }