/** * @RDE_HEADER@ * Unit test for ExerciseManagement (EXM) * $Id$ * $HeadURL$ * $Author$ * Created by Hanna E. Rathje, SLSE, 2015-08-20 */ #include "data_topic_tests.h" #include #include #include #include #include #include #include #include DataTopicTests::DataTopicTests() : m_domainParticipantPub(nullptr) , m_domainParticipantSub(nullptr) , m_domainId(0) , m_ddsPublisher(nullptr) , m_dtsExercise(nullptr) , m_ddsSubscriber(nullptr) , m_subscriberListener(nullptr) , m_subscriberListenerBinder(nullptr) , m_dtcExercise(nullptr) , m_mainThreadId(QThread::currentThreadId()) , m_logger(NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger("UnitTests.DataTopicTests")) { if (!DDS::QosProfile::setDefault()) ERROR_LOG(m_logger) << "Error setting default QoS from xml-file "; DEBUG_LOG(m_logger) << "Main thread ID is " << m_mainThreadId; } DataTopicTests::~DataTopicTests() { // Publisher delete m_dtsExercise; // Subscriber delete m_dtcExercise; m_subscriberListener->prepareShutdown(); m_subscriberListenerBinder = nullptr; m_ddsSubscriber = nullptr; m_ddsPublisher = nullptr; m_domainParticipantSub = nullptr; m_domainParticipantPub = nullptr; } /** * Publisher **/ bool DataTopicTests::initPublisher() { m_domainParticipantPub = dds::domain::DomainParticipant(m_domainId, DDS::QosProfile::domainParticipantShm()); dds::pub::qos::PublisherQos publisherQos = m_domainParticipantPub.default_publisher_qos(); // ExerciseData will be published to Partition 0 // use only selected partition const std::string partition = IDL::exercisePartition(0); dds::core::policy::Partition partitionQos; partitionQos.name( { partition } ); publisherQos << partitionQos; DEBUG_LOG(m_logger) << "Publish on partition " << partition; m_ddsPublisher = dds::pub::Publisher(m_domainParticipantPub, publisherQos); // Create DTS Exercise m_dtsExercise = new DTS::ExerciseImpl(m_domainParticipantPub, m_ddsPublisher); return true; } bool DataTopicTests::write(const ExerciseManagement::Exercise &data) { INFO_LOG(m_logger) << "Publish topic Exercise "; DEBUG_LOG(m_logger) << "ExeId: " << data.id() << ", state: " << data.state() << ", partitionName: " << data.partitionName(); return m_dtsExercise->write(data); } /** * Subscriber **/ bool DataTopicTests::initSubscriber() { DEBUG_LOG(m_logger) << "Initialisation DDS (Subscriber/Reader)"; m_domainParticipantSub = dds::domain::DomainParticipant(m_domainId, DDS::QosProfile::domainParticipantShm()); dds::sub::qos::SubscriberQos subscriberQos = m_domainParticipantSub.default_subscriber_qos(); // Initial Partition for listening on topic Exercise => partition 0 // + Listening for Topics in partition 1 dds::core::StringSeq partitions; for(int partitionId : { 0, 1 } ) { QString partition= QString::fromStdString(IDL::exercisePartition(partitionId)); partitions.push_back(partition.toStdString()); } dds::core::policy::Partition partitionQos; partitionQos.name( partitions ); subscriberQos << partitionQos; DEBUG_LOG(m_logger) << "Initialise DTC::SubscriberListener"; m_subscriberListener = new DDSGeneric::SubscriberListener(); m_ddsSubscriber = dds::sub::Subscriber(m_domainParticipantSub, subscriberQos); m_subscriberListenerBinder = rti::core::bind_and_manage_listener(m_ddsSubscriber, m_subscriberListener, DDSGeneric::SubscriberListener::mask()); // Initialise DTC for Topic Exercise m_dtcExercise = new DTC::ExerciseImpl(m_domainParticipantSub, m_ddsSubscriber, m_subscriberListener); m_dtcExercise->setSubscriberCallback([this](const ExerciseManagement::Exercise &data, DataModification modType) { processData(data, modType); } ); return true; } void DataTopicTests::processData(const ExerciseManagement::Exercise &instance, DataModification modType) { Q_UNUSED(modType); INFO_LOG(m_logger) << "process Lts_Exercise"; DEBUG_LOG(m_logger) << "exerciseId: " << instance.id(); DEBUG_LOG(m_logger) << "name: " << instance.name(); DEBUG_LOG(m_logger) << "state: " << instance.state(); m_receivedExerciseData = instance; QCOMPARE(m_mainThreadId, QThread::currentThreadId()); emit exerciseDataArrived(); }