1111#include " lib/e2/common/e2ap_asn1_packer.h"
1212#include " lib/e2/e2sm/e2sm_kpm/e2sm_kpm_du_meas_provider_impl.h"
1313#include " tests/unittests/e2/common/e2_test_helpers.h"
14+ #include " srsran/support/executors/task_worker.h"
1415#include " srsran/support/srsran_test.h"
1516#include < gtest/gtest.h>
1617
1718using namespace srsran ;
1819
19- #define PCAP_OUTPUT 0
20-
21- #if PCAP_OUTPUT
22- std::unique_ptr<dlt_pcap> g_pcap = std::make_unique<dlt_pcap_impl>(PCAP_E2AP_DLT, " E2AP" );
23-
24- inline void save_msg_pcap (const byte_buffer& last_pdu)
25- {
26- if (not g_pcap->is_write_enabled ()) {
27- g_pcap->open (" e2sm_kpm_meas_provider.pcap" );
28- }
29- g_pcap->push_pdu (last_pdu.copy ());
30- usleep (200 );
31- }
32- #endif
20+ // Helper global variables to pass pcap_writer to all tests.
21+ bool g_enable_pcap = false ;
22+ dlt_pcap* g_pcap = nullptr ;
3323
3424class e2_rlc_metrics_notifier : public e2_du_metrics_notifier , public e2_du_metrics_interface
3525{
@@ -56,10 +46,59 @@ class e2_rlc_metrics_notifier : public e2_du_metrics_notifier, public e2_du_metr
5646 e2_du_metrics_notifier* e2_meas_provider;
5747};
5848
59- class e2sm_kpm_meas_provider_test : public ::testing::Test
49+ class e2_entity_test_with_pcap : public e2_test_base_with_pcap
6050{
51+ protected:
52+ dlt_pcap* external_pcap_writer;
53+
6154 void SetUp () override
6255 {
56+ external_pcap_writer = GetParam ();
57+
58+ srslog::fetch_basic_logger (" TEST" ).set_level (srslog::basic_levels::debug);
59+ srslog::init ();
60+
61+ cfg = config_helpers::make_default_e2ap_config ();
62+ cfg.e2sm_kpm_enabled = true ;
63+
64+ gw = std::make_unique<dummy_network_gateway_data_handler>();
65+ pcap = std::make_unique<dummy_e2ap_pcap>();
66+ if (external_pcap_writer) {
67+ packer = std::make_unique<srsran::e2ap_asn1_packer>(*gw, *e2 , *external_pcap_writer);
68+ } else {
69+ packer = std::make_unique<srsran::e2ap_asn1_packer>(*gw, *e2 , *pcap);
70+ }
71+ e2_client = std::make_unique<dummy_e2_connection_client>();
72+ du_metrics = std::make_unique<dummy_e2_du_metrics>();
73+ f1ap_ue_id_mapper = std::make_unique<dummy_f1ap_ue_id_translator>();
74+ factory = timer_factory{timers, task_worker};
75+ rc_param_configurator = std::make_unique<dummy_du_configurator>();
76+ e2 = create_e2_du_entity (cfg,
77+ e2_client.get (),
78+ du_metrics.get (),
79+ f1ap_ue_id_mapper.get (),
80+ rc_param_configurator.get (),
81+ factory,
82+ task_worker);
83+ }
84+
85+ void TearDown () override
86+ {
87+ // flush logger after each test
88+ srslog::flush ();
89+ pcap->close ();
90+ }
91+ };
92+
93+ class e2sm_kpm_meas_provider_test : public testing ::TestWithParam<dlt_pcap*>
94+ {
95+ protected:
96+ dlt_pcap* external_pcap_writer;
97+
98+ void SetUp () override
99+ {
100+ external_pcap_writer = GetParam ();
101+
63102 srslog::fetch_basic_logger (" TEST" ).set_level (srslog::basic_levels::debug);
64103 srslog::init ();
65104
@@ -73,8 +112,11 @@ class e2sm_kpm_meas_provider_test : public ::testing::Test
73112 e2sm_iface = std::make_unique<e2sm_kpm_impl>(test_logger, *e2sm_packer, *du_meas_provider);
74113 gw = std::make_unique<dummy_network_gateway_data_handler>();
75114 pcap = std::make_unique<dummy_e2ap_pcap>();
76- packer = std::make_unique<srsran::e2ap_asn1_packer>(*gw, *e2 , *pcap);
77-
115+ if (external_pcap_writer) {
116+ packer = std::make_unique<srsran::e2ap_asn1_packer>(*gw, *e2 , *external_pcap_writer);
117+ } else {
118+ packer = std::make_unique<srsran::e2ap_asn1_packer>(*gw, *e2 , *pcap);
119+ }
78120 du_metrics->connect_e2_du_meas_provider (du_meas_provider.get ());
79121 }
80122
@@ -174,30 +216,27 @@ scheduler_cell_metrics generate_sched_metrics(uint32_t
174216 return sched_metric;
175217}
176218
177- # if PCAP_OUTPUT
178- TEST_F (e2_entity_test , e2sm_kpm_generates_ran_func_desc)
219+ // E2 Setup Request is needed for Wireshark to correctly decode the subsequent Subscription Requests
220+ TEST_P (e2_entity_test_with_pcap , e2sm_kpm_generates_ran_func_desc)
179221{
180- dummy_e2_pdu_notifier* dummy_msg_notifier = e2_client->get_e2_msg_notifier ();
181222 // We need this test to generate E2 Setup Request, so Wireshark can decode the following RIC indication messages.
182223 test_logger.info (" Launch e2 setup request procedure with task worker..." );
183224 e2 ->start ();
184225
185- save_msg_pcap (gw->last_pdu );
186-
187226 // Need to send setup response, so the transaction can be completed.
188- unsigned transaction_id = get_transaction_id (dummy_msg_notifier-> last_e2_msg .pdu ).value ();
227+ unsigned transaction_id = get_transaction_id (e2_client-> last_tx_e2_pdu .pdu ).value ();
189228 e2_message e2_setup_response = generate_e2_setup_response (transaction_id);
190229 e2_setup_response.pdu .successful_outcome ()
191230 .value .e2setup_resp ()
192- ->ran_functions_accepted . value [0 ]
231+ ->ran_functions_accepted [0 ]
193232 ->ran_function_id_item ()
194233 .ran_function_id = e2sm_kpm_asn1_packer::ran_func_id;
195234 test_logger.info (" Injecting E2SetupResponse" );
196235 e2 ->handle_message (e2_setup_response);
236+ e2 ->stop ();
197237}
198- #endif
199238
200- TEST_F (e2sm_kpm_meas_provider_test, e2sm_kpm_ind_three_drb_rlc_metrics)
239+ TEST_P (e2sm_kpm_meas_provider_test, e2sm_kpm_ind_three_drb_rlc_metrics)
201240{
202241 std::vector<uint32_t > ue_ids = {31 , 23 , 152 };
203242 std::vector<uint32_t > nof_drbs = {3 , 1 , 2 };
@@ -255,12 +294,11 @@ TEST_F(e2sm_kpm_meas_provider_test, e2sm_kpm_ind_three_drb_rlc_metrics)
255294
256295 asn1::e2ap::ric_action_to_be_setup_item_s ric_action = generate_e2sm_kpm_ric_action (action_def);
257296
258- #if PCAP_OUTPUT
259- // Save E2 Subscription Request.
260- e2_message e2_subscript_req = generate_e2sm_kpm_subscription_request (ric_action);
261- packer->handle_message (e2_subscript_req);
262- save_msg_pcap (gw->last_pdu );
263- #endif
297+ if (g_enable_pcap) {
298+ // Save E2 Subscription Request.
299+ e2_message e2_subscript_req = generate_e2sm_kpm_subscription_request (ric_action);
300+ packer->handle_message (e2_subscript_req);
301+ }
264302
265303 ASSERT_TRUE (e2sm_iface->action_supported (ric_action));
266304 auto report_service = e2sm_iface->get_e2sm_report_service (ric_action.ric_action_definition );
@@ -321,14 +359,14 @@ TEST_F(e2sm_kpm_meas_provider_test, e2sm_kpm_ind_three_drb_rlc_metrics)
321359 }
322360 }
323361 }
324- # if PCAP_OUTPUT
325- e2_message e2_msg = generate_e2_ind_msg (ind_hdr_bytes, ind_msg_bytes);
326- packer-> handle_message ( e2_msg);
327- save_msg_pcap (gw-> last_pdu );
328- # endif
362+
363+ if (g_enable_pcap) {
364+ e2_message e2_msg = generate_e2_ind_msg (ind_hdr_bytes, ind_msg_bytes );
365+ packer-> handle_message (e2_msg );
366+ }
329367}
330368
331- TEST_F (e2sm_kpm_meas_provider_test, e2sm_kpm_ind_e2_level_rlc_metrics)
369+ TEST_P (e2sm_kpm_meas_provider_test, e2sm_kpm_ind_e2_level_rlc_metrics)
332370{
333371 std::vector<uint32_t > ue_ids = {31 , 23 , 152 };
334372 std::vector<uint32_t > nof_drbs = {3 , 1 , 2 };
@@ -367,12 +405,11 @@ TEST_F(e2sm_kpm_meas_provider_test, e2sm_kpm_ind_e2_level_rlc_metrics)
367405
368406 asn1::e2ap::ric_action_to_be_setup_item_s ric_action = generate_e2sm_kpm_ric_action (action_def);
369407
370- #if PCAP_OUTPUT
371- // Save E2 Subscription Request.
372- e2_message e2_subscript_req = generate_e2sm_kpm_subscription_request (ric_action);
373- packer->handle_message (e2_subscript_req);
374- save_msg_pcap (gw->last_pdu );
375- #endif
408+ if (g_enable_pcap) {
409+ // Save E2 Subscription Request.
410+ e2_message e2_subscript_req = generate_e2sm_kpm_subscription_request (ric_action);
411+ packer->handle_message (e2_subscript_req);
412+ }
376413
377414 ASSERT_TRUE (e2sm_iface->action_supported (ric_action));
378415 auto report_service = e2sm_iface->get_e2sm_report_service (ric_action.ric_action_definition );
@@ -413,14 +450,13 @@ TEST_F(e2sm_kpm_meas_provider_test, e2sm_kpm_ind_e2_level_rlc_metrics)
413450 TESTASSERT_EQ ((i + 1 ) * expected_ul_vol, meas_record[2 ].integer ());
414451 }
415452
416- #if PCAP_OUTPUT
417- e2_message e2_msg = generate_e2_ind_msg (ind_hdr_bytes, ind_msg_bytes);
418- packer->handle_message (e2_msg);
419- save_msg_pcap (gw->last_pdu );
420- #endif
453+ if (g_enable_pcap) {
454+ e2_message e2_msg = generate_e2_ind_msg (ind_hdr_bytes, ind_msg_bytes);
455+ packer->handle_message (e2_msg);
456+ }
421457}
422458
423- TEST_F (e2sm_kpm_meas_provider_test, e2sm_kpm_ind_e2_level_prb_metrics)
459+ TEST_P (e2sm_kpm_meas_provider_test, e2sm_kpm_ind_e2_level_prb_metrics)
424460{
425461 std::vector<uint32_t > grants_ue0 = {1 , 0 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 };
426462 std::vector<uint32_t > grants_ue1 = {0 , 0 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 };
@@ -479,12 +515,11 @@ TEST_F(e2sm_kpm_meas_provider_test, e2sm_kpm_ind_e2_level_prb_metrics)
479515
480516 asn1::e2ap::ric_action_to_be_setup_item_s ric_action = generate_e2sm_kpm_ric_action (action_def);
481517
482- #if PCAP_OUTPUT
483- // Save E2 Subscription Request.
484- e2_message e2_subscript_req = generate_e2sm_kpm_subscription_request (ric_action);
485- packer->handle_message (e2_subscript_req);
486- save_msg_pcap (gw->last_pdu );
487- #endif
518+ if (g_enable_pcap) {
519+ // Save E2 Subscription Request.
520+ e2_message e2_subscript_req = generate_e2sm_kpm_subscription_request (ric_action);
521+ packer->handle_message (e2_subscript_req);
522+ }
488523
489524 ASSERT_TRUE (e2sm_iface->action_supported (ric_action));
490525 auto report_service = e2sm_iface->get_e2sm_report_service (ric_action.ric_action_definition );
@@ -520,9 +555,39 @@ TEST_F(e2sm_kpm_meas_provider_test, e2sm_kpm_ind_e2_level_prb_metrics)
520555 TESTASSERT_EQ (expected_dl_tot_prbs, meas_record[4 ].integer ());
521556 TESTASSERT_EQ (expected_ul_tot_prbs, meas_record[5 ].integer ());
522557
523- #if PCAP_OUTPUT
524- e2_message e2_msg = generate_e2_ind_msg (ind_hdr_bytes, ind_msg_bytes);
525- packer->handle_message (e2_msg);
526- save_msg_pcap (gw->last_pdu );
527- #endif
558+ if (g_enable_pcap) {
559+ e2_message e2_msg = generate_e2_ind_msg (ind_hdr_bytes, ind_msg_bytes);
560+ packer->handle_message (e2_msg);
561+ }
562+ }
563+
564+ INSTANTIATE_TEST_SUITE_P (e2sm_kpm_tests, e2_entity_test_with_pcap, testing::Values(g_pcap));
565+ INSTANTIATE_TEST_SUITE_P (e2sm_kpm_meas_provider_test, e2sm_kpm_meas_provider_test, testing::Values(g_pcap));
566+
567+ int main (int argc, char ** argv)
568+ {
569+ // Check for '--enable_pcap' cmd line argument, do not use getopt as it interferes with gtest.
570+ for (int i = 1 ; i < argc; ++i) {
571+ std::string arg = argv[i];
572+ if (arg == " --enable_pcap" ) {
573+ g_enable_pcap = true ;
574+ }
575+ }
576+
577+ srslog::init ();
578+
579+ std::unique_ptr<task_worker_executor> pcap_exec;
580+ std::unique_ptr<task_worker> pcap_worker;
581+ std::unique_ptr<dlt_pcap> common_pcap_writer;
582+
583+ if (g_enable_pcap) {
584+ pcap_worker = std::make_unique<task_worker>(" pcap_worker" , 128 );
585+ pcap_exec = std::make_unique<task_worker_executor>(*pcap_worker);
586+ common_pcap_writer = create_e2ap_pcap (" /tmp/e2sm_kpm_meas_provider_test.pcap" , *pcap_exec);
587+ g_pcap = common_pcap_writer.get ();
588+ }
589+
590+ ::testing::InitGoogleTest (&argc, argv);
591+ int ret = RUN_ALL_TESTS ();
592+ return ret;
528593}
0 commit comments