diff --git a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServerv8.0.0 b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServerv8.0.0 index 8e0f1a039..d0f5ecbe3 100755 Binary files a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServerv8.0.0 and b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServerv8.0.0 differ diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServerv8.0.0 b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServerv8.0.0 index 9e20cbdc1..848eb4610 100755 Binary files a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServerv8.0.0 and b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServerv8.0.0 differ diff --git a/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServerv8.0.0 b/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServerv8.0.0 index b328a28d6..1870c870a 100755 Binary files a/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServerv8.0.0 and b/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServerv8.0.0 differ diff --git a/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServerv8.0.0 b/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServerv8.0.0 index 66996aebf..98e210ae5 100755 Binary files a/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServerv8.0.0 and b/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServerv8.0.0 differ diff --git a/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServerv8.0.0 b/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServerv8.0.0 index 2249197b5..837dca58a 100755 Binary files a/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServerv8.0.0 and b/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServerv8.0.0 differ diff --git a/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServerv8.0.0 b/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServerv8.0.0 index 1c0a4d72b..16844fdcd 100755 Binary files a/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServerv8.0.0 and b/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServerv8.0.0 differ diff --git a/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServerv8.0.0 b/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServerv8.0.0 index e32b1a080..46385739e 100755 Binary files a/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServerv8.0.0 and b/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServerv8.0.0 differ diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h index 4bf70907f..7d5cbd35c 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h @@ -17,7 +17,7 @@ const char *getRetName(); void function_table(); void functionNotImplemented(); void modeNotImplemented(char *modename, int mode); -int executeCommand(char *command, char *result, enum TLogLevel level); +void executeCommand(char *command, char *result, enum TLogLevel level); int M_nofunc(int); #if defined(MYTHEN3D) || defined(GOTTHARD2D) void rebootNiosControllerAndFPGA(); diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index 5ff4d9925..e15bdbc15 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -516,7 +516,7 @@ void modeNotImplemented(char *modename, int mode) { LOG(logERROR, (mess)); } -int executeCommand(char *command, char *result, enum TLogLevel level) { +void executeCommand(char *command, char *result, enum TLogLevel level) { ret = OK; memset(mess, 0, sizeof(mess)); @@ -532,6 +532,11 @@ int executeCommand(char *command, char *result, enum TLogLevel level) { fflush(stdout); FILE *sysFile = popen(cmd, "r"); + if (sysFile == NULL) { + ret = FAIL; + sprintf(mess, "Executing cmd[%s] failed\n", cmd); + return; + } while (fgets(temp, tempsize, sysFile) != NULL) { // size left excludes terminating character size_t sizeleft = MAX_STR_LENGTH - strlen(result) - 1; @@ -547,17 +552,14 @@ int executeCommand(char *command, char *result, enum TLogLevel level) { if (strlen(result) == 0) { strcpy(result, "No result"); } - - int retval = OK; int success = pclose(sysFile); - if (success) { - retval = FAIL; - LOG(logERROR, ("Executing cmd[%s]:%s\n", cmd, result)); + if (success == -1) { + ret = FAIL; + strcpy(mess, result); + LOG(logERROR, ("Executing cmd[%s] failed:%s\n", cmd, mess)); } else { LOG(level, ("Result:\n[%s]\n", result)); } - - return retval; } int M_nofunc(int file_des) { @@ -585,7 +587,7 @@ int exec_command(int file_des) { // set if (Server_VerifyLock() == OK) { - ret = executeCommand(cmd, retval, logINFO); + executeCommand(cmd, retval, logINFO); } return Server_SendResult(file_des, OTHER, retval, sizeof(retval)); } diff --git a/slsDetectorSoftware/tests/test-CmdProxy-jungfrau.cpp b/slsDetectorSoftware/tests/test-CmdProxy-jungfrau.cpp index f069a6f5d..ce1b75cdb 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-jungfrau.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy-jungfrau.cpp @@ -23,7 +23,7 @@ TEST_CASE("Setting and reading back Jungfrau dacs", "[.cmd][.dacs]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { + if (det_type == defs::JUNGFRAU) { SECTION("vb_comp") { test_dac(defs::VB_COMP, "vb_comp", 1220); } SECTION("vdd_prot") { test_dac(defs::VDD_PROT, "vdd_prot", 3000); } SECTION("vin_com") { test_dac(defs::VIN_COM, "vin_com", 1053); } @@ -163,7 +163,7 @@ TEST_CASE("chipversion", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { + if (det_type == defs::JUNGFRAU) { REQUIRE_NOTHROW(proxy.Call("chipversion", {}, -1, GET)); } else { REQUIRE_THROWS(proxy.Call("chipversion", {}, -1, GET)); diff --git a/slsDetectorSoftware/tests/test-CmdProxy-moench.cpp b/slsDetectorSoftware/tests/test-CmdProxy-moench.cpp index 78319f98b..fdcbaff24 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-moench.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy-moench.cpp @@ -18,5 +18,92 @@ using test::GET; using test::PUT; /* dacs */ +TEST_CASE("Setting and reading back moench dacs", "[.cmd][.dacs]") { + // vbp_colbuf, vipre, vin_cm, vb_sda, vcasc_sfp, vout_cm, vipre_cds, ibias_sfp + Detector det; + CmdProxy proxy(&det); + auto det_type = det.getDetectorType().squash(); + if (det_type == defs::MOENCH) { + SECTION("vbp_colbuf") { test_dac(defs::VBP_COLBUF, "vbp_colbuf", 1300); } + SECTION("vipre") { test_dac(defs::VIPRE, "vipre", 1000); } + SECTION("vin_cm") { test_dac(defs::VIN_CM, "vin_cm", 1400); } + SECTION("vb_sda") { + test_dac(defs::VB_SDA, "vb_sda", 680); + } + SECTION("vcasc_sfp") { test_dac(defs::VCASC_SFP, "vcasc_sfp", 1428); } + SECTION("vout_cm") { test_dac(defs::VOUT_CM, "vout_cm", 1200); } + SECTION("vipre_cds") { test_dac(defs::VIPRE_CDS, "vipre_cds", 800); } + SECTION("ibias_sfp") { test_dac(defs::IBIAS_SFP, "ibias_sfp", 900); } + // eiger + REQUIRE_THROWS(proxy.Call("vthreshold", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vsvp", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vsvn", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vtrim", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vrpreamp", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vrshaper", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vtgstv", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcmp_ll", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcmp_lr", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcal", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcmp_rl", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcmp_rr", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("rxb_rb", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("rxb_lb", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcp", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcn", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vishaper", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("iodelay", {}, -1, GET)); + // gotthard + REQUIRE_THROWS(proxy.Call("vref_ds", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcascn_pb", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcascp_pb", {}, -1, GET)); + // REQUIRE_THROWS(proxy.Call("vout_cm", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcasc_out", {}, -1, GET)); + // REQUIRE_THROWS(proxy.Call("vin_cm", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vref_comp", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("ib_test_c", {}, -1, GET)); + // mythen3 + REQUIRE_THROWS(proxy.Call("vrpreamp", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vrshaper", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vrshaper_n", {}, -1, GET)); + // REQUIRE_THROWS(proxy.Call("vipre", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vishaper", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vdcsh", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vth1", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vth2", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vth3", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcal_n", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcal_p", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vtrim", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcassh", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcas", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vicin", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vipre_out", {}, -1, GET)); + // gotthard2 + REQUIRE_THROWS(proxy.Call("vref_h_adc", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vb_comp_fe", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vb_comp_adc", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcom_cds", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vref_rstore", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vb_opa_1st", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vref_comp_fe", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcom_adc1", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vref_l_adc", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vref_cds", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vb_cs", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vb_opa_fd", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcom_adc2", {}, -1, GET)); + // jungfrau + REQUIRE_THROWS(proxy.Call("vb_comp", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vdd_prot", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vin_com", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vref_prech", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vb_pixbuf", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vb_ds", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vref_ds", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vref_comp", {}, -1, GET)); + } +} + } // namespace sls diff --git a/slsDetectorSoftware/tests/test-CmdProxy.cpp b/slsDetectorSoftware/tests/test-CmdProxy.cpp index 6e819ecd9..5044e50e6 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy.cpp @@ -2064,7 +2064,7 @@ TEST_CASE("defaultdac", "[.cmd]") { det.setDefaultDac(it, prev_val[i], {i}); } } - if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { + if (det_type == defs::JUNGFRAU) { std::vector daclist = { defs::VREF_PRECH, defs::VREF_DS, defs::VREF_COMP}; for (auto it : daclist) { @@ -2417,10 +2417,13 @@ TEST_CASE("scan", "[.cmd]") { notImplementedInd = defs::VCASCP_PB; break; case defs::JUNGFRAU: - case defs::MOENCH: ind = defs::VB_COMP; notImplementedInd = defs::VSVP; break; + case defs::MOENCH: + ind = defs::VIN_CM; + notImplementedInd = defs::VSVP; + break; case defs::GOTTHARD: ind = defs::VREF_DS; notImplementedInd = defs::VSVP; @@ -3472,7 +3475,7 @@ TEST_CASE("lock", "[.cmd]") { TEST_CASE("execcommand", "[.cmd]") { Detector det; CmdProxy proxy(&det); - REQUIRE_NOTHROW(proxy.Call("execcommand", {"ls"}, -1, PUT)); + REQUIRE_NOTHROW(proxy.Call("execcommand", {"ls *.txt"}, -1, PUT)); } TEST_CASE("framecounter", "[.cmd]") { diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index 8a90e82d9..7665d69bd 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -4,10 +4,10 @@ #define RELEASE "8.0.0" #define APILIB "8.0.0 0x231025" #define APIRECEIVER "8.0.0 0x231025" -#define APICTB "8.0.0 0x231025" -#define APIGOTTHARD "8.0.0 0x231025" -#define APIGOTTHARD2 "8.0.0 0x231025" -#define APIJUNGFRAU "8.0.0 0x231025" -#define APIMYTHEN3 "8.0.0 0x231025" -#define APIMOENCH "8.0.0 0x231025" -#define APIEIGER "8.0.0 0x231025" +#define APICTB "8.0.0 0x231031" +#define APIGOTTHARD "8.0.0 0x231031" +#define APIGOTTHARD2 "8.0.0 0x231031" +#define APIJUNGFRAU "8.0.0 0x231031" +#define APIMYTHEN3 "8.0.0 0x231031" +#define APIMOENCH "8.0.0 0x231031" +#define APIEIGER "8.0.0 0x231031" diff --git a/tests/scripts/test_simulators.py b/tests/scripts/test_simulators.py index 24ee6f4dd..2ae0ae2b8 100644 --- a/tests/scripts/test_simulators.py +++ b/tests/scripts/test_simulators.py @@ -21,29 +21,37 @@ class RuntimeException (Exception): def Log(color, message): print('\n' + color + message, flush=True) + def checkIfProcessRunning(processName): - ''' - Check if there is any running process that contains the given name processName. - https://gist.github.com/Sanix-Darker/8cbed2ff6f8eb108ce2c8c51acd2aa5a - ''' - # Iterate over the all the running process - for proc in psutil.process_iter(): - try: - # Check if process name contains the given name string. - if processName.lower() in proc.name().lower(): - return True - except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): - pass - return False; + cmd = "ps -ef | grep " + processName + print(cmd) + res=subprocess.getoutput(cmd) + print(res) + # 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): if checkIfProcessRunning(name): Log(Fore.GREEN, 'killing ' + name) p = subprocess.run(['killall', name]) if p.returncode != 0: - raise RuntimeException('error in killall ' + name) + raise RuntimeException('killall failed for ' + name) + else: + print('process not running : ' + name) -def cleanup(name, d): +def cleanup(name): ''' kill both servers, receivers and clean shared memory ''' @@ -51,18 +59,27 @@ def cleanup(name, d): killProcess(name + 'DetectorServer_virtual') killProcess('slsReceiver') killProcess('slsMultiReceiver') - d.freeSharedMemory() + cleanSharedmemory() + +def cleanSharedmemory(): + Log(Fore.GREEN, 'Cleaning up shared memory...') + try: + p = subprocess.run(['sls_detector_get', 'free'], stdout=fp, stderr=fp) + except: + Log(Fore.RED, 'Could not free shared memory') + raise def startProcessInBackground(name): try: # in background and dont print output - p = subprocess.Popen(name.split(), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + p = subprocess.Popen(name.split(), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, restore_signals=False) Log(Fore.GREEN, 'Starting up ' + name + ' ...') except: Log(Fore.RED, 'Could not start ' + name) raise def startServer(name): + startProcessInBackground(name + 'DetectorServer_virtual') # second half if name == 'eiger': @@ -79,6 +96,7 @@ def startReceiver(name): time.sleep(2) def loadConfig(name, rx_hostname, settingsdir): + Log(Fore.GREEN, 'Loading config') try: d = Detector() if name == 'eiger': @@ -106,25 +124,36 @@ def loadConfig(name, rx_hostname, settingsdir): Log(Fore.RED, 'Could not load config for ' + name) raise -def startCmdTests(name, fp): - try: - p = subprocess.run(['tests', '--abort', '[.cmd]'], stdout=fp, stderr=fp) - if p.returncode != 0: - raise Exception - except: - Log(Fore.RED, 'Cmd tests failed for ' + name) - raise +def startCmdTests(name, fp, fname): + Log(Fore.GREEN, 'Cmd Tests for ' + name) + cmd = 'tests --abort [.cmd] -s -o ' + fname + p = subprocess.run(cmd.split(), stdout=fp, stderr=fp, check=True, text=True) + p.check_returncode() + + with open (fname, 'r') as f: + for line in f: + if "FAILED" in line: + msg = 'Cmd tests failed for ' + name + '!!!' + Log(Fore.RED, msg) + raise Exception(msg) + + Log(Fore.GREEN, 'Cmd Tests successful for ' + name) + +def startGeneralTests(fp, fname): + Log(Fore.GREEN, 'General Tests') + cmd = 'tests --abort -s -o ' + fname + p = subprocess.run(cmd.split(), stdout=fp, stderr=fp, check=True, text=True) + p.check_returncode() + + with open (fname, 'r') as f: + for line in f: + if "FAILED" in line: + msg = 'General tests failed !!!' + Log(Fore.RED, msg) + raise Exception(msg) + + Log(Fore.GREEN, 'General Tests successful') -def startNormalTests(d, fp): - try: - Log(Fore.BLUE, '\nNormal tests') - p = subprocess.run(['tests', '--abort' ], stdout=fp, stderr=fp) - if p.returncode != 0: - raise Exception - d.freeSharedMemory() - except: - Log(Fore.RED, 'Normal tests failed') - raise # parse cmd line for rx_hostname and settingspath using the argparse library @@ -149,46 +178,51 @@ if args.servers is None: else: servers = args.servers -Log(Fore.WHITE, 'rx_hostname: ' + args.rx_hostname + '\settingspath: \'' + args.settingspath + '\'') - -# handle zombies (else killing slsReceivers will fail) -# dont care about child process success -signal.signal(signal.SIGCHLD, signal.SIG_IGN) +Log(Fore.WHITE, 'Arguments:\nrx_hostname: ' + args.rx_hostname + '\nsettingspath: \'' + args.settingspath + '\'') # redirect to file +prefix_fname = '/tmp/slsDetectorPackage_virtual_test' original_stdout = sys.stdout original_stderr = sys.stderr -fname = '/tmp/slsDetectorPackage_virtual_test.txt' -Log(Fore.BLUE, 'Tests -> ' + fname) +fname = prefix_fname + '_log.txt' +Log(Fore.BLUE, '\nLog File: ' + fname) + with open(fname, 'w') as fp: + + # general tests + file_results = prefix_fname + '_results_general.txt' + Log(Fore.BLUE, 'General tests (results: ' + file_results + ')') sys.stdout = fp sys.stderr = fp - - d = Detector() - # TODO: redirect Detector object print out also to file - startNormalTests(d, fp) + Log(Fore.BLUE, 'General tests (results: ' + file_results + ')') + startGeneralTests(fp, file_results) for server in servers: try: # print to terminal for progress sys.stdout = original_stdout sys.stderr = original_stderr - Log(Fore.BLUE, server + ' tests') + file_results = prefix_fname + '_results_cmd_' + server + '.txt' + Log(Fore.BLUE, 'Cmd tests for ' + server + ' (results: ' + file_results + ')') sys.stdout = fp sys.stderr = fp + Log(Fore.BLUE, 'Cmd tests for ' + server + ' (results: ' + file_results + ')') # cmd tests for det - Log(Fore.BLUE, 'Cmd Tests for ' + server) - cleanup(server, d) + cleanup(server) startServer(server) startReceiver(server) loadConfig(server, args.rx_hostname, args.settingspath) - startCmdTests(server, fp) - cleanup(server, d) + startCmdTests(server, fp, file_results) + cleanup(server) except: - cleanup(server, d) + Log(log.RED, 'Exception caught. Cleaning up.') + cleanup(server) + sys.stdout = original_stdout + sys.stderr = original_stderr + Log(Fore.RED, 'Cmd tests failed for ' + server + '!!!') raise