ctkPluginFrameworkTestSuite.cpp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839
  1. /*=============================================================================
  2. Library: CTK
  3. Copyright (c) 2010 German Cancer Research Center,
  4. Division of Medical and Biological Informatics
  5. Licensed under the Apache License, Version 2.0 (the "License");
  6. you may not use this file except in compliance with the License.
  7. You may obtain a copy of the License at
  8. http://www.apache.org/licenses/LICENSE-2.0
  9. Unless required by applicable law or agreed to in writing, software
  10. distributed under the License is distributed on an "AS IS" BASIS,
  11. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. See the License for the specific language governing permissions and
  13. limitations under the License.
  14. =============================================================================*/
  15. #include "ctkPluginFrameworkTestSuite_p.h"
  16. #include <ctkPluginFrameworkTestUtil.h>
  17. #include <ctkPluginContext.h>
  18. #include <ctkPluginConstants.h>
  19. #include <ctkPluginException.h>
  20. #include <ctkServiceException.h>
  21. #include <QDir>
  22. #include <QTest>
  23. #include <QDebug>
  24. int ctkPluginFrameworkTestSuite::nRunCount = 0;
  25. //----------------------------------------------------------------------------
  26. ctkPluginFrameworkTestSuite::ctkPluginFrameworkTestSuite(ctkPluginContext* pc)
  27. : eventDelay(500), pc(pc), p(pc->getPlugin())
  28. {
  29. }
  30. //----------------------------------------------------------------------------
  31. void ctkPluginFrameworkTestSuite::initTestCase()
  32. {
  33. qDebug() << "### plugin framework test suite: SETUP start";
  34. if (nRunCount > 0)
  35. {
  36. QFAIL("The ctkPluginFrameworkTestSuite CANNOT be run reliably more than once. Other test results in this suite are/may not be valid. Restart framework to retest: CLEANUP:FAIL");
  37. }
  38. ++nRunCount;
  39. try
  40. {
  41. bool success = pc->connectFrameworkListener(this, SLOT(frameworkListener(ctkPluginFrameworkEvent)));
  42. if (!success)
  43. {
  44. QFAIL("plugin framework test suite: SETUP:FAIL");
  45. }
  46. }
  47. catch (const std::logic_error& e)
  48. {
  49. QString msg = QString("plugin framework test suite ") + e.what() + ": SETUP:FAIL";
  50. QFAIL(msg.toAscii());
  51. }
  52. try
  53. {
  54. bool success = pc->connectPluginListener(this, SLOT(pluginListener(ctkPluginEvent)));
  55. if (!success)
  56. {
  57. QFAIL("plugin framework test suite: SETUP:FAIL");
  58. }
  59. }
  60. catch (const std::logic_error& e)
  61. {
  62. QString msg = QString("plugin framework test suite ") + e.what() + ": SETUP:FAIL";
  63. QFAIL(msg.toAscii());
  64. }
  65. try
  66. {
  67. bool success = pc->connectPluginListener(this, SLOT(syncPluginListener(ctkPluginEvent)), Qt::DirectConnection);
  68. if (!success)
  69. {
  70. QFAIL("plugin framework test suite: SETUP:FAIL");
  71. }
  72. }
  73. catch (const std::logic_error& e)
  74. {
  75. QString msg = QString("plugin framework test suite ") + e.what() + ": SETUP:FAIL";
  76. QFAIL(msg.toAscii());
  77. }
  78. try
  79. {
  80. pc->connectServiceListener(this, "serviceListener");
  81. }
  82. catch (const std::logic_error& e)
  83. {
  84. QString msg = QString("plugin framework test suite ") + e.what() + ": SETUP:FAIL";
  85. QFAIL(msg.toAscii());
  86. }
  87. qDebug() << "### plugin framework test suite: SETUP:PASS";
  88. }
  89. //----------------------------------------------------------------------------
  90. void ctkPluginFrameworkTestSuite::cleanupTestCase()
  91. {
  92. }
  93. //----------------------------------------------------------------------------
  94. // Verify information from the getHeaders() method
  95. void ctkPluginFrameworkTestSuite::frame005a()
  96. {
  97. QHash<QString, QString> headers = p->getHeaders();
  98. // check expected headers
  99. QString k = "Plugin-Name";
  100. QCOMPARE(QString("framework_test"), headers.value(k));
  101. k = "Plugin-Version";
  102. QCOMPARE(QString("1.0.1"), headers.value(k));
  103. k = "Plugin-Description";
  104. QCOMPARE(QString("Test bundle for the CTK plugin framework"), headers.value(k));
  105. k = "Plugin-Vendor";
  106. QCOMPARE(QString("CommonTK"), headers.value(k));
  107. k = "Plugin-DocURL";
  108. QCOMPARE(QString("http://www.commontk.org"), headers.value(k));
  109. k = "Plugin-ContactAddress";
  110. QCOMPARE(QString("http://www.commontk.org"), headers.value(k));
  111. k = "Plugin-Category";
  112. QCOMPARE(QString("test"), headers.value(k));
  113. k = "Plugin-Copyright";
  114. QCOMPARE(QString("German Cancer Research Center, Division of Medical and Biological Informatics"), headers.value(k));
  115. k = "Plugin-License";
  116. QCOMPARE(QString("http://www.apache.org/licenses/LICENSE-2.0.html"), headers.value(k));
  117. }
  118. //----------------------------------------------------------------------------
  119. // Extract all information from the getProperty in the ctkPluginContext class
  120. void ctkPluginFrameworkTestSuite::frame007a()
  121. {
  122. QList<QString> NNList;
  123. NNList << ctkPluginConstants::FRAMEWORK_VERSION
  124. << ctkPluginConstants::FRAMEWORK_VENDOR;
  125. foreach(QString k, NNList)
  126. {
  127. QVariant v = pc->getProperty(k);
  128. if(!v.isValid())
  129. {
  130. QString msg("'%1' not set");
  131. QFAIL(qPrintable(msg.arg(k)));
  132. }
  133. }
  134. }
  135. //----------------------------------------------------------------------------
  136. // Get context id, location and status of the plugin
  137. void ctkPluginFrameworkTestSuite::frame010a()
  138. {
  139. qlonglong contextid = p->getPluginId();
  140. qDebug() << "CONTEXT ID:" << contextid;
  141. QString location = p->getLocation();
  142. qDebug() << "LOCATION:" << location;
  143. ctkPlugin::State pstate = p->getState();
  144. qDebug() << "PCACTIVE:" << pstate;
  145. }
  146. //----------------------------------------------------------------------------
  147. //Test result of getService(ctkServiceReference()). Should throw std::invalid_argument
  148. void ctkPluginFrameworkTestSuite::frame018a()
  149. {
  150. try
  151. {
  152. QObject* obj = pc->getService(ctkServiceReference());
  153. qDebug() << "Got service object =" << obj->metaObject()->className() << ", excpected std::invalid_argument exception";
  154. QFAIL("Got service object, excpected std::invalid_argument exception");
  155. }
  156. catch (const std::invalid_argument& )
  157. {}
  158. catch (...)
  159. {
  160. QFAIL("Got wrong exception, expected std::invalid_argument");
  161. }
  162. }
  163. //----------------------------------------------------------------------------
  164. // Load pluginA_test and check that it exists and that its expected service does not exist,
  165. // also check that the expected events in the framework occur
  166. void ctkPluginFrameworkTestSuite::frame020a()
  167. {
  168. pA.clear();
  169. try
  170. {
  171. pA = ctkPluginFrameworkTestUtil::installPlugin(pc, "pluginA_test");
  172. }
  173. catch (ctkPluginException& e)
  174. {
  175. QFAIL(e.what());
  176. }
  177. const QHash<QString, QString> headers = pA->getHeaders();
  178. QHash<QString, QString>::const_iterator iter =
  179. headers.find(ctkPluginConstants::PLUGIN_SYMBOLICNAME);
  180. QVERIFY(iter != headers.end());
  181. QCOMPARE(iter.value(), QString("pluginA.test"));
  182. // Check that no service reference exist yet.
  183. ctkServiceReference sr1 = pc->getServiceReference("org.commontk.TestPluginAService");
  184. if (sr1)
  185. {
  186. QFAIL("framework test plugin, service from test plugin A unexpectedly found");
  187. }
  188. // check the listeners for events, expect only a plugin event,
  189. // of type installation
  190. bool lStat = checkListenerEvents(false, ctkPluginFrameworkEvent::PLUGIN_INFO, true , ctkPluginEvent::INSTALLED,
  191. false, ctkServiceEvent::MODIFIED, pA, 0);
  192. QVERIFY(pA->getState() == ctkPlugin::INSTALLED && lStat == true);
  193. }
  194. //----------------------------------------------------------------------------
  195. // Start pluginA_test and check that it gets state ACTIVE,
  196. // and that the service it registers exist
  197. void ctkPluginFrameworkTestSuite::frame025b()
  198. {
  199. try
  200. {
  201. pA->start();
  202. QVERIFY2(pA->getState() == ctkPlugin::ACTIVE, "pluginA_test should be ACTIVE");
  203. }
  204. catch (const ctkPluginException& pexcA)
  205. {
  206. QString failMsg = QString("Unexpected plugin exception: ") + pexcA.what();
  207. QFAIL(failMsg.toStdString().c_str());
  208. }
  209. catch (const std::logic_error& le)
  210. {
  211. QString failMsg = QString("Start plugin exception: ") + le.what();
  212. QFAIL(failMsg.toStdString().c_str());
  213. }
  214. // Check if pluginA_test registered the expected service
  215. try
  216. {
  217. ctkServiceReference sr1 = pc->getServiceReference("org.commontk.pluginAtest.TestPluginAService");
  218. QObject* o1 = pc->getService(sr1);
  219. QVERIFY2(o1 != 0, "no service object found");
  220. try
  221. {
  222. QVERIFY2(pc->ungetService(sr1), "Service unget should return true");
  223. }
  224. catch (const std::logic_error le)
  225. {
  226. QString failMsg = QString("Unget service exception: ") + le.what();
  227. QFAIL(failMsg.toStdString().c_str());
  228. }
  229. // check the listeners for events
  230. QList<ctkPluginEvent> pEvts;
  231. pEvts.push_back(ctkPluginEvent(ctkPluginEvent::RESOLVED, pA));
  232. pEvts.push_back(ctkPluginEvent(ctkPluginEvent::STARTED, pA));
  233. QList<ctkServiceEvent> seEvts;
  234. seEvts.push_back(ctkServiceEvent(ctkServiceEvent::REGISTERED, sr1));
  235. QVERIFY2(checkListenerEvents(QList<ctkPluginFrameworkEvent>(), pEvts, seEvts),
  236. "Unexpected events");
  237. QList<ctkPluginEvent> syncPEvts;
  238. syncPEvts.push_back(ctkPluginEvent(ctkPluginEvent::STARTING, pA));
  239. QVERIFY2(checkSyncListenerEvents(syncPEvts), "Unexpected events");
  240. }
  241. catch (const ctkServiceException& /*se*/)
  242. {
  243. QFAIL("framework test bundle, expected service not found");
  244. }
  245. }
  246. //----------------------------------------------------------------------------
  247. // Stop pluginA_test and check that it gets state RESOLVED
  248. void ctkPluginFrameworkTestSuite::frame030b()
  249. {
  250. ctkServiceReference sr1
  251. = pc->getServiceReference("org.commontk.pluginAtest.TestPluginAService");
  252. try
  253. {
  254. pA->stop();
  255. QVERIFY2(pA->getState() == ctkPlugin::RESOLVED, "pluginA should be RESOLVED");
  256. }
  257. catch (const std::logic_error& ise)
  258. {
  259. qDebug() << "Unexpected logic_error exception:" << ise.what();
  260. QFAIL("framework test plugin, stop plugin pluginA");
  261. }
  262. catch (const ctkPluginException& pe)
  263. {
  264. qDebug() << "Unexpected plugin exception:" << pe;
  265. QFAIL("framework test plugin, stop plugin pluginA");
  266. }
  267. QList<ctkPluginEvent> pEvts;
  268. pEvts << ctkPluginEvent(ctkPluginEvent::STOPPED, pA);
  269. QList<ctkServiceEvent> seEvts;
  270. seEvts << ctkServiceEvent(ctkServiceEvent::UNREGISTERING, sr1);
  271. QVERIFY2(checkListenerEvents(QList<ctkPluginFrameworkEvent>(), pEvts, seEvts),
  272. "Unexpected events");
  273. QList<ctkPluginEvent> syncPEvts;
  274. syncPEvts << ctkPluginEvent(ctkPluginEvent::STOPPING, pA);
  275. QVERIFY2(checkSyncListenerEvents(syncPEvts), "Unexpected events");
  276. }
  277. //----------------------------------------------------------------------------
  278. // Uninstall pluginA_test and check that it gets state UNINSTALLED
  279. void ctkPluginFrameworkTestSuite::frame035b()
  280. {
  281. try
  282. {
  283. pA->uninstall();
  284. QVERIFY2(pA->getState() == ctkPlugin::UNINSTALLED,
  285. "pluginA_test should be UNINSTALLED");
  286. }
  287. catch (const std::logic_error& ise)
  288. {
  289. qDebug() << "Unexpected logic_error exception:" << ise.what();
  290. QFAIL("framework test plugin, uninstall");
  291. }
  292. catch (const ctkPluginException& pe)
  293. {
  294. qDebug() << "Unexpected plugin exception:" << pe;
  295. QFAIL("framework test plugin, uninstall pluginA_test");
  296. }
  297. QList<ctkPluginEvent> pEvts;
  298. pEvts << ctkPluginEvent(ctkPluginEvent::UNRESOLVED, pA);
  299. pEvts << ctkPluginEvent(ctkPluginEvent::UNINSTALLED, pA);
  300. QVERIFY2(checkListenerEvents(QList<ctkPluginFrameworkEvent>(),
  301. pEvts, QList<ctkServiceEvent>()),
  302. "Unexpected events");
  303. QVERIFY2(checkSyncListenerEvents(QList<ctkPluginEvent>()),
  304. "Unexpected sync events");
  305. }
  306. //----------------------------------------------------------------------------
  307. // Install pluginD_test, check that a ctkPluginException is thrown
  308. // as this plugin is not a Qt plugin
  309. void ctkPluginFrameworkTestSuite::frame040a()
  310. {
  311. bool teststatus = true;
  312. bool exception = false;
  313. try
  314. {
  315. pD = ctkPluginFrameworkTestUtil::installPlugin(pc, "pluginD_test");
  316. exception = false;
  317. }
  318. catch (const ctkPluginException& pe)
  319. {
  320. // This exception is expected
  321. qDebug() << "Expected exception" << pe;
  322. exception = true;
  323. }
  324. // catch (SecurityException secA) {
  325. // QFAIL("framework test plugin " + secA + " :FRAME040A:FAIL");
  326. // teststatus = false;
  327. // exception = true;
  328. // }
  329. if (exception == false)
  330. {
  331. teststatus = false;
  332. }
  333. // check the listeners for events, expect no events
  334. bool lStat = checkListenerEvents(false, ctkPluginFrameworkEvent::FRAMEWORK_STARTED,
  335. false , ctkPluginEvent::INSTALLED,
  336. false, ctkServiceEvent::MODIFIED,
  337. pD, 0);
  338. QVERIFY(teststatus == true && pD.isNull() && lStat == true);
  339. }
  340. //----------------------------------------------------------------------------
  341. // Install a non-existent plug-in
  342. void ctkPluginFrameworkTestSuite::frame042a()
  343. {
  344. bool exception = false;
  345. try
  346. {
  347. pc->installPlugin(QUrl("file://no-plugin"));
  348. exception = false;
  349. }
  350. catch (const ctkPluginException& pe)
  351. {
  352. // This exception is expected
  353. qDebug() << "Expected exception" << pe;
  354. exception = true;
  355. }
  356. // check the listeners for events, expect no events
  357. bool lStat = checkListenerEvents(false, ctkPluginFrameworkEvent::FRAMEWORK_STARTED,
  358. false , ctkPluginEvent::INSTALLED,
  359. false, ctkServiceEvent::MODIFIED,
  360. QSharedPointer<ctkPlugin>(), 0);
  361. QVERIFY(exception == true && lStat == true);
  362. }
  363. //----------------------------------------------------------------------------
  364. // Add a service listener with a broken LDAP filter to get an exception
  365. void ctkPluginFrameworkTestSuite::frame045a()
  366. {
  367. ctkServiceListenerPFW sListen1;
  368. QString brokenFilter = "A broken LDAP filter";
  369. try
  370. {
  371. pc->connectServiceListener(&sListen1, "serviceChanged", brokenFilter);
  372. }
  373. catch (const std::invalid_argument& /*ia*/)
  374. {
  375. //assertEquals("InvalidSyntaxException.getFilter should be same as input string", brokenFilter, ise.getFilter());
  376. }
  377. catch (...)
  378. {
  379. QFAIL("framework test bundle, wrong exception on broken LDAP filter:");
  380. }
  381. }
  382. //----------------------------------------------------------------------------
  383. // Reinstalls and the updates testbundle_A.
  384. // The version is checked to see if an update has been made.
  385. void ctkPluginFrameworkTestSuite::frame070a()
  386. {
  387. QString pluginA = "pluginA_test";
  388. QString pluginA1 = "libpluginA1_test";
  389. //InputStream fis;
  390. QString versionA;
  391. QString versionA1;
  392. pA.clear();
  393. clearEvents();
  394. try
  395. {
  396. pA = ctkPluginFrameworkTestUtil::installPlugin(pc, pluginA);
  397. }
  398. catch (const ctkPluginException& pexcA)
  399. {
  400. qDebug() << "framework test plugin" << pexcA << ":FRAME070A:FAIL";
  401. }
  402. // catch (const ctkSecurityException& secA)
  403. // {
  404. // qDebug() << "framework test plugin" << secA << ":FRAME070A:FAIL";
  405. // teststatus = false;
  406. // }
  407. QHash<QString,QString> ai = pA->getHeaders();
  408. versionA = ai["Plugin-Version"];
  409. qDebug() << "Before version =" << versionA;
  410. QDir testPluginDir(pc->getProperty("pluginfw.testDir").toString());
  411. QString pluginA1Path;
  412. QStringList libSuffixes;
  413. libSuffixes << ".so" << ".dll" << ".dylib";
  414. foreach(QString libSuffix, libSuffixes)
  415. {
  416. QFileInfo info(testPluginDir, pluginA1 + libSuffix);
  417. if (info.exists())
  418. {
  419. pluginA1Path = info.absoluteFilePath();
  420. break;
  421. }
  422. }
  423. if (pluginA1Path.isEmpty())
  424. {
  425. qDebug() << "Plug-in" << pluginA1 << "not found in" << testPluginDir;
  426. QFAIL("Test plug-in not found");
  427. }
  428. QUrl urk = QUrl::fromLocalFile(pluginA1Path);
  429. qDebug() << "update from" << urk;
  430. try
  431. {
  432. pA->update(urk);
  433. }
  434. catch (const ctkPluginException& pe)
  435. {
  436. QFAIL("framework test plug-in, update without new plug-in source :FRAME070A:FAIL");
  437. }
  438. QHash<QString,QString> a1i = pA->getHeaders();
  439. versionA1 = a1i["Plugin-Version"];
  440. qDebug() << "After version =" << versionA1;
  441. QList<ctkPluginEvent> pEvts;
  442. pEvts << ctkPluginEvent(ctkPluginEvent::INSTALLED, pA);
  443. pEvts << ctkPluginEvent(ctkPluginEvent::RESOLVED, pA);
  444. pEvts << ctkPluginEvent(ctkPluginEvent::UNRESOLVED, pA);
  445. pEvts << ctkPluginEvent(ctkPluginEvent::UPDATED, pA);
  446. QVERIFY2(checkListenerEvents(QList<ctkPluginFrameworkEvent>(),
  447. pEvts, QList<ctkServiceEvent>()),
  448. "Unexpected events");
  449. QVERIFY2(versionA1 != versionA, "framework test plug-in, update of plug-in failed, version info unchanged :FRAME070A:Fail");
  450. }
  451. //----------------------------------------------------------------------------
  452. void ctkPluginFrameworkTestSuite::frameworkListener(const ctkPluginFrameworkEvent& fwEvent)
  453. {
  454. frameworkEvents.push_back(fwEvent);
  455. qDebug() << "FrameworkEvent:" << fwEvent;
  456. }
  457. //----------------------------------------------------------------------------
  458. void ctkPluginFrameworkTestSuite::pluginListener(const ctkPluginEvent& event)
  459. {
  460. pluginEvents.push_back(event);
  461. qDebug() << "PluginEvent:" << event;
  462. }
  463. //----------------------------------------------------------------------------
  464. void ctkPluginFrameworkTestSuite::syncPluginListener(const ctkPluginEvent& event)
  465. {
  466. if (event.getType() == ctkPluginEvent::STARTING ||
  467. event.getType() == ctkPluginEvent::STOPPING)
  468. {
  469. syncPluginEvents.push_back(event);
  470. qDebug() << "Synchronous PluginEvent:" << event;
  471. }
  472. }
  473. //----------------------------------------------------------------------------
  474. void ctkPluginFrameworkTestSuite::serviceListener(const ctkServiceEvent& event)
  475. {
  476. serviceEvents.push_back(event);
  477. qDebug() << "ServiceEvent:" << event;
  478. }
  479. //----------------------------------------------------------------------------
  480. ctkPluginEvent ctkPluginFrameworkTestSuite::getPluginEvent() const
  481. {
  482. if (pluginEvents.empty())
  483. {
  484. return ctkPluginEvent();
  485. }
  486. return pluginEvents.last();
  487. }
  488. //----------------------------------------------------------------------------
  489. ctkPluginEvent ctkPluginFrameworkTestSuite::getSyncPluginEvent() const
  490. {
  491. if (syncPluginEvents.empty())
  492. {
  493. return ctkPluginEvent();
  494. }
  495. return syncPluginEvents.last();
  496. }
  497. //----------------------------------------------------------------------------
  498. ctkPluginFrameworkEvent ctkPluginFrameworkTestSuite::getFrameworkEvent() const
  499. {
  500. if (frameworkEvents.empty())
  501. {
  502. return ctkPluginFrameworkEvent();
  503. }
  504. return frameworkEvents.last();
  505. }
  506. //----------------------------------------------------------------------------
  507. ctkServiceEvent ctkPluginFrameworkTestSuite::getServiceEvent() const
  508. {
  509. if (serviceEvents.empty())
  510. {
  511. return ctkServiceEvent();
  512. }
  513. return serviceEvents.last();
  514. }
  515. //----------------------------------------------------------------------------
  516. bool ctkPluginFrameworkTestSuite::checkListenerEvents(
  517. bool fwexp, ctkPluginFrameworkEvent::Type fwtype,
  518. bool pexp, ctkPluginEvent::Type ptype,
  519. bool sexp, ctkServiceEvent::Type stype,
  520. QSharedPointer<ctkPlugin> pluginX, ctkServiceReference* servX)
  521. {
  522. QList<ctkPluginFrameworkEvent> fwEvts;
  523. QList<ctkPluginEvent> pEvts;
  524. QList<ctkServiceEvent> seEvts;
  525. if (fwexp) fwEvts << ctkPluginFrameworkEvent(fwtype, pluginX);
  526. if (pexp) pEvts << ctkPluginEvent(ptype, pluginX);
  527. if (sexp) seEvts << ctkServiceEvent(stype, *servX);
  528. return checkListenerEvents(fwEvts, pEvts, seEvts);
  529. }
  530. //----------------------------------------------------------------------------
  531. bool ctkPluginFrameworkTestSuite::checkListenerEvents(
  532. const QList<ctkPluginFrameworkEvent>& fwEvts,
  533. const QList<ctkPluginEvent>& pEvts,
  534. const QList<ctkServiceEvent>& seEvts)
  535. {
  536. bool listenState = true; // assume everything will work
  537. // Wait a while to allow events to arrive
  538. QTest::qWait(eventDelay);
  539. //QCoreApplication::sendPostedEvents();
  540. if (fwEvts.size() != frameworkEvents.size())
  541. {
  542. listenState = false;
  543. qDebug() << "*** Plugin Framework event mismatch: expected"
  544. << fwEvts.size() << "event(s), found"
  545. << frameworkEvents.size() << "event(s).";
  546. const int max = fwEvts.size() > frameworkEvents.size()
  547. ? fwEvts.size() : frameworkEvents.size();
  548. for (int i = 0; i < max; ++i)
  549. {
  550. const ctkPluginFrameworkEvent& fwE = i < fwEvts.size() ? fwEvts[i] : ctkPluginFrameworkEvent();
  551. const ctkPluginFrameworkEvent& fwR = i < frameworkEvents.size() ? frameworkEvents[i] : ctkPluginFrameworkEvent();
  552. qDebug() << " " << fwE << " - " << fwR;
  553. }
  554. }
  555. else
  556. {
  557. for (int i = 0; i < fwEvts.size(); ++i)
  558. {
  559. const ctkPluginFrameworkEvent& feE = fwEvts[i];
  560. const ctkPluginFrameworkEvent& feR = frameworkEvents[i];
  561. if (feE.getType() != feR.getType()
  562. || feE.getPlugin() != feR.getPlugin())
  563. {
  564. listenState = false;
  565. qDebug() << "*** Wrong framework event:" << feR
  566. << "expected" << feE;
  567. }
  568. }
  569. }
  570. if (pEvts.size() != pluginEvents.size())
  571. {
  572. listenState = false;
  573. qDebug() << "*** Plugin event mismatch: expected"
  574. << pEvts.size() << "event(s), found "
  575. << pluginEvents.size() << "event(s).";
  576. const int max = pEvts.size() > pluginEvents.size() ? pEvts.size() : pluginEvents.size();
  577. for (int i = 0; i < max; ++i)
  578. {
  579. const ctkPluginEvent& pE = i < pEvts.size() ? pEvts[i] : ctkPluginEvent();
  580. const ctkPluginEvent& pR = i < pluginEvents.size() ? pluginEvents[i] : ctkPluginEvent();
  581. qDebug() << " " << pE << " - " << pR;
  582. }
  583. }
  584. else
  585. {
  586. for (int i = 0; i < pEvts.size(); ++i)
  587. {
  588. const ctkPluginEvent& pE = pEvts[i];
  589. const ctkPluginEvent& pR = pluginEvents[i];
  590. if (pE.getType() != pR.getType()
  591. || pE.getPlugin() != pR.getPlugin())
  592. {
  593. listenState = false;
  594. qDebug() << "*** Wrong plugin event:" << pR << "expected" << pE;
  595. }
  596. }
  597. }
  598. if (seEvts.size() != serviceEvents.size())
  599. {
  600. listenState = false;
  601. qDebug() << "*** Service event mismatch: expected"
  602. << seEvts.size() << "event(s), found"
  603. << serviceEvents.size() << "event(s).";
  604. const int max = seEvts.size() > serviceEvents.size()
  605. ? seEvts.size() : serviceEvents.size();
  606. for (int i = 0; i < max; ++i)
  607. {
  608. const ctkServiceEvent& seE = i < seEvts.size() ? seEvts[i] : ctkServiceEvent();
  609. const ctkServiceEvent& seR = i < serviceEvents.size() ? serviceEvents[i] : ctkServiceEvent();
  610. qDebug() << " " << seE << " - " << seR;
  611. }
  612. }
  613. else
  614. {
  615. for (int i = 0; i < seEvts.size(); ++i)
  616. {
  617. const ctkServiceEvent& seE = seEvts[i];
  618. const ctkServiceEvent& seR = serviceEvents[i];
  619. if (seE.getType() != seR.getType()
  620. || (!(seE.getServiceReference() == seR.getServiceReference())))
  621. {
  622. listenState = false;
  623. qDebug() << "*** Wrong service event:" << seR << "expected" << seE;
  624. }
  625. }
  626. }
  627. frameworkEvents.clear();
  628. pluginEvents.clear();
  629. serviceEvents.clear();
  630. return listenState;
  631. }
  632. //----------------------------------------------------------------------------
  633. // Check that the expected events have reached the listeners and
  634. // reset the events
  635. bool ctkPluginFrameworkTestSuite::checkSyncListenerEvents(
  636. bool pexp, ctkPluginEvent::Type ptype, QSharedPointer<ctkPlugin> pX,
  637. ctkServiceReference servX)
  638. {
  639. Q_UNUSED(servX)
  640. QList<ctkPluginEvent> pEvts;
  641. if (pexp)
  642. {
  643. pEvts << ctkPluginEvent(ptype, pX);
  644. }
  645. return checkSyncListenerEvents(pEvts);
  646. }
  647. //----------------------------------------------------------------------------
  648. // Check that the expected events have reached the listeners and
  649. // reset the events
  650. bool ctkPluginFrameworkTestSuite::checkSyncListenerEvents(
  651. const QList<ctkPluginEvent>& pEvts)
  652. {
  653. bool listenState = true; // assume everything will work
  654. // Sleep a while to allow events to arrive
  655. QTest::qWait(eventDelay);
  656. if (pEvts.size() != syncPluginEvents.size())
  657. {
  658. listenState = false;
  659. qDebug() << "*** Sync plugin event mismatch: expected"
  660. << pEvts.size() << "event(s), found"
  661. << syncPluginEvents.size() << "event(s).";
  662. const int max = pEvts.size() > syncPluginEvents.size() ? pEvts.size() : syncPluginEvents.size();
  663. for (int i = 0; i < max; ++i)
  664. {
  665. const ctkPluginEvent& pE = i< pEvts.size() ? pEvts[i] : ctkPluginEvent();
  666. const ctkPluginEvent& pR = i < syncPluginEvents.size() ? syncPluginEvents[i] : ctkPluginEvent();
  667. qDebug() << " " << pE << " - " << pR;
  668. }
  669. }
  670. else
  671. {
  672. for (int i = 0; i < pEvts.size(); ++i)
  673. {
  674. const ctkPluginEvent& pE = pEvts[i];
  675. const ctkPluginEvent& pR = syncPluginEvents[i];
  676. if (pE.getType() != pR.getType() || pE.getPlugin() != pR.getPlugin())
  677. {
  678. listenState = false;
  679. qDebug() << "Wrong sync plugin event:" << pR << "expected" << pE;
  680. }
  681. }
  682. }
  683. syncPluginEvents.clear();
  684. return listenState;
  685. }
  686. void ctkPluginFrameworkTestSuite::clearEvents()
  687. {
  688. QTest::qWait(300);
  689. pluginEvents.clear();
  690. syncPluginEvents.clear();
  691. frameworkEvents.clear();
  692. serviceEvents.clear();
  693. }
  694. //----------------------------------------------------------------------------
  695. ctkServiceEvent ctkServiceListenerPFW::getEvent() const
  696. {
  697. return events.size() ? events.last() : ctkServiceEvent();
  698. }
  699. //----------------------------------------------------------------------------
  700. QList<ctkServiceEvent> ctkServiceListenerPFW::getEvents() const
  701. {
  702. return events;
  703. }
  704. //----------------------------------------------------------------------------
  705. void ctkServiceListenerPFW::clearEvent()
  706. {
  707. events.clear();
  708. }
  709. //----------------------------------------------------------------------------
  710. void ctkServiceListenerPFW::serviceChanged(const ctkServiceEvent& evt)
  711. {
  712. events.push_back(evt);
  713. qDebug() << "ctkServiceEvent:" << evt;
  714. }