1 /*
2 * Copyright (c) 2006-2023, RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date Author Notes
8 * 2023-03-23 WangXiaoyao Complete testcase for internal APIs
9 */
10 #ifndef __TEST_BST_ADPT_H__
11 #define __TEST_BST_ADPT_H__
12
13 #include "common.h"
14
15 #ifdef RT_USING_SMART
16 #include "lwp_user_mm.h"
17 #include "mm_aspace.h"
18 #include "mm_flag.h"
19 #include <mm_private.h>
20 #include <lwp_pid.h>
21
test_bst_adpt(void)22 void test_bst_adpt(void)
23 {
24 size_t flags = MMF_MAP_FIXED;
25 void *target_va = (void *)USER_VADDR_START + 0x3000;
26 size_t map_size = 0x1000;
27 void *prev_va = target_va - map_size;
28 void *next_va = target_va + map_size + 1;
29 struct rt_lwp *lwp;
30 rt_aspace_t aspace;
31 rt_mem_obj_t mem_obj;
32
33 /* create aspace by lwp */
34 lwp = lwp_create(LWP_CREATE_FLAG_NONE);
35 uassert_true(!!lwp);
36 uassert_true(!lwp_user_space_init(lwp, 0));
37 aspace = lwp->aspace;
38 mem_obj = &rt_mm_dummy_mapper;
39 uassert_true(!!aspace);
40 uassert_true(!!mem_obj);
41
42 /* _aspace_bst_search not cover */
43 uassert_true(!_aspace_bst_search(aspace, target_va)); // ret == NULL
44
45 uassert_true(
46 !rt_aspace_map(aspace, &target_va, map_size, MMU_MAP_K_RWCB, flags, mem_obj, 0));
47 /* 2 wrappers */
48 uassert_true(
49 !rt_aspace_map(aspace, &prev_va, map_size, MMU_MAP_K_RWCB, flags, mem_obj, 0));
50 uassert_true(
51 !rt_aspace_map(aspace, &next_va, map_size, MMU_MAP_K_RWCB, flags, mem_obj, 0));
52
53 /* _aspace_bst_search */
54 uassert_true(!!_aspace_bst_search(aspace, target_va));
55 uassert_true(!_aspace_bst_search(aspace, target_va + map_size));
56 uassert_true(!_aspace_bst_search(aspace, target_va - 1));
57
58 /**
59 * @brief _aspace_bst_search_exceed
60 * for given map [start, end]
61 */
62 rt_varea_t find;
63 find = _aspace_bst_search_exceed(aspace, target_va);
64 uassert_true(!!find);
65 uassert_true(find->start == target_va);
66
67 rt_varea_t last = ASPACE_VAREA_LAST(aspace);
68 find = _aspace_bst_search_exceed(aspace, last->start + 1);
69 uassert_true(!find);
70
71 /**
72 * @brief _aspace_bst_search_overlap
73 * for given map [start, end], five types of overlapping
74 */
75 /* 1. all below */
76 struct _mm_range range = {.start = prev_va - 2, .end = prev_va - 1};
77 find = _aspace_bst_search_overlap(aspace, range);
78 uassert_true(!find);
79 /* 2. start below */
80 range.end = prev_va;
81 find = _aspace_bst_search_overlap(aspace, range);
82 uassert_true(!!find);
83 uassert_true(find->start == prev_va);
84 /* 3. all wrapped */
85 range.start = prev_va;
86 range.end = prev_va + 1;
87 find = _aspace_bst_search_overlap(aspace, range);
88 uassert_true(!!find);
89 uassert_true(find->start == prev_va);
90 /* 4. end exceed */
91 range.start = next_va;
92 range.end = next_va + map_size + 1;
93 find = _aspace_bst_search_overlap(aspace, range);
94 uassert_true(!!find);
95 uassert_true(find->start == next_va);
96 /* 5. all exceed */
97 range.start = next_va + map_size;
98 find = _aspace_bst_search_overlap(aspace, range);
99 uassert_true(!find);
100
101 lwp_ref_dec(lwp);
102 }
103
104 #endif /* RT_USING_SMART */
105
106 #endif /* __TEST_BST_ADPT_H__ */
107