diff --git a/tests/src/serverTestIfff.cpp b/tests/src/serverTestIfff.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ea06a77f25bebf114493f89e68a4ea1351f0afd7 --- /dev/null +++ b/tests/src/serverTestIfff.cpp @@ -0,0 +1,95 @@ +#define BOOST_TEST_MODULE serverTestXy +#include <boost/test/included/unit_test.hpp> + +#include <ChimeraTK/ControlSystemAdapter/Testing/ReferenceTestApplication.h> +#include <doocs-server-test-helper/doocsServerTestHelper.h> +#include <eq_client.h> +#include <random> +#include <thread> +#include <algorithm> + +#include "DoocsAdapter.h" +#include "serverBasedTestTools.h" + +using namespace boost::unit_test_framework; +using namespace ChimeraTK; + +static ReferenceTestApplication referenceTestApplication("serverTestIfff"); + +const std::string PROPERTY_NAME{"//CUSTOM/IFFF"}; + +/**********************************************************************************************************************/ + +extern int eq_server(int, char**); + +struct DoocsLauncher { + DoocsLauncher() { + // choose random RPC number + std::random_device rd; + std::uniform_int_distribution<int> dist(620000000, 999999999); + rpc_no = std::to_string(dist(rd)); + // update config file with the RPC number + std::string command = "sed -i serverTestIfff.conf -e " + "'s/^SVR.RPC_NUMBER:.*$/SVR.RPC_NUMBER: " + + rpc_no + "/'"; + auto rc = std::system(command.c_str()); + (void)rc; + + // start the server + doocsServerThread = std::thread(eq_server, boost::unit_test::framework::master_test_suite().argc, + boost::unit_test::framework::master_test_suite().argv); + // wait until server has started (both the update thread and the rpc thread) + EqCall eq; + EqAdr ea; + EqData src, dst; + ea.adr("doocs://localhost:" + rpc_no + "/F/D/INT/TO_DEVICE_SCALAR"); + while(eq.get(&ea, &src, &dst)) usleep(100000); + referenceTestApplication.initialiseManualLoopControl(); + } + + /** + * @brief For compatibility with older DOOCS versions declare our own eq_exit + * + * Can be removed once a new doocs server version is released. + */ + void eq_exit() { + auto nativeHandle = doocsServerThread.native_handle(); + if(nativeHandle != 0) pthread_kill(nativeHandle, SIGTERM); + } + + ~DoocsLauncher() { + referenceTestApplication.releaseManualLoopControl(); + eq_exit(); + doocsServerThread.join(); + } + + std::thread doocsServerThread; + static std::string rpc_no; +}; +std::string DoocsLauncher::rpc_no; + +BOOST_GLOBAL_FIXTURE(DoocsLauncher); + +/**********************************************************************************************************************/ + +BOOST_AUTO_TEST_CASE(testIfffUpdate) { + std::cout << "testIfffUpdate" << std::endl; + + + auto extractValue = []() -> IFFF { + auto d_ifff = getDoocsProperty<D_ifff>(PROPERTY_NAME); + auto location = getLocationFromPropertyAddress(PROPERTY_NAME); + IFFF value; // a copy of the value. We don't want to hold the location lock longer than needed + + location->lock(); + value = *(d_ifff->value()); // value returs a pointer which we only must dereference while holding the lock. So we make a copy + location->unlock(); + return value; + }; + + auto value = extractValue(); + // FIXME put correct vales what to expect + BOOST_CHECK_CLOSE(value.f1_data, 123., 0.0001); +} + +/**********************************************************************************************************************/