Skip to content
Snippets Groups Projects
Commit 23580900 authored by Jonathan Hanks's avatar Jonathan Hanks
Browse files

Merge branch 'work_on_daqd_stall_test' into 'master'

Reworked the daqd stall signal test to be a python application.

See merge request cds/advligorts!165
parents b7c857cc 9989cb03
No related branches found
No related tags found
1 merge request!165Reworked the daqd stall signal test to be a python application.
project(daqd-trunk) project(daqd-trunk)
cmake_minimum_required(VERSION 3.0) cmake_minimum_required(VERSION 3.12)
enable_testing() enable_testing()
...@@ -29,6 +29,7 @@ FIND_PACKAGE(Boost COMPONENTS filesystem system) ...@@ -29,6 +29,7 @@ FIND_PACKAGE(Boost COMPONENTS filesystem system)
FIND_PACKAGE(RapidJSON) FIND_PACKAGE(RapidJSON)
FIND_PACKAGE(RPC) FIND_PACKAGE(RPC)
FIND_PACKAGE(libcds-pubsub) FIND_PACKAGE(libcds-pubsub)
FIND_PACKAGE(Python3)
CHECK_CXX_SOURCE_COMPILES("#include <iostream> CHECK_CXX_SOURCE_COMPILES("#include <iostream>
#include <FlexLexer.h> #include <FlexLexer.h>
......
...@@ -213,17 +213,14 @@ if (libNDS2Client_FOUND) ...@@ -213,17 +213,14 @@ if (libNDS2Client_FOUND)
configure_file(tests/daqdrc_nds_test ${CMAKE_CURRENT_BINARY_DIR}/daqdrc_nds_test COPYONLY) configure_file(tests/daqdrc_nds_test ${CMAKE_CURRENT_BINARY_DIR}/daqdrc_nds_test COPYONLY)
configure_file(tests/test_daqd_nds.sh.in ${CMAKE_CURRENT_BINARY_DIR}/test_daqd_nds.sh @ONLY) configure_file(tests/test_daqd_nds.sh.in ${CMAKE_CURRENT_BINARY_DIR}/test_daqd_nds.sh @ONLY)
configure_file(tests/test_daqd_stall_signal.sh.in ${CMAKE_CURRENT_BINARY_DIR}/test_daqd_stall_signal.sh @ONLY) add_test(NAME test_daqd_stall_signal
COMMAND "${Python3_EXECUTABLE}" -B "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_daqd_stall_signal.py"
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
add_test(NAME test_daqd_nds add_test(NAME test_daqd_nds
COMMAND /bin/bash ./test_daqd_nds.sh COMMAND /bin/bash ./test_daqd_nds.sh
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
add_test(NAME test_daqd_stall_signal
COMMAND /bin/bash ./test_daqd_stall_signal.sh
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
add_executable(test_nds1_connections tests/test_nds1_connections.cc) add_executable(test_nds1_connections tests/test_nds1_connections.cc)
target_link_libraries(test_nds1_connections PUBLIC nds2client::cxx target_link_libraries(test_nds1_connections PUBLIC nds2client::cxx
${CMAKE_THREAD_LIBS_INIT}) ${CMAKE_THREAD_LIBS_INIT})
......
#!/usr/bin/python3
import os.path
import tempfile
import shutil
import subprocess
import time
import epics
TDIR = ""
PID_MULTI_STREAM = None
PID_DAQD = None
def cleanup():
if TDIR != "":
shutil.rmtree(TDIR, ignore_errors=True)
if PID_MULTI_STREAM is not None:
PID_MULTI_STREAM.kill()
if PID_DAQD is not None:
PID_DAQD.kill()
def check_access(path):
with open(path, "w"):
pass
def stall_cb(pvname, value, status, **kwargs):
print("{0}={1} ({2})".format(pvname, value, status))
try:
MULTI_STREAM = "../fe_stream_test/fe_multi_stream_test"
if not os.path.exists(MULTI_STREAM):
raise (RuntimeError("Unable to find the streamer at {0}".format(MULTI_STREAM)))
DAQD = "./daqd"
if not os.path.exists(DAQD):
raise (RuntimeError("Unable to file the daqd at {0}".format(DAQD)))
check_access("/dev/gpstime")
check_access("/dev/mbuf")
TDIR = tempfile.mkdtemp()
INI_DIR = os.path.join(TDIR, "ini_files")
MASTER_FILE = os.path.join(INI_DIR, 'master')
TESTPOINT_FILE = ""
os.mkdir(INI_DIR)
LOG_DIR = os.path.join(TDIR, "logs")
os.mkdir(LOG_DIR)
FRAME_DIR = os.path.join(TDIR, "frames")
os.mkdir(FRAME_DIR)
FULL_FRAME_DIR = os.path.join(FRAME_DIR, "full")
os.mkdir(FULL_FRAME_DIR)
print("Ini dir = {0}".format(INI_DIR))
with open(os.path.join(LOG_DIR, 'multi_stream.log'), 'wt') as multi_log:
PID_MULTI_STREAM = subprocess.Popen(args=[
MULTI_STREAM,
'-i', INI_DIR,
'-M', MASTER_FILE,
'-b', 'local_dc',
'-m', '100',
'-k', '700',
'-R', '100',
],
stdin=None,
stdout=multi_log,
stderr=subprocess.STDOUT,
)
print("Streamer PID = {0}".format(PID_MULTI_STREAM.pid))
time.sleep(1)
with open('daqdrc_live_test', 'rt') as f:
data = f.read()
data = data.replace('MASTER', MASTER_FILE)
data = data.replace('TESTPOINT', TESTPOINT_FILE)
with open('daqdrc_stall_test_final', 'wt') as out_f:
out_f.write(data)
with open(os.path.join(LOG_DIR, 'daqd.log'), 'wt') as daqd_log:
PID_DAQD = subprocess.Popen(args=[DAQD,
'-c', 'daqdrc_stall_test_final'],
stdin=None,
stdout=daqd_log,
stderr=subprocess.STDOUT)
print("Daqd PID = {0}".format(PID_DAQD.pid))
tries = 0
NotStalled = epics.PV("X3:DAQ-SHM0_PRDCR_NOT_STALLED", callback=stall_cb)
if NotStalled.wait_for_connection(timeout=20):
print("Not connected after 10s")
while NotStalled.get() != 1:
print('X3:DAQ-SHM0_PRDCR_NOT_STALLED={0}'.format(NotStalled.get()))
tries += 1
if tries > 1000:
raise RuntimeError("The daqd did not leave the stalled state")
time.sleep(2)
print("Killing the streamer")
PID_MULTI_STREAM.kill()
PID_MULTI_STREAM = None
time.sleep(2)
tries = 0
while NotStalled.get() == 1:
tries += 1
if tries > 10:
raise RuntimeError("The daqd did not enter the stalled state")
time.sleep(1)
NotStalled.disconnect()
del NotStalled
finally:
cleanup()
#!/bin/bash
CWD="@CMAKE_CURRENT_BINARY_DIR@"
TDIR=""
PID_MULTI_STREAM=0
PID_DAQD=0
function kill_proc {
if [ $1 -gt 0 ]; then
echo "Closing process $1"
kill $1
fi
}
function cleanup {
rm -rf daqdrc_live_test_final
if [ "x$TDIR" != "x" ]; then
if [ -d $TDIR ]; then
rm -rf "$TDIR"
fi
fi
kill_proc $PID_MULTI_STREAM
kill_proc $PID_DAQD
}
MUTLI_STREAM="$CWD/../fe_stream_test/fe_multi_stream_test"
if [ ! -x "$MUTLI_STREAM" ]; then
echo "cannot find $MULTI_STREAM"
exit 1
fi
DAQD="$CWD/../daqd/daqd"
if [ ! -x "$DAQD" ]; then
echo "cannot find $DAQD"
exit 1
fi
if [ ! -r /dev/gpstime ]; then
echo "the gpstime module must be loaded, configured, and accessible by this user"
exit 1
fi
if [ ! -r /dev/mbuf ]; then
echo "the mbuf module must be loaded, configured, and accessible by this user"
exit 1
fi
PYTHON=""
which python > /dev/null
if [ $? -eq 0 ]; then
PYTHON=`which python`
else
which python3 > /dev/null
if [ $? -eq 0 ]; then
PYTHON=`which python3`
else
echo "Cannot find python or python3"
exit 1
fi
fi
trap cleanup EXIT
TDIR=`$PYTHON -c "from __future__ import print_function; import tempfile; print(tempfile.mkdtemp())"`
mkdir "$TDIR/ini_files"
mkdir "$TDIR/logs"
mkdir "$TDIR/frames"
mkdir "$TDIR/frames/full"
echo "Ini dir = $TDIR/ini_files"
"$MUTLI_STREAM" -i "$TDIR/ini_files" -M "$TDIR/ini_files/master" -b local_dc -m 100 -k 700 -R 100 > "$TDIR/logs/multi_stream" &
PID_MULTI_STREAM=$!
echo "Streamer PID = PID_MULTI_STREAM"
sleep 1
MASTER_FILE="$TDIR/ini_files/master"
TESTPOINT_FILE=""
cat daqdrc_live_test | sed s\|MASTER\|$MASTER_FILE\| | sed s\|TESTPOINT\|$TESTPOINT_FILE\| > daqdrc_stall_test_final
"$DAQD" -c daqdrc_stall_test_final &> "$TDIR/logs/daqd" &
PID_DAQD=$!
echo "Daqd PID = $PID_DAQD"
sleep 5
tries=0
SVAL=`caget -F z -f 0 X3:DAQ-SHM0_PRDCR_NOT_STALLED | cut -d z -f 2`
while [ "$SVAL" -ne "1" ]; do
sleep 2
SVAL=`caget -F z -f 0 X3:DAQ-SHM0_PRDCR_NOT_STALLED | cut -d z -f 2`
let tries+=1
if [ "$tries" -gt "15" ]; then
echo "The daqd did not leave the stalled state"
exit 1
fi
done
echo "Killing the streamer"
kill $PID_MULTI_STREAM
PID_MULTI_STREAM=0
sleep 2
SVAL=`caget -F z -f 0 X3:DAQ-SHM0_PRDCR_NOT_STALLED | cut -d z -f 2`
tries=0
while [ "$SVAL" -ne "0" ]; do
echo "X3:DAQ-SHM0_PRDCR_NOT_STALLED = $SVAL"
let tries+=1
if [ "$tries" -gt "5" ]; then
echo "The daqd did not enter the stalled state"
exit 1
fi
sleep 1
SVAL=`caget -F z -f 0 X3:DAQ-SHM0_PRDCR_NOT_STALLED | cut -d z -f 2`
done
#echo "Press enter to continue..."
#DUMMY=""
#read DUMMY
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment