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_OBJECT
- public:
- /// 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_OBJECT
- public:
- /// 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_OBJECT
- private 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"
|