950756743d0278d5b716c3b6617ad193e692c1f2
[o-du/phy.git] / fhi_lib / test / test_xran / init_sys_functional.cc
1 /******************************************************************************\r
2 *\r
3 *   Copyright (c) 2019 Intel.\r
4 *\r
5 *   Licensed under the Apache License, Version 2.0 (the "License");\r
6 *   you may not use this file except in compliance with the License.\r
7 *   You may obtain a copy of the License at\r
8 *\r
9 *       http://www.apache.org/licenses/LICENSE-2.0\r
10 *\r
11 *   Unless required by applicable law or agreed to in writing, software\r
12 *   distributed under the License is distributed on an "AS IS" BASIS,\r
13 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
14 *   See the License for the specific language governing permissions and\r
15 *   limitations under the License.\r
16 *\r
17 *******************************************************************************/\r
18 \r
19 \r
20 #include "common.hpp"\r
21 #include "xran_fh_o_du.h"\r
22 #include "xran_cp_api.h"\r
23 #include "xran_lib_wrap.hpp"\r
24 #include "xran_common.h"\r
25 #include "ethdi.h"\r
26 \r
27 #include <stdint.h>\r
28 #include <iostream>\r
29 #include <vector>\r
30 #include <string>\r
31 \r
32 \r
33 \r
34 using namespace std;\r
35 const std::string module_name = "init_sys_functional";\r
36 \r
37 extern enum xran_if_state xran_if_current_state;\r
38 \r
39 void physide_sym_call_back(void * param)\r
40 {\r
41     rte_pause();\r
42     return;\r
43 }\r
44 \r
45 int physide_dl_tti_call_back(void * param)\r
46 {\r
47     rte_pause();\r
48     return 0;\r
49 }\r
50 \r
51 int physide_ul_half_slot_call_back(void * param)\r
52 {\r
53     rte_pause();\r
54     return 0;\r
55 }\r
56 \r
57 int physide_ul_full_slot_call_back(void * param)\r
58 {\r
59     rte_pause();\r
60     return 0;\r
61 }\r
62 \r
63 void xran_fh_rx_callback(void *pCallbackTag, xran_status_t status)\r
64 {\r
65     rte_pause();\r
66     return;\r
67 }\r
68 \r
69 void xran_fh_rx_prach_callback(void *pCallbackTag, xran_status_t status)\r
70 {\r
71 \r
72     rte_pause();\r
73 }\r
74 \r
75 class Init_Sys_Check : public KernelTests\r
76 {\r
77 protected:\r
78 \r
79     void SetUp() override\r
80     {\r
81         xranlib->Init();\r
82         xranlib->Open(nullptr, nullptr, (void *)xran_fh_rx_callback, (void *)xran_fh_rx_prach_callback);\r
83     }\r
84 \r
85     /* It's called after an execution of the each test case.*/\r
86     void TearDown() override\r
87     {\r
88         xranlib->Close();\r
89         xranlib->Cleanup();\r
90     }\r
91 \r
92 public:\r
93 \r
94     BbuIoBufCtrlStruct sFrontHaulTxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];\r
95     BbuIoBufCtrlStruct sFrontHaulTxPrbMapBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];\r
96     BbuIoBufCtrlStruct sFrontHaulRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];\r
97     BbuIoBufCtrlStruct sFrontHaulRxPrbMapBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];\r
98     BbuIoBufCtrlStruct sFHPrachRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];\r
99 \r
100     /* buffers lists */\r
101     struct xran_flat_buffer sFrontHaulTxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT];\r
102     struct xran_flat_buffer sFrontHaulTxPrbMapBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];\r
103     struct xran_flat_buffer sFrontHaulRxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT];\r
104     struct xran_flat_buffer sFrontHaulRxPrbMapBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];\r
105     struct xran_flat_buffer sFHPrachRxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT];\r
106 \r
107     void*    nInstanceHandle[XRAN_PORTS_NUM][XRAN_MAX_SECTOR_NR]; // instance per sector\r
108     uint32_t nBufPoolIndex[XRAN_MAX_SECTOR_NR][xranLibWraper::MAX_SW_XRAN_INTERFACE_NUM];\r
109     uint16_t nInstanceNum;\r
110 };\r
111 \r
112 TEST_P(Init_Sys_Check, Test_Open_Close)\r
113 {\r
114     struct xran_device_ctx * p_xran_dev_ctx = xran_dev_get_ctx();\r
115     /* check stat of lib */\r
116     ASSERT_EQ(1, p_xran_dev_ctx->enableCP);\r
117     ASSERT_EQ(1, p_xran_dev_ctx->xran2phy_mem_ready);\r
118 }\r
119 \r
120 TEST_P(Init_Sys_Check, Test_xran_mm_init)\r
121 {\r
122     int16_t ret = 0;\r
123     ret = xran_mm_init (xranlib->get_xranhandle(), (uint64_t) SW_FPGA_FH_TOTAL_BUFFER_LEN, SW_FPGA_SEGMENT_BUFFER_LEN);\r
124     ASSERT_EQ(0, ret);\r
125 }\r
126 \r
127 /* this case cannot be tested since memory cannot be initialized twice */\r
128 /* memory initialization is moved to the wrapper class */\r
129 #if 0\r
130 TEST_P(Init_Sys_Check, Test_xran_bm_init_alloc_free)\r
131 {\r
132     int16_t ret = 0;\r
133     void *ptr;\r
134     void *mb;\r
135     uint32_t nSW_ToFpga_FTH_TxBufferLen   = 13168; /* 273*12*4 + 64*/\r
136     int16_t k = 0;\r
137 \r
138 \r
139     struct xran_buffer_list *pFthTxBuffer[XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_N_FE_BUF_LEN];\r
140     struct xran_buffer_list *pFthTxPrbMapBuffer[XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_N_FE_BUF_LEN];\r
141     struct xran_buffer_list *pFthRxBuffer[XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_N_FE_BUF_LEN];\r
142     struct xran_buffer_list *pFthRxPrbMapBuffer[XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_N_FE_BUF_LEN];\r
143     struct xran_buffer_list *pFthRxRachBuffer[XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_N_FE_BUF_LEN];\r
144 \r
145     Init_Sys_Check::nInstanceNum = xranlib->get_num_cc();\r
146 \r
147     for (k = 0; k < XRAN_PORTS_NUM; k++) {\r
148         ret = xran_sector_get_instances (xranlib->get_xranhandle(), Init_Sys_Check::nInstanceNum, &(Init_Sys_Check::nInstanceHandle[k][0]));\r
149         ASSERT_EQ(0, ret);\r
150         ASSERT_EQ(1, Init_Sys_Check::nInstanceNum);\r
151     }\r
152 \r
153 \r
154     ret = xran_bm_init(Init_Sys_Check::nInstanceHandle[0][0],\r
155                     &Init_Sys_Check::nBufPoolIndex[0][0],\r
156                     XRAN_N_FE_BUF_LEN*XRAN_MAX_ANTENNA_NR*XRAN_NUM_OF_SYMBOL_PER_SLOT, nSW_ToFpga_FTH_TxBufferLen);\r
157     ASSERT_EQ(0, ret);\r
158 \r
159     ret = xran_bm_allocate_buffer(Init_Sys_Check::nInstanceHandle[0][0], Init_Sys_Check::nBufPoolIndex[0][0],&ptr, &mb);\r
160     ASSERT_EQ(0, ret);\r
161     ASSERT_NE(ptr, nullptr);\r
162     ASSERT_NE(mb, nullptr);\r
163 \r
164     ret = xran_bm_free_buffer(Init_Sys_Check::nInstanceHandle[0][0], ptr, mb);\r
165     ASSERT_EQ(0, ret);\r
166 \r
167 \r
168 \r
169     for(int i=0; i< xranlib->get_num_cc(); i++)\r
170     {\r
171         for(int j=0; j<XRAN_N_FE_BUF_LEN; j++)\r
172         {\r
173             for(int z = 0; z < XRAN_MAX_ANTENNA_NR; z++){\r
174                 pFthTxBuffer[i][z][j]     = &(Init_Sys_Check::sFrontHaulTxBbuIoBufCtrl[j][i][z].sBufferList);\r
175                 pFthTxPrbMapBuffer[i][z][j]     = &(Init_Sys_Check::sFrontHaulTxPrbMapBbuIoBufCtrl[j][i][z].sBufferList);\r
176                 pFthRxBuffer[i][z][j]     = &(Init_Sys_Check::sFrontHaulRxBbuIoBufCtrl[j][i][z].sBufferList);\r
177                 pFthRxPrbMapBuffer[i][z][j]     = &(Init_Sys_Check::sFrontHaulRxPrbMapBbuIoBufCtrl[j][i][z].sBufferList);\r
178                 pFthRxRachBuffer[i][z][j] = &(Init_Sys_Check::sFHPrachRxBbuIoBufCtrl[j][i][z].sBufferList);\r
179             }\r
180         }\r
181     }\r
182 \r
183     if(NULL != Init_Sys_Check::nInstanceHandle[0])\r
184     {\r
185         for (int i = 0; i < xranlib->get_num_cc(); i++)\r
186         {\r
187             ret = xran_5g_fronthault_config (Init_Sys_Check::nInstanceHandle[0][i],\r
188                 pFthTxBuffer[i],\r
189                 pFthTxPrbMapBuffer[i],\r
190                 pFthRxBuffer[i],\r
191                 pFthRxPrbMapBuffer[i],\r
192                 xran_fh_rx_callback,  &pFthRxBuffer[i][0]);\r
193 \r
194             ASSERT_EQ(0, ret);\r
195         }\r
196 \r
197         // add prach callback here\r
198         for (int i = 0; i < xranlib->get_num_cc(); i++)\r
199         {\r
200             ret = xran_5g_prach_req(Init_Sys_Check::nInstanceHandle[0][i], pFthRxRachBuffer[i],\r
201                 xran_fh_rx_prach_callback,&pFthRxRachBuffer[i][0]);\r
202             ASSERT_EQ(0, ret);\r
203         }\r
204     }\r
205 \r
206 \r
207 }\r
208 #endif\r
209 \r
210 TEST_P(Init_Sys_Check, Test_xran_get_common_counters)\r
211 {\r
212     int16_t ret = 0;\r
213     struct xran_common_counters x_counters;\r
214 \r
215     ret = xran_get_common_counters(xranlib->get_xranhandle(), &x_counters);\r
216 \r
217     ASSERT_EQ(0, ret);\r
218     ASSERT_EQ(0, x_counters.Rx_on_time);\r
219     ASSERT_EQ(0, x_counters.Rx_early);\r
220     ASSERT_EQ(0, x_counters.Rx_late);\r
221     ASSERT_EQ(0, x_counters.Rx_corrupt);\r
222     ASSERT_EQ(0, x_counters.Rx_pkt_dupl);\r
223     ASSERT_EQ(0, x_counters.Total_msgs_rcvd);\r
224 }\r
225 \r
226 TEST_P(Init_Sys_Check, Test_xran_get_slot_idx)\r
227 {\r
228 #define NUM_OF_SUBFRAME_PER_FRAME 10\r
229     int32_t nNrOfSlotInSf = 1;\r
230     int32_t nSfIdx = -1;\r
231     uint32_t nFrameIdx;\r
232     uint32_t nSubframeIdx;\r
233     uint32_t nSlotIdx;\r
234     uint64_t nSecond;\r
235 \r
236     uint32_t nXranTime  = xran_get_slot_idx(&nFrameIdx, &nSubframeIdx, &nSlotIdx, &nSecond);\r
237     nSfIdx = nFrameIdx*NUM_OF_SUBFRAME_PER_FRAME*nNrOfSlotInSf\r
238         + nSubframeIdx*nNrOfSlotInSf\r
239         + nSlotIdx;\r
240 \r
241     ASSERT_EQ(0, nSfIdx);\r
242 }\r
243 \r
244 TEST_P(Init_Sys_Check, Test_xran_reg_physide_cb)\r
245 {\r
246     struct xran_device_ctx * p_xran_dev_ctx = xran_dev_get_ctx();\r
247     int16_t ret = 0;\r
248     ret = xran_reg_physide_cb(xranlib->get_xranhandle(), physide_dl_tti_call_back, NULL, 10, XRAN_CB_TTI);\r
249     ASSERT_EQ(0,ret);\r
250     ASSERT_EQ(physide_dl_tti_call_back, p_xran_dev_ctx->ttiCb[XRAN_CB_TTI]);\r
251     ASSERT_EQ(NULL, p_xran_dev_ctx->TtiCbParam[XRAN_CB_TTI]);\r
252     ASSERT_EQ(10, p_xran_dev_ctx->SkipTti[XRAN_CB_TTI]);\r
253 \r
254     ret = xran_reg_physide_cb(xranlib->get_xranhandle(), physide_ul_half_slot_call_back, NULL, 10, XRAN_CB_HALF_SLOT_RX);\r
255     ASSERT_EQ(0,ret);\r
256     ASSERT_EQ(physide_ul_half_slot_call_back, p_xran_dev_ctx->ttiCb[XRAN_CB_HALF_SLOT_RX]);\r
257     ASSERT_EQ(NULL, p_xran_dev_ctx->TtiCbParam[XRAN_CB_HALF_SLOT_RX]);\r
258     ASSERT_EQ(10, p_xran_dev_ctx->SkipTti[XRAN_CB_HALF_SLOT_RX]);\r
259 \r
260     ret = xran_reg_physide_cb(xranlib->get_xranhandle(), physide_ul_full_slot_call_back, NULL, 10, XRAN_CB_FULL_SLOT_RX);\r
261     ASSERT_EQ(0,ret);\r
262     ASSERT_EQ(physide_ul_full_slot_call_back, p_xran_dev_ctx->ttiCb[XRAN_CB_FULL_SLOT_RX]);\r
263     ASSERT_EQ(NULL, p_xran_dev_ctx->TtiCbParam[XRAN_CB_FULL_SLOT_RX]);\r
264     ASSERT_EQ(10, p_xran_dev_ctx->SkipTti[XRAN_CB_FULL_SLOT_RX]);\r
265 \r
266 }\r
267 \r
268 TEST_P(Init_Sys_Check, Test_xran_reg_sym_cb){\r
269     int16_t ret = 0;\r
270     ret = xran_reg_sym_cb(xranlib->get_xranhandle(),  physide_sym_call_back, NULL, 11, 0);\r
271     ASSERT_EQ(-1,ret);\r
272 }\r
273 \r
274 TEST_P(Init_Sys_Check, Test_xran_mm_destroy){\r
275     int16_t ret = 0;\r
276     ret = xran_mm_destroy(xranlib->get_xranhandle());\r
277     ASSERT_EQ(-1,ret);\r
278 }\r
279 \r
280 TEST_P(Init_Sys_Check, Test_xran_start_stop){\r
281     int16_t ret = 0;\r
282     ASSERT_EQ(XRAN_STOPPED, xran_if_current_state);\r
283     ret = xranlib->Start();\r
284     ASSERT_EQ(0,ret);\r
285     ASSERT_EQ(XRAN_RUNNING, xran_if_current_state);\r
286     ret = xranlib->Stop();\r
287     ASSERT_EQ(0,ret);\r
288     ASSERT_EQ(XRAN_STOPPED, xran_if_current_state);\r
289 }\r
290 \r
291 INSTANTIATE_TEST_CASE_P(UnitTest, Init_Sys_Check,\r
292                         testing::ValuesIn(get_sequence(Init_Sys_Check::get_number_of_cases("init_sys_functional"))));\r
293 \r
294 \r
295 \r