provide follow features implementation:
[o-du/phy.git] / fhi_lib / test / test_xran / init_sys_functional.cc
diff --git a/fhi_lib/test/test_xran/init_sys_functional.cc b/fhi_lib/test/test_xran/init_sys_functional.cc
new file mode 100644 (file)
index 0000000..9507567
--- /dev/null
@@ -0,0 +1,295 @@
+/******************************************************************************\r
+*\r
+*   Copyright (c) 2019 Intel.\r
+*\r
+*   Licensed under the Apache License, Version 2.0 (the "License");\r
+*   you may not use this file except in compliance with the License.\r
+*   You may obtain a copy of the License at\r
+*\r
+*       http://www.apache.org/licenses/LICENSE-2.0\r
+*\r
+*   Unless required by applicable law or agreed to in writing, software\r
+*   distributed under the License is distributed on an "AS IS" BASIS,\r
+*   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+*   See the License for the specific language governing permissions and\r
+*   limitations under the License.\r
+*\r
+*******************************************************************************/\r
+\r
+\r
+#include "common.hpp"\r
+#include "xran_fh_o_du.h"\r
+#include "xran_cp_api.h"\r
+#include "xran_lib_wrap.hpp"\r
+#include "xran_common.h"\r
+#include "ethdi.h"\r
+\r
+#include <stdint.h>\r
+#include <iostream>\r
+#include <vector>\r
+#include <string>\r
+\r
+\r
+\r
+using namespace std;\r
+const std::string module_name = "init_sys_functional";\r
+\r
+extern enum xran_if_state xran_if_current_state;\r
+\r
+void physide_sym_call_back(void * param)\r
+{\r
+    rte_pause();\r
+    return;\r
+}\r
+\r
+int physide_dl_tti_call_back(void * param)\r
+{\r
+    rte_pause();\r
+    return 0;\r
+}\r
+\r
+int physide_ul_half_slot_call_back(void * param)\r
+{\r
+    rte_pause();\r
+    return 0;\r
+}\r
+\r
+int physide_ul_full_slot_call_back(void * param)\r
+{\r
+    rte_pause();\r
+    return 0;\r
+}\r
+\r
+void xran_fh_rx_callback(void *pCallbackTag, xran_status_t status)\r
+{\r
+    rte_pause();\r
+    return;\r
+}\r
+\r
+void xran_fh_rx_prach_callback(void *pCallbackTag, xran_status_t status)\r
+{\r
+\r
+    rte_pause();\r
+}\r
+\r
+class Init_Sys_Check : public KernelTests\r
+{\r
+protected:\r
+\r
+    void SetUp() override\r
+    {\r
+        xranlib->Init();\r
+        xranlib->Open(nullptr, nullptr, (void *)xran_fh_rx_callback, (void *)xran_fh_rx_prach_callback);\r
+    }\r
+\r
+    /* It's called after an execution of the each test case.*/\r
+    void TearDown() override\r
+    {\r
+        xranlib->Close();\r
+        xranlib->Cleanup();\r
+    }\r
+\r
+public:\r
+\r
+    BbuIoBufCtrlStruct sFrontHaulTxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];\r
+    BbuIoBufCtrlStruct sFrontHaulTxPrbMapBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];\r
+    BbuIoBufCtrlStruct sFrontHaulRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];\r
+    BbuIoBufCtrlStruct sFrontHaulRxPrbMapBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];\r
+    BbuIoBufCtrlStruct sFHPrachRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];\r
+\r
+    /* buffers lists */\r
+    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
+    struct xran_flat_buffer sFrontHaulTxPrbMapBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];\r
+    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
+    struct xran_flat_buffer sFrontHaulRxPrbMapBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];\r
+    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
+\r
+    void*    nInstanceHandle[XRAN_PORTS_NUM][XRAN_MAX_SECTOR_NR]; // instance per sector\r
+    uint32_t nBufPoolIndex[XRAN_MAX_SECTOR_NR][xranLibWraper::MAX_SW_XRAN_INTERFACE_NUM];\r
+    uint16_t nInstanceNum;\r
+};\r
+\r
+TEST_P(Init_Sys_Check, Test_Open_Close)\r
+{\r
+    struct xran_device_ctx * p_xran_dev_ctx = xran_dev_get_ctx();\r
+    /* check stat of lib */\r
+    ASSERT_EQ(1, p_xran_dev_ctx->enableCP);\r
+    ASSERT_EQ(1, p_xran_dev_ctx->xran2phy_mem_ready);\r
+}\r
+\r
+TEST_P(Init_Sys_Check, Test_xran_mm_init)\r
+{\r
+    int16_t ret = 0;\r
+    ret = xran_mm_init (xranlib->get_xranhandle(), (uint64_t) SW_FPGA_FH_TOTAL_BUFFER_LEN, SW_FPGA_SEGMENT_BUFFER_LEN);\r
+    ASSERT_EQ(0, ret);\r
+}\r
+\r
+/* this case cannot be tested since memory cannot be initialized twice */\r
+/* memory initialization is moved to the wrapper class */\r
+#if 0\r
+TEST_P(Init_Sys_Check, Test_xran_bm_init_alloc_free)\r
+{\r
+    int16_t ret = 0;\r
+    void *ptr;\r
+    void *mb;\r
+    uint32_t nSW_ToFpga_FTH_TxBufferLen   = 13168; /* 273*12*4 + 64*/\r
+    int16_t k = 0;\r
+\r
+\r
+    struct xran_buffer_list *pFthTxBuffer[XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_N_FE_BUF_LEN];\r
+    struct xran_buffer_list *pFthTxPrbMapBuffer[XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_N_FE_BUF_LEN];\r
+    struct xran_buffer_list *pFthRxBuffer[XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_N_FE_BUF_LEN];\r
+    struct xran_buffer_list *pFthRxPrbMapBuffer[XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_N_FE_BUF_LEN];\r
+    struct xran_buffer_list *pFthRxRachBuffer[XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_N_FE_BUF_LEN];\r
+\r
+    Init_Sys_Check::nInstanceNum = xranlib->get_num_cc();\r
+\r
+    for (k = 0; k < XRAN_PORTS_NUM; k++) {\r
+        ret = xran_sector_get_instances (xranlib->get_xranhandle(), Init_Sys_Check::nInstanceNum, &(Init_Sys_Check::nInstanceHandle[k][0]));\r
+        ASSERT_EQ(0, ret);\r
+        ASSERT_EQ(1, Init_Sys_Check::nInstanceNum);\r
+    }\r
+\r
+\r
+    ret = xran_bm_init(Init_Sys_Check::nInstanceHandle[0][0],\r
+                    &Init_Sys_Check::nBufPoolIndex[0][0],\r
+                    XRAN_N_FE_BUF_LEN*XRAN_MAX_ANTENNA_NR*XRAN_NUM_OF_SYMBOL_PER_SLOT, nSW_ToFpga_FTH_TxBufferLen);\r
+    ASSERT_EQ(0, ret);\r
+\r
+    ret = xran_bm_allocate_buffer(Init_Sys_Check::nInstanceHandle[0][0], Init_Sys_Check::nBufPoolIndex[0][0],&ptr, &mb);\r
+    ASSERT_EQ(0, ret);\r
+    ASSERT_NE(ptr, nullptr);\r
+    ASSERT_NE(mb, nullptr);\r
+\r
+    ret = xran_bm_free_buffer(Init_Sys_Check::nInstanceHandle[0][0], ptr, mb);\r
+    ASSERT_EQ(0, ret);\r
+\r
+\r
+\r
+    for(int i=0; i< xranlib->get_num_cc(); i++)\r
+    {\r
+        for(int j=0; j<XRAN_N_FE_BUF_LEN; j++)\r
+        {\r
+            for(int z = 0; z < XRAN_MAX_ANTENNA_NR; z++){\r
+                pFthTxBuffer[i][z][j]     = &(Init_Sys_Check::sFrontHaulTxBbuIoBufCtrl[j][i][z].sBufferList);\r
+                pFthTxPrbMapBuffer[i][z][j]     = &(Init_Sys_Check::sFrontHaulTxPrbMapBbuIoBufCtrl[j][i][z].sBufferList);\r
+                pFthRxBuffer[i][z][j]     = &(Init_Sys_Check::sFrontHaulRxBbuIoBufCtrl[j][i][z].sBufferList);\r
+                pFthRxPrbMapBuffer[i][z][j]     = &(Init_Sys_Check::sFrontHaulRxPrbMapBbuIoBufCtrl[j][i][z].sBufferList);\r
+                pFthRxRachBuffer[i][z][j] = &(Init_Sys_Check::sFHPrachRxBbuIoBufCtrl[j][i][z].sBufferList);\r
+            }\r
+        }\r
+    }\r
+\r
+    if(NULL != Init_Sys_Check::nInstanceHandle[0])\r
+    {\r
+        for (int i = 0; i < xranlib->get_num_cc(); i++)\r
+        {\r
+            ret = xran_5g_fronthault_config (Init_Sys_Check::nInstanceHandle[0][i],\r
+                pFthTxBuffer[i],\r
+                pFthTxPrbMapBuffer[i],\r
+                pFthRxBuffer[i],\r
+                pFthRxPrbMapBuffer[i],\r
+                xran_fh_rx_callback,  &pFthRxBuffer[i][0]);\r
+\r
+            ASSERT_EQ(0, ret);\r
+        }\r
+\r
+        // add prach callback here\r
+        for (int i = 0; i < xranlib->get_num_cc(); i++)\r
+        {\r
+            ret = xran_5g_prach_req(Init_Sys_Check::nInstanceHandle[0][i], pFthRxRachBuffer[i],\r
+                xran_fh_rx_prach_callback,&pFthRxRachBuffer[i][0]);\r
+            ASSERT_EQ(0, ret);\r
+        }\r
+    }\r
+\r
+\r
+}\r
+#endif\r
+\r
+TEST_P(Init_Sys_Check, Test_xran_get_common_counters)\r
+{\r
+    int16_t ret = 0;\r
+    struct xran_common_counters x_counters;\r
+\r
+    ret = xran_get_common_counters(xranlib->get_xranhandle(), &x_counters);\r
+\r
+    ASSERT_EQ(0, ret);\r
+    ASSERT_EQ(0, x_counters.Rx_on_time);\r
+    ASSERT_EQ(0, x_counters.Rx_early);\r
+    ASSERT_EQ(0, x_counters.Rx_late);\r
+    ASSERT_EQ(0, x_counters.Rx_corrupt);\r
+    ASSERT_EQ(0, x_counters.Rx_pkt_dupl);\r
+    ASSERT_EQ(0, x_counters.Total_msgs_rcvd);\r
+}\r
+\r
+TEST_P(Init_Sys_Check, Test_xran_get_slot_idx)\r
+{\r
+#define NUM_OF_SUBFRAME_PER_FRAME 10\r
+    int32_t nNrOfSlotInSf = 1;\r
+    int32_t nSfIdx = -1;\r
+    uint32_t nFrameIdx;\r
+    uint32_t nSubframeIdx;\r
+    uint32_t nSlotIdx;\r
+    uint64_t nSecond;\r
+\r
+    uint32_t nXranTime  = xran_get_slot_idx(&nFrameIdx, &nSubframeIdx, &nSlotIdx, &nSecond);\r
+    nSfIdx = nFrameIdx*NUM_OF_SUBFRAME_PER_FRAME*nNrOfSlotInSf\r
+        + nSubframeIdx*nNrOfSlotInSf\r
+        + nSlotIdx;\r
+\r
+    ASSERT_EQ(0, nSfIdx);\r
+}\r
+\r
+TEST_P(Init_Sys_Check, Test_xran_reg_physide_cb)\r
+{\r
+    struct xran_device_ctx * p_xran_dev_ctx = xran_dev_get_ctx();\r
+    int16_t ret = 0;\r
+    ret = xran_reg_physide_cb(xranlib->get_xranhandle(), physide_dl_tti_call_back, NULL, 10, XRAN_CB_TTI);\r
+    ASSERT_EQ(0,ret);\r
+    ASSERT_EQ(physide_dl_tti_call_back, p_xran_dev_ctx->ttiCb[XRAN_CB_TTI]);\r
+    ASSERT_EQ(NULL, p_xran_dev_ctx->TtiCbParam[XRAN_CB_TTI]);\r
+    ASSERT_EQ(10, p_xran_dev_ctx->SkipTti[XRAN_CB_TTI]);\r
+\r
+    ret = xran_reg_physide_cb(xranlib->get_xranhandle(), physide_ul_half_slot_call_back, NULL, 10, XRAN_CB_HALF_SLOT_RX);\r
+    ASSERT_EQ(0,ret);\r
+    ASSERT_EQ(physide_ul_half_slot_call_back, p_xran_dev_ctx->ttiCb[XRAN_CB_HALF_SLOT_RX]);\r
+    ASSERT_EQ(NULL, p_xran_dev_ctx->TtiCbParam[XRAN_CB_HALF_SLOT_RX]);\r
+    ASSERT_EQ(10, p_xran_dev_ctx->SkipTti[XRAN_CB_HALF_SLOT_RX]);\r
+\r
+    ret = xran_reg_physide_cb(xranlib->get_xranhandle(), physide_ul_full_slot_call_back, NULL, 10, XRAN_CB_FULL_SLOT_RX);\r
+    ASSERT_EQ(0,ret);\r
+    ASSERT_EQ(physide_ul_full_slot_call_back, p_xran_dev_ctx->ttiCb[XRAN_CB_FULL_SLOT_RX]);\r
+    ASSERT_EQ(NULL, p_xran_dev_ctx->TtiCbParam[XRAN_CB_FULL_SLOT_RX]);\r
+    ASSERT_EQ(10, p_xran_dev_ctx->SkipTti[XRAN_CB_FULL_SLOT_RX]);\r
+\r
+}\r
+\r
+TEST_P(Init_Sys_Check, Test_xran_reg_sym_cb){\r
+    int16_t ret = 0;\r
+    ret = xran_reg_sym_cb(xranlib->get_xranhandle(),  physide_sym_call_back, NULL, 11, 0);\r
+    ASSERT_EQ(-1,ret);\r
+}\r
+\r
+TEST_P(Init_Sys_Check, Test_xran_mm_destroy){\r
+    int16_t ret = 0;\r
+    ret = xran_mm_destroy(xranlib->get_xranhandle());\r
+    ASSERT_EQ(-1,ret);\r
+}\r
+\r
+TEST_P(Init_Sys_Check, Test_xran_start_stop){\r
+    int16_t ret = 0;\r
+    ASSERT_EQ(XRAN_STOPPED, xran_if_current_state);\r
+    ret = xranlib->Start();\r
+    ASSERT_EQ(0,ret);\r
+    ASSERT_EQ(XRAN_RUNNING, xran_if_current_state);\r
+    ret = xranlib->Stop();\r
+    ASSERT_EQ(0,ret);\r
+    ASSERT_EQ(XRAN_STOPPED, xran_if_current_state);\r
+}\r
+\r
+INSTANTIATE_TEST_CASE_P(UnitTest, Init_Sys_Check,\r
+                        testing::ValuesIn(get_sequence(Init_Sys_Check::get_number_of_cases("init_sys_functional"))));\r
+\r
+\r
+\r