summaryrefslogtreecommitdiff
path: root/examples/utest/testcases/mm/test_bst_adpt.h
blob: e081a754bb541998551f63677ecc0ee50f4e7be6 (plain)
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
/*
 * Copyright (c) 2006-2023, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2023-03-23     WangXiaoyao  Complete testcase for internal APIs
 */
#ifndef __TEST_BST_ADPT_H__
#define __TEST_BST_ADPT_H__

#include "common.h"

#ifdef RT_USING_SMART
#include "lwp_user_mm.h"
#include "mm_aspace.h"
#include "mm_flag.h"
#include <mm_private.h>
#include <lwp_pid.h>

void test_bst_adpt(void)
{
    size_t flags = MMF_MAP_FIXED;
    void *target_va = (void *)USER_VADDR_START + 0x3000;
    size_t map_size = 0x1000;
    void *prev_va = target_va - map_size;
    void *next_va = target_va + map_size + 1;
    struct rt_lwp *lwp;
    rt_aspace_t aspace;
    rt_mem_obj_t mem_obj;

    /* create aspace by lwp */
    lwp = lwp_create(LWP_CREATE_FLAG_NONE);
    uassert_true(!!lwp);
    uassert_true(!lwp_user_space_init(lwp, 0));
    aspace = lwp->aspace;
    mem_obj = &rt_mm_dummy_mapper;
    uassert_true(!!aspace);
    uassert_true(!!mem_obj);

    /* _aspace_bst_search not cover */
    uassert_true(!_aspace_bst_search(aspace, target_va)); // ret == NULL

    uassert_true(
        !rt_aspace_map(aspace, &target_va, map_size, MMU_MAP_K_RWCB, flags, mem_obj, 0));
    /* 2 wrappers */
    uassert_true(
        !rt_aspace_map(aspace, &prev_va, map_size, MMU_MAP_K_RWCB, flags, mem_obj, 0));
    uassert_true(
        !rt_aspace_map(aspace, &next_va, map_size, MMU_MAP_K_RWCB, flags, mem_obj, 0));

    /* _aspace_bst_search */
    uassert_true(!!_aspace_bst_search(aspace, target_va));
    uassert_true(!_aspace_bst_search(aspace, target_va + map_size));
    uassert_true(!_aspace_bst_search(aspace, target_va - 1));

    /**
     * @brief _aspace_bst_search_exceed
     * for given map [start, end]
     */
    rt_varea_t find;
    find = _aspace_bst_search_exceed(aspace, target_va);
    uassert_true(!!find);
    uassert_true(find->start == target_va);

    rt_varea_t last = ASPACE_VAREA_LAST(aspace);
    find = _aspace_bst_search_exceed(aspace, last->start + 1);
    uassert_true(!find);

    /**
     * @brief _aspace_bst_search_overlap
     * for given map [start, end], five types of overlapping
     */
    /* 1. all below */
    struct _mm_range range = {.start = prev_va - 2, .end = prev_va - 1};
    find = _aspace_bst_search_overlap(aspace, range);
    uassert_true(!find);
    /* 2. start below */
    range.end = prev_va;
    find = _aspace_bst_search_overlap(aspace, range);
    uassert_true(!!find);
    uassert_true(find->start == prev_va);
    /* 3. all wrapped */
    range.start = prev_va;
    range.end = prev_va + 1;
    find = _aspace_bst_search_overlap(aspace, range);
    uassert_true(!!find);
    uassert_true(find->start == prev_va);
    /* 4. end exceed */
    range.start = next_va;
    range.end = next_va + map_size + 1;
    find = _aspace_bst_search_overlap(aspace, range);
    uassert_true(!!find);
    uassert_true(find->start == next_va);
    /* 5. all exceed */
    range.start = next_va + map_size;
    find = _aspace_bst_search_overlap(aspace, range);
    uassert_true(!find);

    lwp_ref_dec(lwp);
}

#endif /* RT_USING_SMART */

#endif /* __TEST_BST_ADPT_H__ */