Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | /* * Copyright (c) 2018 Intel Corporation * * SPDX-License-Identifier: Apache-2.0 */ #include <ztest.h> #include <sys/mempool.h> #define BLK_SIZE_MIN 256 #define BLK_SIZE_MAX 1024 #define BLK_NUM_MAX 8 #define TOTAL_POOL_SIZE (BLK_SIZE_MAX * BLK_NUM_MAX) #define TOTAL_MIN_BLKS (TOTAL_POOL_SIZE / BLK_SIZE_MIN) #define DESC_SIZE sizeof(struct sys_mem_pool_block) #define BLK_SIZE_EXCLUDE_DESC (BLK_SIZE_MIN - 16) #define BLK_ALIGN BLK_SIZE_MIN SYS_MEM_POOL_DEFINE(pool, NULL, BLK_SIZE_MIN, BLK_SIZE_MAX, BLK_NUM_MAX, BLK_ALIGN, ZTEST_SECTION); /** * @brief Verify sys_mem_pool allocation and free * * @ingroup kernel_memory_pool_tests * * @see sys_mem_pool_alloc(), sys_mem_pool_free() */ void test_sys_mem_pool_alloc_free(void) { void *block[BLK_NUM_MAX], *block_fail; for (int i = 0; i < BLK_NUM_MAX; i++) { /* Allocate the largest possible blocks in the pool, using up * the entire thing. */ block[i] = sys_mem_pool_alloc(&pool, BLK_SIZE_MAX - DESC_SIZE); /** TESTPOINT: Address of the allocated memory if successful;*/ zassert_not_null(block[i], NULL); } block_fail = sys_mem_pool_alloc(&pool, BLK_SIZE_MIN); /** TESTPOINT: Return NULL if fail.*/ zassert_is_null(block_fail, NULL); for (int i = 0; i < BLK_NUM_MAX; i++) { /** * TESTPOINT: This routine provides traditional free() * semantics. The memory being returned must have been allocated * from the heap memory pool. */ sys_mem_pool_free(block[i]); } /** TESTPOINT: If ptr is NULL, no operation is performed.*/ sys_mem_pool_free(NULL); } /** * @brief Verify sys_mem_pool aligned allocation. * * @see sys_mem_pool_alloc(), sys_mem_pool_free() * * @ingroup kernel_memory_pool_tests */ void test_sys_mem_pool_alloc_align4(void) { void *block[BLK_NUM_MAX]; /** * TESTPOINT: The address of the allocated chunk is guaranteed to be * aligned on a word boundary (4 or 8 bytes). */ for (int i = 0; i < BLK_NUM_MAX; i++) { block[i] = sys_mem_pool_alloc(&pool, i); zassert_not_null(block[i], NULL); zassert_false((uintptr_t)block[i] % sizeof(void *), NULL); } /* test case tear down*/ for (int i = 0; i < BLK_NUM_MAX; i++) { sys_mem_pool_free(block[i]); } } /** * @brief Verify allocation of minimum block size which * is 64 bytes * * @ingroup kernel_memory_pool_tests * * @see sys_mem_pool_alloc(), sys_mem_pool_free() */ void test_sys_mem_pool_min_block_size(void) { void *block[TOTAL_MIN_BLKS], *block_fail; /** * TESTPOINT: The heap memory pool also defines a minimum block * size of 64 bytes. * Test steps: * initial memory heap status (F for free, U for used): * 64F, 64F, 64F, 64F * 1. request 4 blocks: each 0-byte plus 16-byte block desc, * indeed 64-byte allocated * 2. verify no more free blocks, any further allocation failed */ for (int i = 0; i < TOTAL_MIN_BLKS; i++) { block[i] = sys_mem_pool_alloc(&pool, 0); zassert_not_null(block[i], NULL); } /* verify no more free blocks available*/ block_fail = sys_mem_pool_alloc(&pool, BLK_SIZE_MIN); zassert_is_null(block_fail, NULL); /* test case tear down*/ for (int i = 0; i < BLK_NUM_MAX; i++) { sys_mem_pool_free(block[i]); } } /*test case main entry*/ void test_main(void) { sys_mem_pool_init(&pool); ztest_test_suite(test_sys_mem_pool_api, ztest_user_unit_test(test_sys_mem_pool_alloc_free), ztest_user_unit_test(test_sys_mem_pool_alloc_align4), ztest_user_unit_test(test_sys_mem_pool_min_block_size) ); ztest_run_test_suite(test_sys_mem_pool_api); } |