From 37c9eebb8b21e73991f0535221bd4e8f358be71f Mon Sep 17 00:00:00 2001
From: Robert Schmidt <robert.schmidt@openairinterface.org>
Date: Wed, 11 Jan 2023 15:30:05 +0100
Subject: [PATCH] NR_RLC: CMakeLists.txt in own subdirectory, with tests

---
 CMakeLists.txt                                | 29 ++++++++-----------
 openair2/CMakeLists.txt                       |  1 +
 openair2/LAYER2/CMakeLists.txt                |  1 +
 openair2/LAYER2/nr_rlc/CMakeLists.txt         | 22 ++++++++++++++
 openair2/LAYER2/nr_rlc/tests/CMakeLists.txt   | 14 +++++++++
 .../LAYER2/nr_rlc/tests/exec_nr_rlc_test.sh   | 18 ++++++++++++
 openair2/LAYER2/nr_rlc/tests/test.c           |  1 -
 7 files changed, 68 insertions(+), 18 deletions(-)
 create mode 100644 openair2/LAYER2/CMakeLists.txt
 create mode 100644 openair2/LAYER2/nr_rlc/CMakeLists.txt
 create mode 100644 openair2/LAYER2/nr_rlc/tests/CMakeLists.txt
 create mode 100755 openair2/LAYER2/nr_rlc/tests/exec_nr_rlc_test.sh

diff --git a/CMakeLists.txt b/CMakeLists.txt
index a592ce73bf..185398c24e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1187,18 +1187,6 @@ set(RLC_V2
   ${OPENAIR2_DIR}/LAYER2/rlc_v2/rlc_sdu.c
   )
 
-set(NR_RLC_SRC
-  ${OPENAIR2_DIR}/LAYER2/nr_rlc/asn1_utils.c
-  ${OPENAIR2_DIR}/LAYER2/nr_rlc/nr_rlc_entity.c
-  ${OPENAIR2_DIR}/LAYER2/nr_rlc/nr_rlc_entity_am.c
-  ${OPENAIR2_DIR}/LAYER2/nr_rlc/nr_rlc_entity_tm.c
-  ${OPENAIR2_DIR}/LAYER2/nr_rlc/nr_rlc_entity_um.c
-  ${OPENAIR2_DIR}/LAYER2/nr_rlc/nr_rlc_oai_api.c
-  ${OPENAIR2_DIR}/LAYER2/nr_rlc/nr_rlc_pdu.c
-  ${OPENAIR2_DIR}/LAYER2/nr_rlc/nr_rlc_sdu.c
-  ${OPENAIR2_DIR}/LAYER2/nr_rlc/nr_rlc_ue_manager.c
-  )
-
 set(NR_PDCP_SRC
   ${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
   ${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_ue_manager.c
@@ -1256,7 +1244,6 @@ set(L2_LTE_SRC
   )
 
 set(L2_NR_SRC
-  ${NR_RLC_SRC}
   ${NR_PDCP_SRC}
   ${NR_SDAP_SRC}
   ${NR_RRC_DIR}/rrc_gNB.c
@@ -1294,7 +1281,6 @@ set(L2_RRC_SRC_UE
   )
 
 set(NR_L2_SRC_UE
-  ${NR_RLC_SRC}
   ${NR_PDCP_SRC}
   ${NR_SDAP_SRC}
   ${NR_UE_RRC_DIR}/L2_interface_ue.c
@@ -1447,13 +1433,12 @@ add_library(e1_pdcp_if
 
 target_link_libraries(e1_pdcp_if PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
 
-target_link_libraries(L2_NR PRIVATE f1ap x2ap s1ap ngap nr_rrc e1ap)
+target_link_libraries(L2_NR PRIVATE f1ap x2ap s1ap ngap nr_rrc e1ap nr_rlc)
 if(E2_AGENT)
   target_link_libraries(L2_NR PUBLIC e2_agent e2_ran_func)
   target_compile_definitions(L2_NR PRIVATE E2_AGENT)
 endif()
 
-
 add_library(L2_LTE_NR
   ${L2_RRC_SRC}
   ${MAC_SRC}
@@ -1482,7 +1467,7 @@ endif()
 target_link_libraries(L2_UE PRIVATE asn1_lte_rrc_hdrs)
 
 add_library( NR_L2_UE ${NR_L2_SRC_UE} ${MAC_NR_SRC_UE} )
-target_link_libraries(NR_L2_UE PRIVATE f1ap)
+target_link_libraries(NR_L2_UE PRIVATE f1ap nr_rlc)
 target_link_libraries(NR_L2_UE PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
 
 add_library(MAC_NR_COMMON
@@ -2450,6 +2435,16 @@ make_driver(ue_ip ${OPENAIR2_DIR}/NETWORK_DRIVER/UE_IP ${ue_ip_src})
 
 include(${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/CMakeLists.txt)
 
+set(ENABLE_TESTS OFF CACHE STRING "Activate build of tests")
+set_property(CACHE ENABLE_TESTS PROPERTY TYPE BOOL)
+if(ENABLE_TESTS)
+  # activates globally adding tests such that they can be run using ctest
+  enable_testing()
+  # meta-target: each test is supposed to add_dependencies(tests ${NEWTEST})
+  # then, it is possible to build and execute all tests using "ninja tests && ctest"
+  add_custom_target(tests)
+endif()
+
 add_subdirectory(common)
 add_subdirectory(doc)
 add_subdirectory(openair1)
diff --git a/openair2/CMakeLists.txt b/openair2/CMakeLists.txt
index c6e28a6b36..762d3670fb 100644
--- a/openair2/CMakeLists.txt
+++ b/openair2/CMakeLists.txt
@@ -3,6 +3,7 @@ if(E2_AGENT)
   add_subdirectory(E2AP)
 endif()
 add_subdirectory(F1AP)
+add_subdirectory(LAYER2)
 add_subdirectory(M2AP)
 add_subdirectory(X2AP)
 add_subdirectory(RRC)
diff --git a/openair2/LAYER2/CMakeLists.txt b/openair2/LAYER2/CMakeLists.txt
new file mode 100644
index 0000000000..b8bc21e78c
--- /dev/null
+++ b/openair2/LAYER2/CMakeLists.txt
@@ -0,0 +1 @@
+add_subdirectory(nr_rlc)
diff --git a/openair2/LAYER2/nr_rlc/CMakeLists.txt b/openair2/LAYER2/nr_rlc/CMakeLists.txt
new file mode 100644
index 0000000000..d72ac37d09
--- /dev/null
+++ b/openair2/LAYER2/nr_rlc/CMakeLists.txt
@@ -0,0 +1,22 @@
+add_library(nr_rlc_core OBJECT
+            nr_rlc_entity.c
+            nr_rlc_entity_am.c
+            nr_rlc_entity_tm.c
+            nr_rlc_entity_um.c
+            nr_rlc_pdu.c
+            nr_rlc_sdu.c)
+target_include_directories(nr_rlc_core PRIVATE ../../..)
+target_link_libraries(nr_rlc_core PRIVATE ${T_LIB})
+add_library(nr_rlc STATIC
+            asn1_utils.c
+            nr_rlc_oai_api.c
+            nr_rlc_ue_manager.c
+)
+# L2_NR: for PDCP
+target_link_libraries(nr_rlc PUBLIC pthread f1ap nr_rlc_core UTIL ${T_LIB})
+target_include_directories(nr_rlc PRIVATE ../../..)
+target_link_libraries(nr_rlc PRIVATE asn1_lte_rrc asn1_nr_rrc)
+
+if(ENABLE_TESTS)
+  add_subdirectory(tests)
+endif()
diff --git a/openair2/LAYER2/nr_rlc/tests/CMakeLists.txt b/openair2/LAYER2/nr_rlc/tests/CMakeLists.txt
new file mode 100644
index 0000000000..b47293393d
--- /dev/null
+++ b/openair2/LAYER2/nr_rlc/tests/CMakeLists.txt
@@ -0,0 +1,14 @@
+
+foreach(TESTNUM RANGE 1 17)
+  add_executable(nr_rlc_test_${TESTNUM} test.c)
+  target_link_libraries(nr_rlc_test_${TESTNUM} PRIVATE nr_rlc_core pthread UTIL ${T_LIB})
+  target_compile_definitions(nr_rlc_test_${TESTNUM} PRIVATE TEST="test${TESTNUM}.h")
+  #target_include_directories(nr_rlc_test_${TESTNUM} PRIVATE LOG)
+  #target_compile_options(nr_rlc_test_${TESTNUM} PRIVATE -g --coverage -Wall)
+  add_dependencies(tests nr_rlc_test_${TESTNUM})
+endforeach()
+
+add_test(NAME nr_rlc_tests
+  COMMAND exec_nr_rlc_test.sh ${CMAKE_CURRENT_BINARY_DIR}
+         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+
diff --git a/openair2/LAYER2/nr_rlc/tests/exec_nr_rlc_test.sh b/openair2/LAYER2/nr_rlc/tests/exec_nr_rlc_test.sh
new file mode 100755
index 0000000000..8f2052075b
--- /dev/null
+++ b/openair2/LAYER2/nr_rlc/tests/exec_nr_rlc_test.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+# this script is to be executed in the current folder. It takes one argument,
+# which is the directory in which the executables are.
+
+if [ $# -ne 1 ]; then
+  echo "usage: $0 <directory-of-execs>"
+  exit 1
+fi
+
+EXEC_DIR=$1
+
+for i in {1..17}; do
+  diff \
+      <($EXEC_DIR/nr_rlc_test_$i | \grep ^TEST) \
+      <(gunzip -c test$i.txt.gz) \
+    || exit 1
+done
diff --git a/openair2/LAYER2/nr_rlc/tests/test.c b/openair2/LAYER2/nr_rlc/tests/test.c
index 2ba5c35fff..235c477675 100644
--- a/openair2/LAYER2/nr_rlc/tests/test.c
+++ b/openair2/LAYER2/nr_rlc/tests/test.c
@@ -12,7 +12,6 @@
 
 #include "common/utils/LOG/log.h"
 
-int oai_exit;
 /*
  * GNB_AM <rx_maxsize> <tx_maxsize> <t_poll_retransmit> <t_reassembly>
  *       <t_status_prohibit> <poll_pdu> <poll_byte> <max_retx_threshold>
-- 
2.26.2