diff --git a/ci-scripts/cls_containerize.py b/ci-scripts/cls_containerize.py index 79bc4fa46e..6c47787250 100644 --- a/ci-scripts/cls_containerize.py +++ b/ci-scripts/cls_containerize.py @@ -424,14 +424,13 @@ class Containerize(): # Let's remove any previous run artifacts if still there cmd.run(f"{self.cli} image prune --force") - if forceBaseImageBuild: - cmd.run(f"{self.cli} image rm {baseImage}:{baseTag}") for image,pattern,name,option in imageNames: cmd.run(f"{self.cli} image rm {name}:{imageTag}") # Build the base image only on Push Events (not on Merge Requests) # On when the base image docker file is being modified. if forceBaseImageBuild: + cmd.run(f"{self.cli} image rm {baseImage}:{baseTag}") cmd.run(f"{self.cli} build {self.cliBuildOptions} --target {baseImage} --tag {baseImage}:{baseTag} --file docker/Dockerfile.base{self.dockerfileprefix} . &> cmake_targets/log/ran-base.log", timeout=1600) # First verify if the base image was properly created. ret = cmd.run(f"{self.cli} image inspect --format=\'Size = {{{{.Size}}}} bytes\' {baseImage}:{baseTag}") @@ -445,7 +444,7 @@ class Containerize(): logging.error('\u001B[1m Building OAI Images Failed\u001B[0m') HTML.CreateHtmlTestRow(self.imageKind, 'KO', CONST.ALL_PROCESSES_OK) HTML.CreateHtmlTabFooter(False) - sys.exit(1) + return False else: result = re.search('Size *= *(?P[0-9\-]+) *bytes', cmd.getBefore()) if result is not None: @@ -506,10 +505,11 @@ class Containerize(): cmd.run(f"{self.cli} image prune --force") # Remove all intermediate build images and clean up - if self.ranAllowMerge and forceBaseImageBuild: - cmd.run(f"{self.cli} image rm {baseImage}:{baseTag}") cmd.run(f"{self.cli} image rm ran-build:{imageTag} ran-build-asan:{imageTag}") cmd.run(f"{self.cli} volume prune --force") + # Remove any cached artifacts: we don't use the cache for now, prevent + # out of diskspace problem + cmd.run(f"{self.cli} buildx prune --force") # create a zip with all logs build_log_name = f'build_log_{self.testCase_id}' @@ -523,12 +523,13 @@ class Containerize(): logging.info('\u001B[1m Building OAI Image(s) Pass\u001B[0m') HTML.CreateHtmlTestRow(self.imageKind, 'OK', CONST.ALL_PROCESSES_OK) HTML.CreateHtmlNextTabHeaderTestRow(collectInfo, allImagesSize) + return True else: logging.error('\u001B[1m Building OAI Images Failed\u001B[0m') HTML.CreateHtmlTestRow(self.imageKind, 'KO', CONST.ALL_PROCESSES_OK) HTML.CreateHtmlNextTabHeaderTestRow(collectInfo, allImagesSize) HTML.CreateHtmlTabFooter(False) - sys.exit(1) + return False def BuildProxy(self, HTML): if self.ranRepository == '' or self.ranBranch == '' or self.ranCommitID == '': @@ -611,7 +612,7 @@ class Containerize(): mySSH.close() HTML.CreateHtmlTestRow('commit ' + tag, 'KO', CONST.ALL_PROCESSES_OK) HTML.CreateHtmlTabFooter(False) - sys.exit(1) + return False else: logging.debug('L2sim proxy image for tag ' + tag + ' already exists, skipping build') @@ -673,6 +674,87 @@ class Containerize(): HTML.CreateHtmlTestRow('commit ' + tag, 'OK', CONST.ALL_PROCESSES_OK) HTML.CreateHtmlNextTabHeaderTestRow(collectInfo, allImagesSize) + def BuildRunTests(self, HTML): + if self.ranRepository == '' or self.ranBranch == '' or self.ranCommitID == '': + HELP.GenericHelp(CONST.Version) + sys.exit('Insufficient Parameter') + if self.eNB_serverId[self.eNB_instance] == '0': + lIpAddr = self.eNBIPAddress + lUserName = self.eNBUserName + lPassWord = self.eNBPassword + lSourcePath = self.eNBSourceCodePath + elif self.eNB_serverId[self.eNB_instance] == '1': + lIpAddr = self.eNB1IPAddress + lUserName = self.eNB1UserName + lPassWord = self.eNB1Password + lSourcePath = self.eNB1SourceCodePath + elif self.eNB_serverId[self.eNB_instance] == '2': + lIpAddr = self.eNB2IPAddress + lUserName = self.eNB2UserName + lPassWord = self.eNB2Password + lSourcePath = self.eNB2SourceCodePath + if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '': + HELP.GenericHelp(CONST.Version) + sys.exit('Insufficient Parameter') + logging.debug('Building on server: ' + lIpAddr) + cmd = cls_cmd.RemoteCmd(lIpAddr) + cmd.cd(lSourcePath) + + ret = cmd.run('hostnamectl') + result = re.search('Ubuntu', ret.stdout) + host = result.group(0) + if host != 'Ubuntu': + cmd.close() + raise Exception("Can build unit tests only on Ubuntu server") + logging.debug('running on Ubuntu as expected') + + if self.forcedWorkspaceCleanup: + cmd.run(f'sudo -S rm -Rf {lSourcePath}') + self.testCase_id = HTML.testCase_id + + # check that ran-base image exists as we expect it + baseImage = 'ran-base' + baseTag = 'develop' + if self.ranAllowMerge: + if self.ranTargetBranch == 'develop': + cmd.run(f'git diff HEAD..origin/develop -- cmake_targets/build_oai cmake_targets/tools/build_helper docker/Dockerfile.base{self.dockerfileprefix} | grep --colour=never -i INDEX') + result = re.search('index', cmd.getBefore()) + if result is not None: + baseTag = 'develop' + ret = cmd.run(f"docker image inspect --format=\'Size = {{{{.Size}}}} bytes\' {baseImage}:{baseTag}") + if ret.returncode != 0: + logging.error(f'No {baseImage} image present, cannot build tests') + HTML.CreateHtmlTestRow(self.imageKind, 'KO', CONST.ALL_PROCESSES_OK) + HTML.CreateHtmlTabFooter(False) + return False + + # build ran-unittests image + dockerfile = "ci-scripts/docker/Dockerfile.unittest.ubuntu20" + ret = cmd.run(f'docker build --progress=plain --tag ran-unittests:{baseTag} --file {dockerfile} . &> {lSourcePath}/cmake_targets/log/unittest-build.log') + if ret.returncode != 0: + logging.error(f'Cannot build unit tests') + HTML.CreateHtmlTestRow("Unit test build failed", 'KO', [dockerfile]) + HTML.CreateHtmlTabFooter(False) + return False + + HTML.CreateHtmlTestRowQueue("Build unit tests", 'OK', [dockerfile]) + + # it worked, build and execute tests, and close connection + ret = cmd.run(f'docker run -a STDOUT --rm ran-unittests:develop ctest --output-on-failure --no-label-summary -j$(nproc)') + cmd.run(f'docker rmi ran-unittests:develop') + build_log_name = f'build_log_{self.testCase_id}' + CopyLogsToExecutor(cmd, lSourcePath, build_log_name) + cmd.close() + + if ret.returncode == 0: + HTML.CreateHtmlTestRowQueue('Unit tests succeeded', 'OK', [ret.stdout]) + HTML.CreateHtmlTabFooter(True) + return True + else: + HTML.CreateHtmlTestRowQueue('Unit tests failed (see also doc/UnitTests.md)', 'KO', [ret.stdout]) + HTML.CreateHtmlTabFooter(False) + return False + def Push_Image_to_Local_Registry(self, HTML): if self.registrySvrId == '0': lIpAddr = self.eNBIPAddress diff --git a/ci-scripts/docker/Dockerfile.unittest.ubuntu20 b/ci-scripts/docker/Dockerfile.unittest.ubuntu20 new file mode 100644 index 0000000000..7e47988719 --- /dev/null +++ b/ci-scripts/docker/Dockerfile.unittest.ubuntu20 @@ -0,0 +1,35 @@ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ +#--------------------------------------------------------------------- +# +# Dockerfile for the Open-Air-Interface BUILD service +# Valid for Ubuntu 20.04 +# +#--------------------------------------------------------------------- + +FROM ran-base:develop as ran-tests + +RUN rm -Rf /oai-ran +WORKDIR /oai-ran +COPY . . + +WORKDIR /oai-ran/build +RUN cmake -GNinja -DENABLE_TESTS=ON -DCMAKE_BUILD_TYPE=Debug .. && ninja tests diff --git a/ci-scripts/main.py b/ci-scripts/main.py index 8770224393..db6fedde1a 100644 --- a/ci-scripts/main.py +++ b/ci-scripts/main.py @@ -65,6 +65,7 @@ import logging import datetime import signal import subprocess +import traceback from multiprocessing import Process, Lock, SimpleQueue logging.basicConfig( level=logging.DEBUG, @@ -102,7 +103,7 @@ def AssignParams(params_dict): def GetParametersFromXML(action): - if action == 'Build_eNB' or action == 'Build_Image' or action == 'Build_Proxy' or action == "Build_Cluster_Image": + if action == 'Build_eNB' or action == 'Build_Image' or action == 'Build_Proxy' or action == "Build_Cluster_Image" or action == "Build_Run_Tests": RAN.Build_eNB_args=test.findtext('Build_eNB_args') CONTAINERS.imageKind=test.findtext('kind') forced_workspace_cleanup = test.findtext('forced_workspace_cleanup') @@ -745,142 +746,157 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re continue CiTestObj.ShowTestID() GetParametersFromXML(action) - if action == 'Build_eNB': - RAN.BuildeNB(HTML) - elif action == 'WaitEndBuild_eNB': - RAN.WaitBuildeNBisFinished(HTML) - elif action == 'Custom_Command': - RAN.CustomCommand(HTML) - if RAN.prematureExit: - CiTestObj.AutoTerminateeNB(HTML,RAN,EPC,CONTAINERS) - elif action == 'Initialize_eNB': - RAN.InitializeeNB(HTML, EPC) - if RAN.prematureExit: - CiTestObj.AutoTerminateeNB(HTML,RAN,EPC,CONTAINERS) - elif action == 'Terminate_eNB': - RAN.TerminateeNB(HTML, EPC) - elif action == 'Initialize_UE': - CiTestObj.InitializeUE(HTML) - elif action == 'Terminate_UE': - CiTestObj.TerminateUE(HTML) - elif action == 'Attach_UE': - CiTestObj.AttachUE(HTML, RAN, EPC, CONTAINERS) - elif action == 'Detach_UE': - CiTestObj.DetachUE(HTML) - elif action == 'DataDisable_UE': - CiTestObj.DataDisableUE(HTML) - elif action == 'DataEnable_UE': - CiTestObj.DataEnableUE(HTML) - elif action == 'CheckStatusUE': - CiTestObj.CheckStatusUE(HTML) - elif action == 'Build_OAI_UE': - CiTestObj.BuildOAIUE(HTML) - elif action == 'Initialize_OAI_UE': - CiTestObj.InitializeOAIUE(HTML,RAN,EPC,CONTAINERS) - elif action == 'Terminate_OAI_UE': - CiTestObj.TerminateOAIUE(HTML,RAN,EPC,CONTAINERS) - elif action == 'Ping': - CiTestObj.Ping(HTML,RAN,EPC,CONTAINERS) - elif action == 'Iperf': - CiTestObj.Iperf(HTML,RAN,EPC,CONTAINERS) - elif action == 'Initialize_HSS': - EPC.InitializeHSS(HTML) - elif action == 'Terminate_HSS': - EPC.TerminateHSS(HTML) - elif action == 'Initialize_MME': - EPC.InitializeMME(HTML) - elif action == 'Terminate_MME': - EPC.TerminateMME(HTML) - elif action == 'Initialize_SPGW': - EPC.InitializeSPGW(HTML) - elif action == 'Terminate_SPGW': - EPC.TerminateSPGW(HTML) - elif action == 'Initialize_5GCN': - EPC.Initialize5GCN(HTML) - elif action == 'Terminate_5GCN': - EPC.Terminate5GCN(HTML) - elif action == 'Deploy_EPC': - EPC.DeployEpc(HTML) - elif action == 'Undeploy_EPC': - EPC.UndeployEpc(HTML) - elif action == 'IdleSleep': - CiTestObj.IdleSleep(HTML) - elif action == 'Perform_X2_Handover': - CiTestObj.Perform_X2_Handover(HTML,RAN,EPC) - elif action == 'Build_PhySim': - HTML=ldpc.Build_PhySim(HTML,CONST) - if ldpc.exitStatus==1: - RAN.prematureExit = True - elif action == 'Run_LDPCTest': - HTML=ldpc.Run_LDPCTest(HTML,CONST,id) - if ldpc.exitStatus==1: - RAN.prematureExit = True - elif action == 'Run_LDPCt1Test': - HTML=ldpc.Run_LDPCt1Test(HTML,CONST,id) - if ldpc.exitStatus==1: - RAN.prematureExit = True - elif action == 'Run_NRulsimTest': - HTML=ldpc.Run_NRulsimTest(HTML,CONST,id) - if ldpc.exitStatus==1: - RAN.prematureExit = True - elif action == 'Pull_Cluster_Image': - if not CLUSTER.PullClusterImage(HTML,RAN): - RAN.prematureExit = True - elif action == 'Build_Cluster_Image': - if not CLUSTER.BuildClusterImage(HTML): - RAN.prematureExit = True - elif action == 'Build_Image': - CONTAINERS.BuildImage(HTML) - elif action == 'Build_Proxy': - CONTAINERS.BuildProxy(HTML) - elif action == 'Push_Local_Registry': - success = CONTAINERS.Push_Image_to_Local_Registry(HTML) - if not success: - RAN.prematureExit = True - elif action == 'Pull_Local_Registry': - success = CONTAINERS.Pull_Image_from_Local_Registry(HTML) - if not success: - RAN.prematureExit = True - elif action == 'Clean_Test_Server_Images': - success = CONTAINERS.Clean_Test_Server_Images(HTML) - if not success: - RAN.prematureExit = True - elif action == 'Deploy_Object': - CONTAINERS.DeployObject(HTML, EPC) - if CONTAINERS.exitStatus==1: - CiTestObj.AutoTerminateeNB(HTML,RAN,EPC,CONTAINERS) - RAN.prematureExit = True - elif action == 'Undeploy_Object': - CONTAINERS.UndeployObject(HTML, RAN) - if CONTAINERS.exitStatus == 1: - CiTestObj.AutoTerminateeNB(HTML,RAN,EPC,CONTAINERS) - RAN.prematureExit = True - elif action == 'Cppcheck_Analysis': - SCA.CppCheckAnalysis(HTML) - elif action == 'LicenceAndFormattingCheck': - ret = SCA.LicenceAndFormattingCheck(HTML) - if ret != 0: - RAN.prematureExit = True - elif action == 'Deploy_Run_PhySim': - PHYSIM.Deploy_PhySim(HTML, RAN) - elif action == 'DeployGenObject': - CONTAINERS.DeployGenObject(HTML, RAN, CiTestObj) - if CONTAINERS.exitStatus==1: - RAN.prematureExit = True - elif action == 'UndeployGenObject': - CONTAINERS.UndeployGenObject(HTML, RAN, CiTestObj) - if CONTAINERS.exitStatus==1: - RAN.prematureExit = True - elif action == 'IperfFromContainer': - CONTAINERS.IperfFromContainer(HTML, RAN, CiTestObj) - if CONTAINERS.exitStatus==1: - RAN.prematureExit = True - elif action == 'StatsFromGenObject': - CONTAINERS.StatsFromGenObject(HTML) - elif action == 'Push_Images_To_Test_Servers': - logging.debug('To be implemented') - else: - sys.exit('Invalid class (action) from xml') + try: + if action == 'Build_eNB': + RAN.BuildeNB(HTML) + elif action == 'WaitEndBuild_eNB': + RAN.WaitBuildeNBisFinished(HTML) + elif action == 'Custom_Command': + RAN.CustomCommand(HTML) + if RAN.prematureExit: + CiTestObj.AutoTerminateeNB(HTML,RAN,EPC,CONTAINERS) + elif action == 'Initialize_eNB': + RAN.InitializeeNB(HTML, EPC) + if RAN.prematureExit: + CiTestObj.AutoTerminateeNB(HTML,RAN,EPC,CONTAINERS) + elif action == 'Terminate_eNB': + RAN.TerminateeNB(HTML, EPC) + elif action == 'Initialize_UE': + CiTestObj.InitializeUE(HTML) + elif action == 'Terminate_UE': + CiTestObj.TerminateUE(HTML) + elif action == 'Attach_UE': + CiTestObj.AttachUE(HTML, RAN, EPC, CONTAINERS) + elif action == 'Detach_UE': + CiTestObj.DetachUE(HTML) + elif action == 'DataDisable_UE': + CiTestObj.DataDisableUE(HTML) + elif action == 'DataEnable_UE': + CiTestObj.DataEnableUE(HTML) + elif action == 'CheckStatusUE': + CiTestObj.CheckStatusUE(HTML) + elif action == 'Build_OAI_UE': + CiTestObj.BuildOAIUE(HTML) + elif action == 'Initialize_OAI_UE': + CiTestObj.InitializeOAIUE(HTML,RAN,EPC,CONTAINERS) + elif action == 'Terminate_OAI_UE': + CiTestObj.TerminateOAIUE(HTML,RAN,EPC,CONTAINERS) + elif action == 'Ping': + CiTestObj.Ping(HTML,RAN,EPC,CONTAINERS) + elif action == 'Iperf': + CiTestObj.Iperf(HTML,RAN,EPC,CONTAINERS) + elif action == 'Initialize_HSS': + EPC.InitializeHSS(HTML) + elif action == 'Terminate_HSS': + EPC.TerminateHSS(HTML) + elif action == 'Initialize_MME': + EPC.InitializeMME(HTML) + elif action == 'Terminate_MME': + EPC.TerminateMME(HTML) + elif action == 'Initialize_SPGW': + EPC.InitializeSPGW(HTML) + elif action == 'Terminate_SPGW': + EPC.TerminateSPGW(HTML) + elif action == 'Initialize_5GCN': + EPC.Initialize5GCN(HTML) + elif action == 'Terminate_5GCN': + EPC.Terminate5GCN(HTML) + elif action == 'Deploy_EPC': + EPC.DeployEpc(HTML) + elif action == 'Undeploy_EPC': + EPC.UndeployEpc(HTML) + elif action == 'IdleSleep': + CiTestObj.IdleSleep(HTML) + elif action == 'Perform_X2_Handover': + CiTestObj.Perform_X2_Handover(HTML,RAN,EPC) + elif action == 'Build_PhySim': + HTML=ldpc.Build_PhySim(HTML,CONST) + if ldpc.exitStatus==1: + RAN.prematureExit = True + elif action == 'Run_LDPCTest': + HTML=ldpc.Run_LDPCTest(HTML,CONST,id) + if ldpc.exitStatus==1: + RAN.prematureExit = True + elif action == 'Run_LDPCt1Test': + HTML=ldpc.Run_LDPCt1Test(HTML,CONST,id) + if ldpc.exitStatus==1: + RAN.prematureExit = True + elif action == 'Run_NRulsimTest': + HTML=ldpc.Run_NRulsimTest(HTML,CONST,id) + if ldpc.exitStatus==1: + RAN.prematureExit = True + elif action == 'Pull_Cluster_Image': + if not CLUSTER.PullClusterImage(HTML,RAN): + RAN.prematureExit = True + elif action == 'Build_Cluster_Image': + if not CLUSTER.BuildClusterImage(HTML): + RAN.prematureExit = True + elif action == 'Build_Image': + success = CONTAINERS.BuildImage(HTML) + if not success: + RAN.prematureExit = True + elif action == 'Build_Run_Tests': + success = CONTAINERS.BuildRunTests(HTML) + if not success: + RAN.prematureExit = True + elif action == 'Build_Proxy': + success = CONTAINERS.BuildProxy(HTML) + if not success: + RAN.prematureExit = True + elif action == 'Push_Local_Registry': + success = CONTAINERS.Push_Image_to_Local_Registry(HTML) + if not success: + RAN.prematureExit = True + elif action == 'Pull_Local_Registry': + success = CONTAINERS.Pull_Image_from_Local_Registry(HTML) + if not success: + RAN.prematureExit = True + elif action == 'Clean_Test_Server_Images': + success = CONTAINERS.Clean_Test_Server_Images(HTML) + if not success: + RAN.prematureExit = True + elif action == 'Deploy_Object': + CONTAINERS.DeployObject(HTML, EPC) + if CONTAINERS.exitStatus==1: + CiTestObj.AutoTerminateeNB(HTML,RAN,EPC,CONTAINERS) + RAN.prematureExit = True + elif action == 'Undeploy_Object': + CONTAINERS.UndeployObject(HTML, RAN) + if CONTAINERS.exitStatus == 1: + CiTestObj.AutoTerminateeNB(HTML,RAN,EPC,CONTAINERS) + RAN.prematureExit = True + elif action == 'Cppcheck_Analysis': + SCA.CppCheckAnalysis(HTML) + elif action == 'LicenceAndFormattingCheck': + ret = SCA.LicenceAndFormattingCheck(HTML) + if ret != 0: + RAN.prematureExit = True + elif action == 'Deploy_Run_PhySim': + PHYSIM.Deploy_PhySim(HTML, RAN) + elif action == 'DeployGenObject': + CONTAINERS.DeployGenObject(HTML, RAN, CiTestObj) + if CONTAINERS.exitStatus==1: + RAN.prematureExit = True + elif action == 'UndeployGenObject': + CONTAINERS.UndeployGenObject(HTML, RAN, CiTestObj) + if CONTAINERS.exitStatus==1: + RAN.prematureExit = True + elif action == 'IperfFromContainer': + CONTAINERS.IperfFromContainer(HTML, RAN, CiTestObj) + if CONTAINERS.exitStatus==1: + RAN.prematureExit = True + elif action == 'StatsFromGenObject': + CONTAINERS.StatsFromGenObject(HTML) + elif action == 'Push_Images_To_Test_Servers': + logging.debug('To be implemented') + else: + sys.exit('Invalid class (action) from xml') + except Exception as e: + s = traceback.format_exc() + logging.error(f'while running CI, an exception occurred:\n{s}') + HTML.CreateHtmlTestRowQueue("N/A", 'KO', [f"CI test code encountered an exception:\n{s}"]) + RAN.prematureExit = True + if RAN.prematureExit: if CiTestObj.testCase_id == CiTestObj.testMinStableId: logging.warning('Scenario has reached minimal stability point') diff --git a/ci-scripts/xml_class_list.yml b/ci-scripts/xml_class_list.yml index 116ad769c1..645e5480be 100755 --- a/ci-scripts/xml_class_list.yml +++ b/ci-scripts/xml_class_list.yml @@ -34,6 +34,7 @@ - IdleSleep - Perform_X2_Handover - Build_Image + - Build_Run_Tests - Deploy_Object - Undeploy_Object - Cppcheck_Analysis diff --git a/ci-scripts/xml_files/container_build_run_tests.xml b/ci-scripts/xml_files/container_build_run_tests.xml new file mode 100644 index 0000000000..479bb20a5d --- /dev/null +++ b/ci-scripts/xml_files/container_build_run_tests.xml @@ -0,0 +1,40 @@ + + + build-run-test-tab + Build and Run Unit Tests + wrench + + 030201 + + + + + Build_Run_Tests + Build and Run UnitTests + all + 0 + 0 + + + diff --git a/common/utils/ds/byte_array.c b/common/utils/ds/byte_array.c index c3281ffa27..78e1ef4e31 100644 --- a/common/utils/ds/byte_array.c +++ b/common/utils/ds/byte_array.c @@ -21,7 +21,6 @@ #include "byte_array.h" -#include "common/utils/assertions.h" #include #include @@ -29,7 +28,7 @@ byte_array_t copy_byte_array(byte_array_t src) { byte_array_t dst = {0}; dst.buf = malloc(src.len); - AssertFatal(dst.buf != NULL, "Memory exhausted"); + assert(dst.buf != NULL && "Memory exhausted"); memcpy(dst.buf, src.buf, src.len); dst.len = src.len; return dst; diff --git a/common/utils/minimal_stub.c b/common/utils/minimal_stub.c index 64f2e3faa9..5660ed92f1 100644 --- a/common/utils/minimal_stub.c +++ b/common/utils/minimal_stub.c @@ -4,6 +4,9 @@ int T_stdout; #endif +struct configmodule_interface_s; +struct configmodule_interface_s *uniqCfg = NULL; + void exit_function(const char *file, const char *function, const int line, const char *s, const int assert) { if (assert) { diff --git a/doc/TESTBenches.md b/doc/TESTBenches.md index 45f1353dfe..40f410e9c5 100644 --- a/doc/TESTBenches.md +++ b/doc/TESTBenches.md @@ -109,6 +109,7 @@ information on how the images are built. - build image from `Dockerfile.clang.rhel9` (compilation only, artifacts not used currently) - [RAN-Ubuntu18-Image-Builder](https://jenkins-oai.eurecom.fr/job/RAN-Ubuntu18-Image-Builder/) ~BUILD-ONLY ~4G-LTE ~5G-NR + - run formatting check from `ci-scripts/docker/Dockerfile.formatting.bionic` - obelix: Ubuntu 20 image build using docker (Note: builds U20 images while pipeline is named U18!) - base image from `Dockerfile.base.ubuntu20` - build image from `Dockerfile.build.ubuntu20`, followed by @@ -118,6 +119,7 @@ information on how the images are built. - target image from `Dockerfile.nrUE.ubuntu20` - target image from `Dockerfile.lteUE.ubuntu20` - target image from `Dockerfile.lteRU.ubuntu20` + - build unit tests from `ci-scripts/docker/Dockerfile.unittest.ubuntu20`, and run them #### Image Test pipelines