mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-06-07 10:30:41 +02:00
Some checks failed
Native CMake Build / Configure and build using cmake (push) Failing after 3s
* Python module is now built using scikit-build-core: Dev/scikitbuild #1164 * slsdet is available on PyPI from this release onwards * Fixed broken import in typecaster.h #1181 * Dev/automate version number #1193 * Dev/automate version part2 #1209 * 9111: added expat to host section to fix conda #1216 * fix for gotthard.py to import slsdet properly * added slsFramesynchronizer to conda copy_lib.sh * version of release * update version of client * removed cmake <=3.28 that was added in 9.1.11 (main_library in meta.yaml in conda-recipes) * added slsFrameSynchronizer binary to conda * added numpy dependency to toml * added documentation for pip in installation Detailed Commits: * skeleton pyproject.toml * moved compiled extension into slsdet * WIP * WI{ * separated the recipes * restored comments, cleanup * cleaned meta yaml * added back some python versions * conda build of main library * fixed typo * removed conda build pin * added zlib * added workflow for python lib * patching libzmq and cleaned up cmake * removed compiler version * switched patch tool * reverted to scikit-build in pyproject.toml * added sls_detector bin * added sync, renamed action * update cmake<=3.28 in conda build requirements * Fixed broken import in typecaster.h (#1181) - Fixed the broken import _slsdet --> slsdet._slsdet caused by a previous upgrade - added tests that exercises the conversion from python to C++ and from C++ to python - Python unit tests now run in CI (!) * removed 3.28 restriction on cmake in meta.yaml * from #1216 to 9.1.1.rc that got lost in merge from develoepr, added expat to host section to fix conda build * back with the cmake restriction * fixing gotthard1 import * version number automated for python build * mistakenly set version back to 0.0.0 * updated github workflow scripts to support automatic version numbering with environment variable * managed to load VERSION file in yaml file - simplifies things * saving changes in git workflow failed * got typo in github workflow * updatet regex pattern to support postfix * normalized version to PEP 440 specification in update_version.py * bug did not support version 0.0.0 * added regex pattern matching to version in toml file * version now supports . before postfix * updates api version based on version file & converted shell script files to python * updated all makefiles * adresses review comments * updated release version and the api lib version * raise an exception if the pull socket python script had errors at startup (for eg if pyzmq was not installed) * cmake<=3.28 not required anymore * updated documentation for pip installation as well * 920/add numpy (#1226) * added numpy dependency * aded build specifications for python version and platform * release notes --------- Co-authored-by: froejdh_e <erik.frojdh@psi.ch> Co-authored-by: Fröjd Lars Erik <froejdh_e@pcmoench03.psi.ch> Co-authored-by: Erik Fröjdh <erik.frojdh@gmail.com> Co-authored-by: mazzol_a <mazzol_a@pc17378.psi.ch> Co-authored-by: AliceMazzoleni99 <alice.mazzoleni@psi.ch>
142 lines
5.0 KiB
Python
142 lines
5.0 KiB
Python
# SPDX-License-Identifier: LGPL-3.0-or-other
|
|
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
'''
|
|
This file is used to start up simulators, frame synchronizer, pull sockets, acquire, test and kill them finally.
|
|
'''
|
|
|
|
import sys, time
|
|
import traceback, json
|
|
|
|
from slsdet import Detector
|
|
from slsdet.defines import DEFAULT_TCP_RX_PORTNO
|
|
|
|
from utils_for_test import (
|
|
Log,
|
|
LogLevel,
|
|
RuntimeException,
|
|
checkIfProcessRunning,
|
|
killProcess,
|
|
cleanup,
|
|
cleanSharedmemory,
|
|
startProcessInBackground,
|
|
startProcessInBackgroundWithLogFile,
|
|
checkLogForErrors,
|
|
startDetectorVirtualServer,
|
|
loadConfig,
|
|
ParseArguments
|
|
)
|
|
|
|
LOG_PREFIX_FNAME = '/tmp/slsFrameSynchronizer_test'
|
|
MAIN_LOG_FNAME = LOG_PREFIX_FNAME + '_log.txt'
|
|
PULL_SOCKET_PREFIX_FNAME = LOG_PREFIX_FNAME + '_pull_socket_'
|
|
|
|
|
|
def startFrameSynchronizerPullSocket(name, fp):
|
|
fname = PULL_SOCKET_PREFIX_FNAME + name + '.txt'
|
|
cmd = ['python', '-u', 'frameSynchronizerPullSocket.py']
|
|
startProcessInBackgroundWithLogFile(cmd, fp, fname)
|
|
time.sleep(1)
|
|
checkLogForErrors(fp, fname)
|
|
|
|
|
|
|
|
def startFrameSynchronizer(num_mods, fp):
|
|
cmd = ['slsFrameSynchronizer', str(DEFAULT_TCP_RX_PORTNO), str(num_mods)]
|
|
# in 10.0.0
|
|
#cmd = ['slsFrameSynchronizer', '-p', str(DEFAULT_TCP_RX_PORTNO), '-n', str(num_mods)]
|
|
startProcessInBackground(cmd, fp)
|
|
time.sleep(1)
|
|
|
|
|
|
def acquire(fp, det):
|
|
Log(LogLevel.INFO, 'Acquiring')
|
|
Log(LogLevel.INFO, 'Acquiring', fp)
|
|
det.acquire()
|
|
|
|
|
|
def testFramesCaught(name, det, num_frames):
|
|
fnum = det.rx_framescaught[0]
|
|
if fnum != num_frames:
|
|
raise RuntimeException(f"{name} caught only {fnum}. Expected {num_frames}")
|
|
|
|
Log(LogLevel.INFOGREEN, f'Frames caught test passed for {name}')
|
|
Log(LogLevel.INFOGREEN, f'Frames caught test passed for {name}', fp)
|
|
|
|
|
|
def testZmqHeadetTypeCount(name, det, num_mods, num_frames, fp):
|
|
|
|
Log(LogLevel.INFO, f"Testing Zmq Header type count for {name}")
|
|
Log(LogLevel.INFO, f"Testing Zmq Header type count for {name}", fp)
|
|
htype_counts = {
|
|
"header": 0,
|
|
"series_end": 0,
|
|
"module": 0
|
|
}
|
|
|
|
try:
|
|
# get a count of each htype from file
|
|
pull_socket_fname = PULL_SOCKET_PREFIX_FNAME + name + '.txt'
|
|
with open(pull_socket_fname, 'r') as log_fp:
|
|
for line in log_fp:
|
|
line = line.strip()
|
|
if not line or not line.startswith('{'):
|
|
continue
|
|
try:
|
|
data = json.loads(line)
|
|
htype = data.get("htype")
|
|
if htype in htype_counts:
|
|
htype_counts[htype] += 1
|
|
except json.JSONDecodeError:
|
|
continue
|
|
|
|
# test if file contents matches expected counts
|
|
num_ports_per_module = 1 if name == "gotthard2" else det.numinterfaces
|
|
total_num_frame_parts = num_ports_per_module * num_mods * num_frames
|
|
for htype, expected_count in [("header", num_mods), ("series_end", num_mods), ("module", total_num_frame_parts)]:
|
|
if htype_counts[htype] != expected_count:
|
|
msg = f"Expected {expected_count} '{htype}' entries, found {htype_counts[htype]}"
|
|
raise RuntimeException(msg)
|
|
except Exception as e:
|
|
raise RuntimeException(f'Failed to get zmq header count type. Error:{str(e)}') from e
|
|
|
|
Log(LogLevel.INFOGREEN, f"Zmq Header type count test passed for {name}")
|
|
Log(LogLevel.INFOGREEN, f"Zmq Header type count test passed for {name}", fp)
|
|
|
|
|
|
def startTestsForAll(args, fp):
|
|
for server in args.servers:
|
|
try:
|
|
Log(LogLevel.INFOBLUE, f'Synchronizer Tests for {server}')
|
|
Log(LogLevel.INFOBLUE, f'Synchronizer Tests for {server}', fp)
|
|
cleanup(fp)
|
|
startDetectorVirtualServer(server, args.num_mods, fp)
|
|
startFrameSynchronizerPullSocket(server, fp)
|
|
startFrameSynchronizer(args.num_mods, fp)
|
|
d = loadConfig(name=server, rx_hostname=args.rx_hostname, settingsdir=args.settingspath, fp=fp, num_mods=args.num_mods, num_frames=args.num_frames)
|
|
acquire(fp, d)
|
|
testFramesCaught(server, d, args.num_frames)
|
|
testZmqHeadetTypeCount(server, d, args.num_mods, args.num_frames, fp)
|
|
Log(LogLevel.INFO, '\n')
|
|
except Exception as e:
|
|
raise RuntimeException(f'Synchronizer Tests failed') from e
|
|
|
|
Log(LogLevel.INFOGREEN, 'Passed all synchronizer tests for all detectors \n' + str(args.servers))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
args = ParseArguments(description='Automated tests to test frame synchronizer', default_num_mods=2)
|
|
|
|
Log(LogLevel.INFOBLUE, '\nLog File: ' + MAIN_LOG_FNAME + '\n')
|
|
|
|
with open(MAIN_LOG_FNAME, 'w') as fp:
|
|
try:
|
|
startTestsForAll(args, fp)
|
|
cleanup(fp)
|
|
except Exception as e:
|
|
with open(MAIN_LOG_FNAME, 'a') as fp_error:
|
|
traceback.print_exc(file=fp_error)
|
|
cleanup(fp)
|
|
Log(LogLevel.ERROR, f'Tests Failed.')
|
|
|
|
|