Skip to content

Commit c427fad

Browse files
committed
mac: extend unit tests to check if the failure to create a UE in the scheduler is correctly handled by the MAC
1 parent 538e355 commit c427fad

File tree

5 files changed

+256
-164
lines changed

5 files changed

+256
-164
lines changed

tests/unittests/mac/CMakeLists.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@ set_directory_properties(PROPERTIES LABELS "mac")
1010

1111
include_directories(../../..)
1212

13-
add_library(mac_test_helpers mac_test_helpers.cpp)
13+
add_library(mac_test_helpers mac_test_helpers.cpp mac_ctrl_test_dummies.cpp)
1414
target_link_libraries(mac_test_helpers srsran_support srslog sched_config)
1515

1616
add_executable(mac_ue_create_test mac_ue_create_test.cpp)
17-
target_link_libraries(mac_ue_create_test srsran_mac srsran_pcap srsran_support srslog gtest gtest_main)
17+
target_link_libraries(mac_ue_create_test srsran_mac mac_test_helpers srsran_pcap srsran_support srslog gtest gtest_main)
1818
gtest_discover_tests(mac_ue_create_test)
1919

2020
add_executable(mac_ctrl_test mac_ctrl_test.cpp)
21-
target_link_libraries(mac_ctrl_test srsran_pcap srsran_support srslog rrc_nr_asn1 srsran_mac)
21+
target_link_libraries(mac_ctrl_test mac_test_helpers srsran_pcap srsran_support srslog rrc_nr_asn1 srsran_mac gtest gtest_main)
2222
add_test(mac_ctrl_test mac_ctrl_test)
2323

2424
add_executable(mac_ul_pdu_test mac_ul_pdu_test.cpp)

tests/unittests/mac/mac_ctrl_test.cpp

Lines changed: 53 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,26 @@
1111
#include "lib/mac/mac_ctrl/mac_controller.h"
1212
#include "lib/mac/rnti_manager.h"
1313
#include "mac_ctrl_test_dummies.h"
14-
#include "tests/unittests/mac/mac_test_helpers.h"
1514
#include "srsran/support/async/async_test_utils.h"
1615
#include "srsran/support/executors/manual_task_worker.h"
17-
#include "srsran/support/test_utils.h"
16+
#include <gtest/gtest.h>
1817

1918
using namespace srsran;
2019

21-
void test_mac_ctrl_ue_procedures()
20+
class mac_controller_test : public ::testing::Test
2221
{
23-
test_delimit_logger delimiter{"Test UE procedures"};
22+
protected:
23+
mac_controller_test()
24+
{
25+
srslog::fetch_basic_logger("MAC", true).set_level(srslog::basic_levels::debug);
26+
srslog::init();
27+
}
28+
29+
void start_ue_creation(mac_ue_create_request req)
30+
{
31+
t = mac_ctrl.handle_ue_create_request(req);
32+
t_launcher.emplace(t);
33+
}
2434

2535
manual_task_worker worker{128};
2636
dummy_ue_executor_mapper ul_exec_mapper{worker};
@@ -32,45 +42,54 @@ void test_mac_ctrl_ue_procedures()
3242
mac_scheduler_dummy_adapter sched_cfg_adapter;
3343
rnti_manager rnti_table;
3444

35-
mac_controller mac_ctrl(maccfg, ul_unit, dl_unit, rnti_table, sched_cfg_adapter);
45+
mac_controller mac_ctrl{maccfg, ul_unit, dl_unit, rnti_table, sched_cfg_adapter};
3646

47+
async_task<mac_ue_create_response> t;
48+
optional<lazy_task_launcher<mac_ue_create_response>> t_launcher;
49+
};
50+
51+
TEST_F(mac_controller_test, ue_procedures)
52+
{
3753
// Action 1: Create UE
38-
mac_ue_create_request ue_create_msg{};
39-
ue_create_msg.ue_index = to_du_ue_index(1);
40-
ue_create_msg.cell_index = to_du_cell_index(0);
41-
ue_create_msg.crnti = to_rnti(0x4601);
42-
async_task<mac_ue_create_response> t = mac_ctrl.handle_ue_create_request(ue_create_msg);
43-
lazy_task_launcher<mac_ue_create_response> t_launcher(t);
54+
mac_ue_create_request ue_create_msg{to_du_cell_index(0), to_du_ue_index(1), to_rnti(0x4601)};
55+
start_ue_creation(ue_create_msg);
4456

4557
// Status: UE creation started in MAC UL but not in MAC DL
46-
TESTASSERT(ul_unit.last_ue_create_request.has_value());
47-
TESTASSERT_EQ(ue_create_msg.ue_index, ul_unit.last_ue_create_request->ue_index);
48-
TESTASSERT_EQ(ue_create_msg.crnti, ul_unit.last_ue_create_request->crnti);
49-
TESTASSERT(not dl_unit.last_ue_create_request.has_value());
50-
TESTASSERT(not t.ready());
58+
ASSERT_TRUE(ul_unit.last_ue_create_request.has_value());
59+
ASSERT_EQ(ue_create_msg.ue_index, ul_unit.last_ue_create_request->ue_index);
60+
ASSERT_EQ(ue_create_msg.crnti, ul_unit.last_ue_create_request->crnti);
61+
ASSERT_FALSE(dl_unit.last_ue_create_request.has_value());
62+
ASSERT_FALSE(t.ready());
5163

5264
// Action 2: MAC UL UE Creation finishes
5365
ul_unit.expected_result = true;
5466
ul_unit.ue_created_ev.set();
5567

5668
// Status: MAC DL UE Creation starts
57-
TESTASSERT(dl_unit.last_ue_create_request.has_value());
58-
TESTASSERT_EQ(ue_create_msg.ue_index, dl_unit.last_ue_create_request->ue_index);
59-
TESTASSERT_EQ(ue_create_msg.crnti, dl_unit.last_ue_create_request->crnti);
60-
TESTASSERT(not t.ready());
69+
ASSERT_TRUE(dl_unit.last_ue_create_request.has_value());
70+
ASSERT_EQ(ue_create_msg.ue_index, dl_unit.last_ue_create_request->ue_index);
71+
ASSERT_EQ(ue_create_msg.crnti, dl_unit.last_ue_create_request->crnti);
72+
ASSERT_FALSE(t.ready());
6173

6274
// Action 3: MAC DL UE Creation finishes
6375
dl_unit.expected_result = true;
6476
dl_unit.ue_created_ev.set();
6577

78+
// Status: Scheduler UE Creation starts.
79+
ASSERT_TRUE(sched_cfg_adapter.last_ue_create_request.has_value());
80+
ASSERT_EQ(sched_cfg_adapter.last_ue_create_request->ue_index, ue_create_msg.ue_index);
81+
ASSERT_FALSE(t.ready());
82+
83+
// Action 4: Scheduler UE Creation finishes
84+
sched_cfg_adapter.ue_created_ev.set(true);
85+
6686
// Status: MAC DL UE Creation finished. MAC CTRL UE Creation finished as well.
67-
TESTASSERT(dl_unit.last_ue_create_request.has_value());
68-
TESTASSERT(t.ready());
69-
TESTASSERT_EQ(ue_create_msg.ue_index, t.get().ue_index);
70-
TESTASSERT_EQ(t.get().allocated_crnti, ue_create_msg.crnti);
71-
TESTASSERT(mac_ctrl.find_ue(ue_create_msg.ue_index) != nullptr);
72-
TESTASSERT(mac_ctrl.find_by_rnti(ue_create_msg.crnti) != nullptr);
73-
TESTASSERT_EQ(ue_create_msg.ue_index, mac_ctrl.find_ue(ue_create_msg.ue_index)->du_ue_index);
87+
ASSERT_TRUE(t.ready());
88+
ASSERT_EQ(ue_create_msg.ue_index, t.get().ue_index);
89+
ASSERT_EQ(t.get().allocated_crnti, ue_create_msg.crnti);
90+
ASSERT_TRUE(mac_ctrl.find_ue(ue_create_msg.ue_index) != nullptr);
91+
ASSERT_TRUE(mac_ctrl.find_by_rnti(ue_create_msg.crnti) != nullptr);
92+
ASSERT_EQ(ue_create_msg.ue_index, mac_ctrl.find_ue(ue_create_msg.ue_index)->du_ue_index);
7493

7594
// Action 4: Delete UE
7695
mac_ue_delete_request ue_delete_msg{};
@@ -81,20 +100,11 @@ void test_mac_ctrl_ue_procedures()
81100
lazy_task_launcher<mac_ue_delete_response> t_launcher2(t2);
82101

83102
// Status: UE deleted from MAC DL, UL and CTRL
84-
TESTASSERT(dl_unit.last_ue_delete_request.has_value());
85-
TESTASSERT_EQ(ue_delete_msg.ue_index, dl_unit.last_ue_create_request->ue_index);
86-
TESTASSERT(ul_unit.last_ue_delete_request.has_value());
87-
TESTASSERT_EQ(ue_delete_msg.ue_index, ul_unit.last_ue_create_request->ue_index);
88-
TESTASSERT(t2.ready());
89-
TESTASSERT(mac_ctrl.find_ue(ue_create_msg.ue_index) == nullptr);
90-
TESTASSERT(mac_ctrl.find_by_rnti(ue_create_msg.crnti) == nullptr);
91-
}
92-
93-
int main()
94-
{
95-
srslog::fetch_basic_logger("MAC", true).set_level(srslog::basic_levels::debug);
96-
97-
srslog::init();
98-
99-
test_mac_ctrl_ue_procedures();
103+
ASSERT_TRUE(dl_unit.last_ue_delete_request.has_value());
104+
ASSERT_EQ(ue_delete_msg.ue_index, dl_unit.last_ue_create_request->ue_index);
105+
ASSERT_TRUE(ul_unit.last_ue_delete_request.has_value());
106+
ASSERT_EQ(ue_delete_msg.ue_index, ul_unit.last_ue_create_request->ue_index);
107+
ASSERT_TRUE(t2.ready());
108+
ASSERT_TRUE(mac_ctrl.find_ue(ue_create_msg.ue_index) == nullptr);
109+
ASSERT_TRUE(mac_ctrl.find_by_rnti(ue_create_msg.crnti) == nullptr);
100110
}
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
/*
2+
*
3+
* Copyright 2021-2023 Software Radio Systems Limited
4+
*
5+
* By using this file, you agree to the terms and conditions set
6+
* forth in the LICENSE file which can be found at the top level of
7+
* the distribution.
8+
*
9+
*/
10+
11+
#include "mac_ctrl_test_dummies.h"
12+
13+
using namespace srsran;
14+
15+
async_task<bool> mac_ul_dummy_configurer::add_ue(const mac_ue_create_request& msg)
16+
{
17+
return launch_async([this, msg](coro_context<async_task<bool>>& ctx) {
18+
CORO_BEGIN(ctx);
19+
last_ue_create_request = msg;
20+
CORO_AWAIT(ue_created_ev);
21+
CORO_RETURN(expected_result);
22+
});
23+
}
24+
25+
async_task<bool>
26+
mac_ul_dummy_configurer::addmod_bearers(du_ue_index_t ue_index,
27+
const std::vector<mac_logical_channel_config>& ul_logical_channels)
28+
{
29+
return launch_async([this, ue_index, ul_logical_channels](coro_context<async_task<bool>>& ctx) {
30+
CORO_BEGIN(ctx);
31+
last_ue_bearers_added = std::make_pair(ue_index, ul_logical_channels);
32+
CORO_RETURN(true);
33+
});
34+
}
35+
36+
async_task<bool> mac_ul_dummy_configurer::remove_bearers(du_ue_index_t ue_index, span<const lcid_t> lcids_to_rem)
37+
{
38+
std::vector<lcid_t> lcids(lcids_to_rem.begin(), lcids_to_rem.end());
39+
return launch_async([this, ue_index, lcids](coro_context<async_task<bool>>& ctx) {
40+
CORO_BEGIN(ctx);
41+
last_ue_bearers_rem = std::make_pair(ue_index, lcids);
42+
CORO_RETURN(true);
43+
});
44+
}
45+
46+
async_task<void> mac_ul_dummy_configurer::remove_ue(const mac_ue_delete_request& msg)
47+
{
48+
return launch_async([this, msg](coro_context<async_task<void>>& ctx) {
49+
CORO_BEGIN(ctx);
50+
last_ue_delete_request = msg;
51+
CORO_RETURN();
52+
});
53+
}
54+
55+
async_task<void> mac_cell_dummy_controller::start()
56+
{
57+
return launch_async([](coro_context<async_task<void>>& ctx) {
58+
CORO_BEGIN(ctx);
59+
CORO_RETURN();
60+
});
61+
}
62+
63+
async_task<bool> mac_dl_dummy_configurer::add_ue(const mac_ue_create_request& msg)
64+
{
65+
return launch_async([this, msg](coro_context<async_task<bool>>& ctx) {
66+
CORO_BEGIN(ctx);
67+
last_ue_create_request = msg;
68+
CORO_AWAIT(ue_created_ev);
69+
CORO_RETURN(expected_result);
70+
});
71+
}
72+
async_task<void> mac_dl_dummy_configurer::remove_ue(const mac_ue_delete_request& msg)
73+
{
74+
return launch_async([this, msg](coro_context<async_task<void>>& ctx) {
75+
CORO_BEGIN(ctx);
76+
last_ue_delete_request = msg;
77+
CORO_RETURN();
78+
});
79+
}
80+
81+
async_task<bool>
82+
mac_dl_dummy_configurer::addmod_bearers(du_ue_index_t ue_index,
83+
du_cell_index_t pcell_index,
84+
const std::vector<mac_logical_channel_config>& logical_channels)
85+
{
86+
return launch_async([this, ue_index, logical_channels](coro_context<async_task<bool>>& ctx) {
87+
CORO_BEGIN(ctx);
88+
last_ue_bearers_added = std::make_pair(ue_index, logical_channels);
89+
CORO_RETURN(true);
90+
});
91+
}
92+
async_task<bool> mac_dl_dummy_configurer::remove_bearers(du_ue_index_t ue_index,
93+
du_cell_index_t pcell_index,
94+
span<const lcid_t> lcids_to_rem)
95+
{
96+
std::vector<lcid_t> lcids(lcids_to_rem.begin(), lcids_to_rem.end());
97+
return launch_async([this, ue_index, lcids](coro_context<async_task<bool>>& ctx) {
98+
CORO_BEGIN(ctx);
99+
last_ue_bearers_rem = std::make_pair(ue_index, lcids);
100+
CORO_RETURN(true);
101+
});
102+
}
103+
104+
async_task<bool> mac_scheduler_dummy_adapter::handle_ue_creation_request(const mac_ue_create_request& msg)
105+
{
106+
return launch_async([this, msg](coro_context<async_task<bool>>& ctx) {
107+
CORO_BEGIN(ctx);
108+
last_ue_create_request = msg;
109+
CORO_AWAIT_VALUE(bool result, ue_created_ev);
110+
CORO_RETURN(result);
111+
});
112+
}
113+
114+
async_task<bool>
115+
mac_scheduler_dummy_adapter::handle_ue_reconfiguration_request(const mac_ue_reconfiguration_request& msg)
116+
{
117+
return launch_async([](coro_context<async_task<bool>>& ctx) {
118+
CORO_BEGIN(ctx);
119+
CORO_RETURN(true);
120+
});
121+
}
122+
123+
async_task<bool> mac_scheduler_dummy_adapter::handle_ue_removal_request(const mac_ue_delete_request& msg)
124+
{
125+
return launch_async([](coro_context<async_task<bool>>& ctx) {
126+
CORO_BEGIN(ctx);
127+
CORO_RETURN(true);
128+
});
129+
}

0 commit comments

Comments
 (0)