Merge branch 'developer' into dev/automate_version_number
All checks were successful
Build on RHEL9 / build (push) Successful in 3m35s
Build on RHEL8 / build (push) Successful in 5m3s

This commit is contained in:
Erik Fröjdh
2025-04-25 13:49:33 +02:00
committed by GitHub
6 changed files with 177 additions and 90 deletions

View File

@ -0,0 +1,29 @@
name: Build on RHEL8
on:
push:
workflow_dispatch:
permissions:
contents: read
jobs:
build:
runs-on: "ubuntu-latest"
container:
image: gitea.psi.ch/detectors/rhel8-detectors-dev
steps:
- name: Clone repository
run: |
echo Cloning ${{ github.ref_name }}
git clone https://${{secrets.GITHUB_TOKEN}}@gitea.psi.ch/${{ github.repository }}.git --branch=${{ github.ref_name }} .
- name: Build library
run: |
mkdir build && cd build
cmake .. -DSLS_USE_PYTHON=ON -DSLS_USE_TESTS=ON
make -j 2
- name: C++ unit tests
working-directory: ${{gitea.workspace}}/build
run: ctest

View File

@ -0,0 +1,27 @@
name: Build on RHEL9
on:
push:
workflow_dispatch:
permissions:
contents: read
jobs:
build:
runs-on: "ubuntu-latest"
container:
image: gitea.psi.ch/detectors/rhel9-detectors-dev
steps:
- uses: actions/checkout@v4
- name: Build library
run: |
mkdir build && cd build
cmake .. -DSLS_USE_PYTHON=ON -DSLS_USE_TESTS=ON
make -j 2
- name: C++ unit tests
working-directory: ${{gitea.workspace}}/build
run: ctest

View File

@ -44,6 +44,10 @@ endif()
# Patch is applied in the FetchContent_Declare # Patch is applied in the FetchContent_Declare
set(SLS_LIBZMQ_VERSION "4.3.4") set(SLS_LIBZMQ_VERSION "4.3.4")
find_program(PATCH_EXECUTABLE patch)
if(NOT PATCH_EXECUTABLE)
message(FATAL_ERROR "The 'patch' tool is required for patching lib zeromq. Please install it.")
endif()
if(SLS_FETCH_ZMQ_FROM_GITHUB) if(SLS_FETCH_ZMQ_FROM_GITHUB)
# Opt in to pull down a zmq version from github instead of # Opt in to pull down a zmq version from github instead of
@ -216,7 +220,7 @@ endif()
# to control options for the libraries # to control options for the libraries
if(NOT TARGET slsProjectOptions) if(NOT TARGET slsProjectOptions)
add_library(slsProjectOptions INTERFACE) add_library(slsProjectOptions INTERFACE)
target_compile_features(slsProjectOptions INTERFACE cxx_std_11) target_compile_features(slsProjectOptions INTERFACE cxx_std_17)
endif() endif()
if (NOT TARGET slsProjectWarnings) if (NOT TARGET slsProjectWarnings)
@ -329,7 +333,8 @@ if (SLS_USE_INTEGRATION_TESTS)
endif (SLS_USE_INTEGRATION_TESTS) endif (SLS_USE_INTEGRATION_TESTS)
if (SLS_USE_PYTHON) if (SLS_USE_PYTHON)
find_package (Python 3.8 COMPONENTS Interpreter Development) find_package (Python 3.8 COMPONENTS Interpreter Development.Module REQUIRED)
set(PYBIND11_FINDPYTHON ON) # Needed for RH8
if(SLS_FETCH_PYBIND11_FROM_GITHUB) if(SLS_FETCH_PYBIND11_FROM_GITHUB)
FetchContent_Declare( FetchContent_Declare(
pybind11 pybind11

View File

@ -445,6 +445,7 @@ TEST_CASE("rx_arping", "[.cmdcall][.rx]") {
Detector det; Detector det;
Caller caller(&det); Caller caller(&det);
auto prev_val = det.getRxArping(); auto prev_val = det.getRxArping();
if (det.getDestinationUDPIP()[0].str() != "127.0.0.1") {
{ {
std::ostringstream oss; std::ostringstream oss;
caller.call("rx_arping", {"1"}, -1, PUT, oss); caller.call("rx_arping", {"1"}, -1, PUT, oss);
@ -464,6 +465,7 @@ TEST_CASE("rx_arping", "[.cmdcall][.rx]") {
det.setRxArping(prev_val[i], {i}); det.setRxArping(prev_val[i], {i});
} }
} }
}
TEST_CASE("rx_roi", "[.cmdcall]") { TEST_CASE("rx_roi", "[.cmdcall]") {
Detector det; Detector det;
@ -583,6 +585,9 @@ TEST_CASE("fpath", "[.cmdcall]") {
REQUIRE(oss.str() == "fpath /tmp\n"); REQUIRE(oss.str() == "fpath /tmp\n");
} }
for (int i = 0; i != det.size(); ++i) { for (int i = 0; i != det.size(); ++i) {
if (prev_val[i].empty()) {
continue;
}
det.setFilePath(prev_val[i], {i}); det.setFilePath(prev_val[i], {i});
} }
} }

View File

@ -18,11 +18,16 @@ struct Data {
constexpr int shm_id = 10; constexpr int shm_id = 10;
TEST_CASE("Create SharedMemory read and write", "[detector]") { TEST_CASE("Create SharedMemory read and write", "[detector]") {
const char *env_p = std::getenv("SLSDETNAME");
std::string env_name = env_p ? ("_" + std::string(env_p)) : "";
SharedMemory<Data> shm(shm_id, -1); SharedMemory<Data> shm(shm_id, -1);
if (shm.exists()) {
shm.removeSharedMemory();
}
shm.createSharedMemory(); shm.createSharedMemory();
CHECK(shm.getName() == std::string("/slsDetectorPackage_detector_") + CHECK(shm.getName() == std::string("/slsDetectorPackage_detector_") +
std::to_string(shm_id)); std::to_string(shm_id) + env_name);
shm()->x = 3; shm()->x = 3;
shm()->y = 5.7; shm()->y = 5.7;
@ -90,10 +95,12 @@ TEST_CASE("Open two shared memories to the same place", "[detector]") {
} }
TEST_CASE("Move SharedMemory", "[detector]") { TEST_CASE("Move SharedMemory", "[detector]") {
const char *env_p = std::getenv("SLSDETNAME");
std::string env_name = env_p ? ("_" + std::string(env_p)) : "";
SharedMemory<Data> shm(shm_id, -1); SharedMemory<Data> shm(shm_id, -1);
CHECK(shm.getName() == std::string("/slsDetectorPackage_detector_") + CHECK(shm.getName() == std::string("/slsDetectorPackage_detector_") +
std::to_string(shm_id)); std::to_string(shm_id) + env_name);
shm.createSharedMemory(); shm.createSharedMemory();
shm()->x = 9; shm()->x = 9;
@ -104,15 +111,19 @@ TEST_CASE("Move SharedMemory", "[detector]") {
REQUIRE_THROWS( REQUIRE_THROWS(
shm()); // trying to access should throw instead of returning a nullptr shm()); // trying to access should throw instead of returning a nullptr
CHECK(shm2.getName() == std::string("/slsDetectorPackage_detector_") + CHECK(shm2.getName() == std::string("/slsDetectorPackage_detector_") +
std::to_string(shm_id)); std::to_string(shm_id) + env_name);
shm2.removeSharedMemory(); shm2.removeSharedMemory();
} }
TEST_CASE("Create several shared memories", "[detector]") { TEST_CASE("Create several shared memories", "[detector]") {
const char *env_p = std::getenv("SLSDETNAME");
std::string env_name = env_p ? ("_" + std::string(env_p)) : "";
constexpr int N = 5; constexpr int N = 5;
std::vector<SharedMemory<int>> v; std::vector<SharedMemory<int>> v;
v.reserve(N); v.reserve(N);
for (int i = 0; i != N; ++i) { for (int i = 0; i != N; ++i) {
std::cout << "i:" << i << std::endl;
v.emplace_back(shm_id + i, -1); v.emplace_back(shm_id + i, -1);
CHECK(v[i].exists() == false); CHECK(v[i].exists() == false);
v[i].createSharedMemory(); v[i].createSharedMemory();
@ -123,7 +134,7 @@ TEST_CASE("Create several shared memories", "[detector]") {
for (int i = 0; i != N; ++i) { for (int i = 0; i != N; ++i) {
CHECK(*v[i]() == i); CHECK(*v[i]() == i);
CHECK(v[i].getName() == std::string("/slsDetectorPackage_detector_") + CHECK(v[i].getName() == std::string("/slsDetectorPackage_detector_") +
std::to_string(i + shm_id)); std::to_string(i + shm_id) + env_name);
} }
for (int i = 0; i != N; ++i) { for (int i = 0; i != N; ++i) {
@ -133,8 +144,12 @@ TEST_CASE("Create several shared memories", "[detector]") {
} }
TEST_CASE("Create create a shared memory with a tag") { TEST_CASE("Create create a shared memory with a tag") {
const char *env_p = std::getenv("SLSDETNAME");
std::string env_name = env_p ? ("_" + std::string(env_p)) : "";
SharedMemory<int> shm(0, -1, "ctbdacs"); SharedMemory<int> shm(0, -1, "ctbdacs");
REQUIRE(shm.getName() == "/slsDetectorPackage_detector_0_ctbdacs"); REQUIRE(shm.getName() ==
"/slsDetectorPackage_detector_0" + env_name + "_ctbdacs");
} }
TEST_CASE("Create create a shared memory with a tag when SLSDETNAME is set") { TEST_CASE("Create create a shared memory with a tag when SLSDETNAME is set") {

View File

@ -4,7 +4,7 @@
This file is used to start up simulators, receivers and run all the tests on them and finally kill the simulators and receivers. This file is used to start up simulators, receivers and run all the tests on them and finally kill the simulators and receivers.
''' '''
import argparse import argparse
import os, sys, subprocess, time, colorama, signal import os, sys, subprocess, time, colorama
from colorama import Fore from colorama import Fore
from slsdet import Detector, detectorType, detectorSettings from slsdet import Detector, detectorType, detectorSettings
@ -23,23 +23,9 @@ def Log(color, message):
def checkIfProcessRunning(processName): def checkIfProcessRunning(processName):
cmd = "ps -ef | grep " + processName cmd = f"pgrep -f {processName}"
print(cmd)
res = subprocess.getoutput(cmd) res = subprocess.getoutput(cmd)
print(res) return bool(res.strip())
# eg. of output
#l_user 250506 243295 0 14:38 pts/5 00:00:00 /bin/sh -c ps -ef | grep slsReceiver
#l_user 250508 250506 0 14:38 pts/5 00:00:00 grep slsReceiver
print('how many')
cmd = "ps -ef | grep " + processName + " | wc -l"
print(cmd)
res=subprocess.getoutput(cmd)
print(res)
if res == '2':
return False
return True
def killProcess(name): def killProcess(name):
@ -52,7 +38,7 @@ def killProcess(name):
print('process not running : ' + name) print('process not running : ' + name)
def killAllStaleProcesses(): def killAllStaleProcesses(fp):
killProcess('eigerDetectorServer_virtual') killProcess('eigerDetectorServer_virtual')
killProcess('jungfrauDetectorServer_virtual') killProcess('jungfrauDetectorServer_virtual')
killProcess('mythen3DetectorServer_virtual') killProcess('mythen3DetectorServer_virtual')
@ -62,9 +48,9 @@ def killAllStaleProcesses():
killProcess('xilinx_ctbDetectorServer_virtual') killProcess('xilinx_ctbDetectorServer_virtual')
killProcess('slsReceiver') killProcess('slsReceiver')
killProcess('slsMultiReceiver') killProcess('slsMultiReceiver')
cleanSharedmemory() cleanSharedmemory(fp)
def cleanup(name): def cleanup(name, fp):
''' '''
kill both servers, receivers and clean shared memory kill both servers, receivers and clean shared memory
''' '''
@ -72,9 +58,9 @@ def cleanup(name):
killProcess(name + 'DetectorServer_virtual') killProcess(name + 'DetectorServer_virtual')
killProcess('slsReceiver') killProcess('slsReceiver')
killProcess('slsMultiReceiver') killProcess('slsMultiReceiver')
cleanSharedmemory() cleanSharedmemory(fp)
def cleanSharedmemory(): def cleanSharedmemory(fp):
Log(Fore.GREEN, 'Cleaning up shared memory...') Log(Fore.GREEN, 'Cleaning up shared memory...')
try: try:
p = subprocess.run(['sls_detector_get', 'free'], stdout=fp, stderr=fp) p = subprocess.run(['sls_detector_get', 'free'], stdout=fp, stderr=fp)
@ -87,8 +73,8 @@ def startProcessInBackground(name):
# in background and dont print output # in background and dont print output
p = subprocess.Popen(name.split(), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, restore_signals=False) p = subprocess.Popen(name.split(), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, restore_signals=False)
Log(Fore.GREEN, 'Starting up ' + name + ' ...') Log(Fore.GREEN, 'Starting up ' + name + ' ...')
except: except Exception as e:
Log(Fore.RED, 'Could not start ' + name) Log(Fore.RED, f'Could not start {name}:{e}')
raise raise
def startServer(name): def startServer(name):
@ -139,14 +125,19 @@ def loadConfig(name, rx_hostname, settingsdir):
def startCmdTests(name, fp, fname): def startCmdTests(name, fp, fname):
Log(Fore.GREEN, 'Cmd Tests for ' + name) Log(Fore.GREEN, 'Cmd Tests for ' + name)
cmd = 'tests --abort [.cmdcall] -s -o ' + fname cmd = 'tests --abort [.cmdcall] -s -o ' + fname
p = subprocess.run(cmd.split(), stdout=fp, stderr=fp, check=True, text=True) try:
p.check_returncode() subprocess.run(cmd.split(), stdout=fp, stderr=fp, check=True, text=True)
except subprocess.CalledProcessError as e:
pass
with open (fname, 'r') as f: with open (fname, 'r') as f:
for line in f: for line in f:
if "FAILED" in line: if "FAILED" in line:
msg = 'Cmd tests failed for ' + name + '!!!' msg = 'Cmd tests failed for ' + name + '!!!'
sys.stdout = original_stdout
Log(Fore.RED, msg) Log(Fore.RED, msg)
Log(Fore.RED, line)
sys.stdout = fp
raise Exception(msg) raise Exception(msg)
Log(Fore.GREEN, 'Cmd Tests successful for ' + name) Log(Fore.GREEN, 'Cmd Tests successful for ' + name)
@ -154,14 +145,18 @@ def startCmdTests(name, fp, fname):
def startGeneralTests(fp, fname): def startGeneralTests(fp, fname):
Log(Fore.GREEN, 'General Tests') Log(Fore.GREEN, 'General Tests')
cmd = 'tests --abort -s -o ' + fname cmd = 'tests --abort -s -o ' + fname
p = subprocess.run(cmd.split(), stdout=fp, stderr=fp, check=True, text=True) try:
p.check_returncode() subprocess.run(cmd.split(), stdout=fp, stderr=fp, check=True, text=True)
except subprocess.CalledProcessError as e:
pass
with open (fname, 'r') as f: with open (fname, 'r') as f:
for line in f: for line in f:
if "FAILED" in line: if "FAILED" in line:
msg = 'General tests failed !!!' msg = 'General tests failed !!!'
Log(Fore.RED, msg) sys.stdout = original_stdout
Log(Fore.RED, msg + '\n' + line)
sys.stdout = fp
raise Exception(msg) raise Exception(msg)
Log(Fore.GREEN, 'General Tests successful') Log(Fore.GREEN, 'General Tests successful')
@ -170,12 +165,10 @@ def startGeneralTests(fp, fname):
# parse cmd line for rx_hostname and settingspath using the argparse library # parse cmd line for rx_hostname and settingspath using the argparse library
parser = argparse.ArgumentParser(description = 'automated tests with the virtual detector servers') parser = argparse.ArgumentParser(description = 'automated tests with the virtual detector servers')
parser.add_argument('rx_hostname', help = 'hostname/ip of the current machine') parser.add_argument('rx_hostname', nargs='?', default='localhost', help = 'hostname/ip of the current machine')
parser.add_argument('settingspath', help = 'Relative or absolut path to the settingspath') parser.add_argument('settingspath', nargs='?', default='../../settingsdir', help = 'Relative or absolut path to the settingspath')
parser.add_argument('-s', '--servers', help='Detector servers to run', nargs='*') parser.add_argument('-s', '--servers', help='Detector servers to run', nargs='*')
args = parser.parse_args() args = parser.parse_args()
if args.rx_hostname == 'localhost':
raise RuntimeException('Cannot use localhost for rx_hostname for the tests (fails for rx_arping for eg.)')
if args.servers is None: if args.servers is None:
servers = [ servers = [
@ -203,16 +196,20 @@ Log(Fore.BLUE, '\nLog File: ' + fname)
with open(fname, 'w') as fp: with open(fname, 'w') as fp:
# general tests # general tests
file_results = prefix_fname + '_results_general.txt' file_results = prefix_fname + '_results_general.txt'
Log(Fore.BLUE, 'General tests (results: ' + file_results + ')') Log(Fore.BLUE, 'General tests (results: ' + file_results + ')')
sys.stdout = fp sys.stdout = fp
sys.stderr = fp sys.stderr = fp
Log(Fore.BLUE, 'General tests (results: ' + file_results + ')') Log(Fore.BLUE, 'General tests (results: ' + file_results + ')')
try:
startGeneralTests(fp, file_results) startGeneralTests(fp, file_results)
killAllStaleProcesses(fp)
killAllStaleProcesses() testError = False
for server in servers: for server in servers:
try: try:
# print to terminal for progress # print to terminal for progress
@ -225,24 +222,33 @@ with open(fname, 'w') as fp:
Log(Fore.BLUE, 'Cmd tests for ' + server + ' (results: ' + file_results + ')') Log(Fore.BLUE, 'Cmd tests for ' + server + ' (results: ' + file_results + ')')
# cmd tests for det # cmd tests for det
cleanup(server) cleanup(server, fp)
startServer(server) startServer(server)
startReceiver(server) startReceiver(server)
loadConfig(server, args.rx_hostname, args.settingspath) loadConfig(server, args.rx_hostname, args.settingspath)
startCmdTests(server, fp, file_results) startCmdTests(server, fp, file_results)
cleanup(server) cleanup(server, fp)
except:
Log(Fore.RED, 'Exception caught. Cleaning up.') except Exception as e:
cleanup(server) # redirect to terminal
sys.stdout = original_stdout sys.stdout = original_stdout
sys.stderr = original_stderr sys.stderr = original_stderr
Log(Fore.RED, 'Cmd tests failed for ' + server + '!!!') Log(Fore.RED, f'Exception caught while testing {server}. Cleaning up...')
raise testError = True
break
Log(Fore.GREEN, 'Passed all tests for virtual detectors \n' + str(servers))
# redirect to terminal # redirect to terminal
sys.stdout = original_stdout sys.stdout = original_stdout
sys.stderr = original_stderr sys.stderr = original_stderr
Log(Fore.GREEN, 'Passed all tests for virtual detectors \n' + str(servers) + '\nYayyyy! :) ') if not testError:
Log(Fore.GREEN, 'Passed all tests for virtual detectors \n' + str(servers))
except Exception as e:
# redirect to terminal
sys.stdout = original_stdout
sys.stderr = original_stderr
Log(Fore.RED, f'Exception caught with general testing. Cleaning up...')
cleanSharedmemory(sys.stdout)