| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377 | /* *  ctkEventBusManagerTest.cpp *  ctkEventBusManagerTest * *  Created by Paolo Quadrani on 27/03/09. *  Copyright 2009 B3C. All rights reserved. * *  See Licence at: http://tiny.cc/QXJ4D * */#include "ctkTestSuite.h"#include <ctkEventBusManager.h>#include <ctkEventDefinitions.h>#include <ctkNetworkConnector.h>using namespace ctkEventBus;//-------------------------------------------------------------------------/** Class name: testObjectCustom Custom object needed for testing. */class testObjectCustom : public QObject {    Q_OBJECTpublic:    /// constructor.    testObjectCustom();    /// Return tha var's value.    int var() {return m_Var;}    /// register a custom callback    void registerCustomCallback();public Q_SLOTS:    /// Test slot that will increment the value of m_Var when an UPDATE_OBJECT event is raised.    void updateObject();    void setObjectValue(int v);    int returnObjectValue();Q_SIGNALS:    void valueModified(int v);    void objectModified();    int returnObjectValueSignal();private:    int m_Var; ///< Test var.};testObjectCustom::testObjectCustom() : m_Var(0) {}void testObjectCustom::updateObject() {    m_Var++;}void testObjectCustom::setObjectValue(int v) {    m_Var = v;}int testObjectCustom::returnObjectValue() {    int value = 5;    return value;}void testObjectCustom::registerCustomCallback() {    ctkRegisterLocalCallback("ctk/local/custom/topic", this, "updateObject()");}//------------------------------------------------------------------------------------------/** Class name: testNetworkConnectorForEventBus This class implements the network connector to be tested. */class  testNetworkConnectorForEventBus : public  ctkNetworkConnector {    Q_OBJECTpublic:    /// Object constructor.    testNetworkConnectorForEventBus();    /// Create and initialize client    /*virtual*/ void createClient(QString hostName, unsigned int port);    /// Return the string variable initializated and updated from the data pipe.    /*virtual*/ void createServer(unsigned int port);    /// Allow to send a network request.    /*virtual*/ void send(const QString event_id, ctkEventArgumentsList *params);    /// Start the server.    /*virtual*/ void startListen();    /// Return connector status.    QString connectorStatus();    /// retrieve instance of object    /*virtual*/ ctkNetworkConnector *clone();    /// register all the signals and slots    /*virtual*/ void initializeForEventBus();private:    QString m_ConnectorStatus; ///< Test Var.};ctkNetworkConnector *testNetworkConnectorForEventBus::clone() {    return new testNetworkConnectorForEventBus();}void testNetworkConnectorForEventBus::initializeForEventBus() {}testNetworkConnectorForEventBus::testNetworkConnectorForEventBus() : ctkNetworkConnector(), m_ConnectorStatus("") {     m_Protocol = "FakeProtocol";}void testNetworkConnectorForEventBus::createServer(unsigned int port) {    m_ConnectorStatus = "Server Created - Port: ";    m_ConnectorStatus.append(QString::number(port));}void testNetworkConnectorForEventBus::startListen() {    m_ConnectorStatus = "Server Listening";}void testNetworkConnectorForEventBus::createClient(QString hostName, unsigned int port) {    m_ConnectorStatus = "Client Created - Host: ";    m_ConnectorStatus.append(hostName);    m_ConnectorStatus.append(" Port: ");    m_ConnectorStatus.append(QString::number(port));}void testNetworkConnectorForEventBus::send(const QString event_id, ctkEventArgumentsList *params) {    Q_UNUSED(params);    m_ConnectorStatus = "Event sent with ID: ";    m_ConnectorStatus.append(event_id);}QString testNetworkConnectorForEventBus::connectorStatus() {    return m_ConnectorStatus;}//-------------------------------------------------------------------------/** Class name: ctkEventBusManagerTest This class implements the test suite for ctkEventBusManager. *///! <title>//ctkEventBusManager//! </title>//! <description>//ctkEventBusManager provides the access point of the Communication Bus for ctk framework and//allows dispatching events coming from local application to attached observers.//It provides APIs to add a new event property (observer or event) to the event bus hash or//to remove the event property from the event bus hash.//It also provides APIs to add or remove observer to the events and to register custom signals//use by objects to raise them events.////Sender has to://- Register a signal (with argument if necessary)////Observer has to://- Register the callback that will be called when event will be notified (with argument if necessary)// with the same Event ID used by the sender////The method "notifyEventLocal(QString topic, ctkEventArgumentsList *argList)" accept a string and a list//of QGenericArgument: to set QGenericArgument use the ctkEventArgument() macros.//ctkEventArgument() takes a type name and a const reference of that type.//! </description>class ctkEventBusManagerTest : public QObject {    Q_OBJECTprivate Q_SLOTS:    /// Initialize test variables    void initTestCase() {        m_EventBus = ctkEventBusManager::instance();        m_ObjTestObserver = new testObjectCustom();        m_ObjTestObserver2 = new testObjectCustom();    }    /// Cleanup tes variables memory allocation.    void cleanupTestCase() {        delete m_ObjTestObserver;        delete m_ObjTestObserver2;        m_EventBus->shutdown();    }    /// Check the existence of the ctkEventBusManager singletone creation.    void ctkEventBusManagerConstructorTest();    /// Check the event observing registration and notification.    void eventBusRegistrationNotificationTest();    /// Check the event observing registration and notification passing one argument.    void eventBusWithArgumentTest();    /// Check the event observing registration and notification returning one argument.    void eventBusWithReturnArgumentTest();    /// Event notification benchmarks.    void eventNotificationBenchmarkTest();    /// Test eventbus with remote connection (xmlrpc test)    void remoteConnectionTest();    /// test plugNetworkConnector    void plugNetworkConnectorTest();    /// test method for check if the signal is present.    void isLocalSignalPresentTest();    /// test registration reversing the order of signal and callback    void reverseOrderRegistrationTest();private:    testObjectCustom *m_ObjTestObserver; ///< Test variable.    testObjectCustom *m_ObjTestObserver2; ///< Test variable.    ctkEventBusManager *m_EventBus; ///< EventBus test variable instance.};void ctkEventBusManagerTest::ctkEventBusManagerConstructorTest() {    QVERIFY(m_EventBus != NULL);}void ctkEventBusManagerTest::eventBusRegistrationNotificationTest() {    int status = m_ObjTestObserver->var();    QVERIFY(status == 0);    // Create new Event ID used for callback and event notification.    QString updateID = "ctk/local/eventBus/globalUpdate";    ctkRegisterLocalCallback(updateID, m_ObjTestObserver, "updateObject()");    // Register also the second test observer to the global update event    ctkRegisterLocalCallback(updateID, m_ObjTestObserver2, "updateObject()");    // Notify the update event... (event logging is disabled)    m_EventBus->notifyEvent("ctk/local/eventBus/globalUpdate");    status = m_ObjTestObserver->var();    QVERIFY(status == 1);    // Notify again but with event logging enabled...    m_EventBus->enableEventLogging();    m_EventBus->notifyEvent(updateID);    // ... and now filter events only with ID == "CUSTOM_SIGNAL"    //ctkId customID = idProvider->createNewId("CUSTOM_SIGNAL");    QString customID = "CUSTOM_SIGNAL";    // ...and enable event logging for that id.    m_EventBus->logEventTopic(customID);    // Previous ID notification should be skipped by logger (so only one log in the console)    m_EventBus->notifyEvent(updateID);} void ctkEventBusManagerTest::eventBusWithArgumentTest() {    testObjectCustom *ObjTestSender = new testObjectCustom();    ObjTestSender->setObjectValue(52);    // Create new Event ID used for callback and event notification.    QString setValueID = "SETVALUE_SIGNAL";    ctkRegisterLocalSignal(setValueID, ObjTestSender, "valueModified(int)");    // Register the callback to update the object custom:    ctkRegisterLocalCallback(setValueID, m_ObjTestObserver, "setObjectValue(int)");    // Register also the second observer...    ctkRegisterLocalCallback(setValueID, m_ObjTestObserver2, "setObjectValue(int)");    //! <snippet>    ctkEventArgumentsList list;    list.append(ctkEventArgument(int, ObjTestSender->var()));    m_EventBus->notifyEvent(setValueID, ctkEventTypeLocal, &list);    //! </snippet>    int status = m_ObjTestObserver->var();    QVERIFY(status == ObjTestSender->var());    delete ObjTestSender;    ctkEventBusManager::instance()->removeSignal(ObjTestSender, setValueID);}void ctkEventBusManagerTest::eventBusWithReturnArgumentTest() {    testObjectCustom *ObjTestSender = new testObjectCustom();    ObjTestSender->setObjectValue(52);    // Create new Event ID used for callback and event notification.    QString returnValueID = "RETURNVALUE_SIGNAL";    ctkRegisterLocalSignal(returnValueID, ObjTestSender, "returnObjectValueSignal()");    ctkRegisterLocalCallback(returnValueID, ObjTestSender, "returnObjectValue()");    //Notify event with return argument    int returnValue = 0;    ctkGenericReturnArgument ret_val = ctkEventReturnArgument(int,returnValue);    m_EventBus->notifyEvent(returnValueID, ctkEventTypeLocal, NULL, &ret_val);    QVERIFY(returnValue == 5);    delete ObjTestSender;}void ctkEventBusManagerTest::eventNotificationBenchmarkTest() {    QString updateID = "ctk/local/eventBus/globalUpdate";    m_EventBus->logAllEvents();    QBENCHMARK {        m_EventBus->notifyEvent(updateID);    }}void ctkEventBusManagerTest::remoteConnectionTest() {    m_EventBus->createServer("XMLRPC", 8000);    m_EventBus->startListen();    m_EventBus->createClient("XMLRPC", "localhost", 8000);    //create list to send from the client    //first parameter is a list which contains event properties    QVariantList eventParameters;    eventParameters.append("ctk/local/eventBus/globalUpdate");    eventParameters.append(ctkEventTypeLocal);    eventParameters.append(ctkSignatureTypeCallback);    eventParameters.append("updateObject()");    QVariantList dataParameters;    ctkEventArgumentsList listToSend;    listToSend.append(ctkEventArgument(QVariantList, eventParameters));    listToSend.append(ctkEventArgument(QVariantList, dataParameters));    //with eventbus    QString topic = "ctk/remote/eventBus/comunication/send/xmlrpc";    m_EventBus->notifyEvent(topic, ctkEventTypeRemote , &listToSend);    QTime dieTime = QTime::currentTime().addSecs(3);    while(QTime::currentTime() < dieTime) {       QCoreApplication::processEvents(QEventLoop::AllEvents, 3);    }}void ctkEventBusManagerTest::plugNetworkConnectorTest() {    m_EventBus->plugNetworkConnector("CUSTOM_CONNECTOR", NULL);}void ctkEventBusManagerTest::isLocalSignalPresentTest() {    QVERIFY(m_EventBus->isLocalSignalPresent("ctk/invalid/signal") == false);}void ctkEventBusManagerTest::reverseOrderRegistrationTest() {    testObjectCustom *ObjTestSender = new testObjectCustom();    int startValue = 42;    m_ObjTestObserver->setObjectValue(startValue);    //register a custom callback    m_ObjTestObserver->registerCustomCallback();    //register custom signal    ctkRegisterLocalSignal("ctk/local/custom/topic", ObjTestSender, "objectModified()");    //notify event    m_EventBus->notifyEvent("ctk/local/custom/topic");    startValue++; //notify will update the value adding 1    int check = m_ObjTestObserver->var();    QVERIFY(startValue == check);    delete ObjTestSender;}CTK_REGISTER_TEST(ctkEventBusManagerTest);#include "ctkEventBusManagerTest.moc"
 |