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