PageRenderTime 64ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/auto/qjsonrpcserver/tst_qjsonrpcserver.cpp

https://bitbucket.org/mgodshall/qjsonrpc
C++ | 1011 lines | 780 code | 151 blank | 80 comment | 40 complexity | 94f18b17c813624c2e3acea3756c40f5 MD5 | raw file
Possible License(s): LGPL-2.0
  1. /*
  2. * Copyright (C) 2012-2013 Matt Broadstone
  3. * Contact: http://bitbucket.org/devonit/qjsonrpc
  4. *
  5. * This file is part of the QJsonRpc Library.
  6. *
  7. * This library is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * This library is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. */
  17. #include <QLocalSocket>
  18. #include <QTcpSocket>
  19. #include <QtCore/QEventLoop>
  20. #include <QtCore/QVariant>
  21. #include <QtTest/QtTest>
  22. #include "json/qjsondocument.h"
  23. #include "qjsonrpcservice.h"
  24. #include "qjsonrpcmessage.h"
  25. class TestQJsonRpcServer: public QObject
  26. {
  27. Q_OBJECT
  28. private Q_SLOTS:
  29. void initTestCase();
  30. void cleanupTestCase();
  31. void init();
  32. void cleanup();
  33. // Local Server
  34. void testLocalNoParameter();
  35. void testLocalSingleParameter();
  36. void testLocalMultiparameter();
  37. void testLocalVariantParameter();
  38. void testLocalVariantListParameter();
  39. void testLocalVariantResult();
  40. void testLocalInvalidArgs();
  41. void testLocalMethodNotFound();
  42. void testLocalInvalidRequest();
  43. void testLocalNotifyConnectedClients();
  44. void testLocalNumberParameters();
  45. void testLocalHugeResponse();
  46. void testLocalComplexMethod();
  47. void testLocalDefaultParameters();
  48. void testLocalNotifyServiceSocket();
  49. void testLocalNoWhitespace();
  50. void testLocalOverloadedMethod();
  51. void testLocalQVariantMapInvalidParam();
  52. // TCP Server
  53. void testTcpNoParameter();
  54. void testTcpSingleParameter();
  55. void testTcpMultiparameter();
  56. void testTcpVariantParameter();
  57. void testTcpInvalidArgs();
  58. void testTcpMethodNotFound();
  59. void testTcpInvalidRequest();
  60. void testTcpNotifyConnectedClients();
  61. void testTcpNumberParameters();
  62. void testTcpHugeResponse();
  63. private:
  64. // fix later
  65. void testLocalListOfInts();
  66. };
  67. class TestService : public QJsonRpcService
  68. {
  69. Q_OBJECT
  70. Q_CLASSINFO("serviceName", "service")
  71. public:
  72. TestService(QObject *parent = 0)
  73. : QJsonRpcService(parent),
  74. m_called(0)
  75. {}
  76. void resetCount() { m_called = 0; }
  77. int callCount() const {
  78. return m_called;
  79. }
  80. public Q_SLOTS:
  81. void noParam() const {}
  82. QString singleParam(const QString &string) const { return string; }
  83. QString multipleParam(const QString &first,
  84. const QString &second,
  85. const QString &third) const
  86. {
  87. return first + second + third;
  88. }
  89. void numberParameters(int intParam, double doubleParam, float floatParam)
  90. {
  91. Q_UNUSED(intParam)
  92. Q_UNUSED(doubleParam)
  93. Q_UNUSED(floatParam)
  94. }
  95. bool variantParameter(const QVariant &variantParam) const
  96. {
  97. return variantParam.toBool();
  98. }
  99. QVariantList variantListParameter(const QVariantList &data) {
  100. return data;
  101. }
  102. QVariant variantStringResult() {
  103. return "hello";
  104. }
  105. QVariantList variantListResult() {
  106. return QVariantList() << "one" << 2 << 3.0;
  107. }
  108. QVariantMap variantMapResult() {
  109. QVariantMap result;
  110. result["one"] = 1;
  111. result["two"] = 2.0;
  112. return result;
  113. }
  114. void increaseCalled() {
  115. m_called++;
  116. }
  117. bool methodWithListOfInts(const QList<int> &list) {
  118. if (list.size() < 3)
  119. return false;
  120. if (list.at(0) != 300)
  121. return false;
  122. if (list.at(1) != 30)
  123. return false;
  124. if (list.at(2) != 3)
  125. return false;
  126. return true;
  127. }
  128. QString variantMapInvalidParam(const QVariantMap &map) {
  129. return map["foo"].toString();
  130. }
  131. bool overloadedMethod(int input) { Q_UNUSED(input) return true; }
  132. bool overloadedMethod(const QString &input) { Q_UNUSED(input) return false; }
  133. private:
  134. int m_called;
  135. };
  136. void TestQJsonRpcServer::initTestCase()
  137. {
  138. qRegisterMetaType<QJsonRpcMessage>("QJsonRpcMessage");
  139. }
  140. void TestQJsonRpcServer::cleanupTestCase()
  141. {
  142. }
  143. void TestQJsonRpcServer::init()
  144. {
  145. }
  146. void TestQJsonRpcServer::cleanup()
  147. {
  148. }
  149. void TestQJsonRpcServer::testLocalNoParameter()
  150. {
  151. // Initialize the service provider.
  152. QJsonRpcLocalServer serviceProvider;
  153. serviceProvider.addService(new TestService);
  154. QVERIFY(serviceProvider.listen("test"));
  155. // Connect to the socket.
  156. QLocalSocket socket;
  157. socket.connectToServer("test");
  158. QVERIFY(socket.waitForConnected(1000));
  159. QJsonRpcSocket serviceSocket(&socket, this);
  160. QSignalSpy spyMessageReceived(&serviceSocket,
  161. SIGNAL(messageReceived(QJsonRpcMessage)));
  162. QJsonRpcMessage request = QJsonRpcMessage::createRequest("service.noParam");
  163. QJsonRpcMessage response = serviceSocket.sendMessageBlocking(request);
  164. QCOMPARE(spyMessageReceived.count(), 1);
  165. QVERIFY(response.errorCode() == QJsonRpc::NoError);
  166. QCOMPARE(request.id(), response.id());
  167. }
  168. void TestQJsonRpcServer::testLocalSingleParameter()
  169. {
  170. // Initialize the service provider.
  171. QJsonRpcLocalServer serviceProvider;
  172. serviceProvider.addService(new TestService);
  173. QVERIFY(serviceProvider.listen("test"));
  174. // Connect to the socket.
  175. QLocalSocket socket;
  176. socket.connectToServer("test");
  177. QVERIFY(socket.waitForConnected());
  178. QJsonRpcSocket serviceSocket(&socket, this);
  179. QSignalSpy spyMessageReceived(&serviceSocket, SIGNAL(messageReceived(QJsonRpcMessage)));
  180. QJsonRpcMessage request = QJsonRpcMessage::createRequest("service.singleParam", QString("single"));
  181. QJsonRpcMessage response = serviceSocket.sendMessageBlocking(request);
  182. QCOMPARE(spyMessageReceived.count(), 1);
  183. QVERIFY(response.errorCode() == QJsonRpc::NoError);
  184. QCOMPARE(request.id(), response.id());
  185. QCOMPARE(response.result().toString(), QLatin1String("single"));
  186. }
  187. void TestQJsonRpcServer::testLocalOverloadedMethod()
  188. {
  189. // Initialize the service provider.
  190. QJsonRpcLocalServer serviceProvider;
  191. serviceProvider.addService(new TestService);
  192. QVERIFY(serviceProvider.listen("test"));
  193. // Connect to the socket.
  194. QLocalSocket socket;
  195. socket.connectToServer("test");
  196. QVERIFY(socket.waitForConnected());
  197. QJsonRpcSocket serviceSocket(&socket, this);
  198. QSignalSpy spyMessageReceived(&serviceSocket,
  199. SIGNAL(messageReceived(QJsonRpcMessage)));
  200. QJsonRpcMessage stringRequest = QJsonRpcMessage::createRequest("service.overloadedMethod", QString("single"));
  201. QJsonRpcMessage stringResponse = serviceSocket.sendMessageBlocking(stringRequest);
  202. QCOMPARE(spyMessageReceived.count(), 1);
  203. QVERIFY(stringResponse.errorCode() == QJsonRpc::NoError);
  204. QCOMPARE(stringRequest.id(), stringResponse.id());
  205. QCOMPARE(stringResponse.result().toBool(), false);
  206. QJsonRpcMessage intRequest = QJsonRpcMessage::createRequest("service.overloadedMethod", 10);
  207. QJsonRpcMessage intResponse = serviceSocket.sendMessageBlocking(intRequest);
  208. QCOMPARE(spyMessageReceived.count(), 2);
  209. QVERIFY(intResponse.errorCode() == QJsonRpc::NoError);
  210. QCOMPARE(intRequest.id(), intResponse.id());
  211. QCOMPARE(intResponse.result().toBool(), true);
  212. QVariantMap testMap;
  213. testMap["one"] = 1;
  214. testMap["two"] = 2;
  215. testMap["three"] = 3;
  216. QJsonRpcMessage mapRequest =
  217. QJsonRpcMessage::createRequest("service.overloadedMethod", testMap);
  218. QJsonRpcMessage mapResponse = serviceSocket.sendMessageBlocking(mapRequest);
  219. QCOMPARE(spyMessageReceived.count(), 3);
  220. QVERIFY(mapResponse.errorCode() == QJsonRpc::InvalidParams);
  221. QCOMPARE(mapRequest.id(), mapResponse.id());
  222. }
  223. void TestQJsonRpcServer::testLocalMultiparameter()
  224. {
  225. // Initialize the service provider.
  226. QJsonRpcLocalServer serviceProvider;
  227. serviceProvider.addService(new TestService);
  228. QVERIFY(serviceProvider.listen("test"));
  229. // Connect to the socket.
  230. QLocalSocket socket;
  231. socket.connectToServer("test");
  232. QVERIFY(socket.waitForConnected());
  233. QJsonRpcSocket serviceSocket(&socket, this);
  234. QSignalSpy spyMessageReceived(&serviceSocket,
  235. SIGNAL(messageReceived(QJsonRpcMessage)));
  236. QJsonRpcMessage request = QJsonRpcMessage::createRequest("service.multipleParam",
  237. QVariantList() << QVariant(QString("a"))
  238. << QVariant(QString("b"))
  239. << QVariant(QString("c")));
  240. QJsonRpcMessage response = serviceSocket.sendMessageBlocking(request);
  241. QCOMPARE(spyMessageReceived.count(), 1);
  242. QVERIFY(response.errorCode() == QJsonRpc::NoError);
  243. QCOMPARE(request.id(), response.id());
  244. QCOMPARE(response.result().toString(), QLatin1String("abc"));
  245. }
  246. void TestQJsonRpcServer::testLocalVariantParameter()
  247. {
  248. // Initialize the service provider.
  249. QJsonRpcLocalServer serviceProvider;
  250. serviceProvider.addService(new TestService);
  251. QVERIFY(serviceProvider.listen("test"));
  252. // Connect to the socket.
  253. QLocalSocket socket;
  254. socket.connectToServer("test");
  255. QVERIFY(socket.waitForConnected());
  256. QJsonRpcSocket serviceSocket(&socket, this);
  257. QSignalSpy spyMessageReceived(&serviceSocket,
  258. SIGNAL(messageReceived(QJsonRpcMessage)));
  259. QJsonRpcMessage request = QJsonRpcMessage::createRequest("service.variantParameter",
  260. QVariantList() << QVariant(true));
  261. QJsonRpcMessage response = serviceSocket.sendMessageBlocking(request);
  262. QCOMPARE(spyMessageReceived.count(), 1);
  263. QVERIFY(response.errorCode() == QJsonRpc::NoError);
  264. QCOMPARE(request.id(), response.id());
  265. QVERIFY(response.result() == true);
  266. }
  267. void TestQJsonRpcServer::testLocalVariantListParameter()
  268. {
  269. // Initialize the service provider.
  270. QJsonRpcLocalServer serviceProvider;
  271. serviceProvider.addService(new TestService);
  272. QVERIFY(serviceProvider.listen("test"));
  273. // Connect to the socket.
  274. QLocalSocket socket;
  275. socket.connectToServer("test");
  276. QVERIFY(socket.waitForConnected());
  277. QJsonRpcSocket serviceSocket(&socket, this);
  278. QSignalSpy spyMessageReceived(&serviceSocket,
  279. SIGNAL(messageReceived(QJsonRpcMessage)));
  280. QVariantList data;
  281. data << 1 << 20 << "hello" << false;
  282. QJsonRpcMessage request = QJsonRpcMessage::createRequest("service.variantListParameter",
  283. QVariantList() << QVariant(data));
  284. QJsonRpcMessage response = serviceSocket.sendMessageBlocking(request);
  285. QCOMPARE(spyMessageReceived.count(), 1);
  286. QVERIFY(response.errorCode() == QJsonRpc::NoError);
  287. QCOMPARE(request.id(), response.id());
  288. QCOMPARE(response.result().toList(), data);
  289. }
  290. void TestQJsonRpcServer::testLocalVariantResult()
  291. {
  292. // Initialize the service provider.
  293. QJsonRpcLocalServer serviceProvider;
  294. serviceProvider.addService(new TestService);
  295. QVERIFY(serviceProvider.listen("test"));
  296. // Connect to the socket.
  297. QLocalSocket socket;
  298. socket.connectToServer("test");
  299. QVERIFY(socket.waitForConnected());
  300. QJsonRpcSocket serviceSocket(&socket, this);
  301. QJsonRpcMessage response = serviceSocket.invokeRemoteMethodBlocking("service.variantStringResult");
  302. QVERIFY(response.errorCode() == QJsonRpc::NoError);
  303. QString stringResult = response.result().toString();
  304. QCOMPARE(stringResult, QLatin1String("hello"));
  305. }
  306. void TestQJsonRpcServer::testLocalInvalidArgs()
  307. {
  308. // Initialize the service provider.
  309. QJsonRpcLocalServer serviceProvider;
  310. serviceProvider.addService(new TestService);
  311. QVERIFY(serviceProvider.listen("test"));
  312. // Connect to the socket.
  313. QLocalSocket socket;
  314. socket.connectToServer("test");
  315. QVERIFY(socket.waitForConnected());
  316. QJsonRpcSocket serviceSocket(&socket, this);
  317. QSignalSpy spyMessageReceived(&serviceSocket,
  318. SIGNAL(messageReceived(QJsonRpcMessage)));
  319. QJsonRpcMessage request = QJsonRpcMessage::createRequest("service.noParam",
  320. QVariantList() << false);
  321. serviceSocket.sendMessageBlocking(request);
  322. QCOMPARE(spyMessageReceived.count(), 1);
  323. QVariant message = spyMessageReceived.takeFirst().at(0);
  324. QJsonRpcMessage error = message.value<QJsonRpcMessage>();
  325. QCOMPARE(request.id(), error.id());
  326. QVERIFY(error.errorCode() == QJsonRpc::InvalidParams);
  327. }
  328. void TestQJsonRpcServer::testLocalMethodNotFound()
  329. {
  330. // Initialize the service provider.
  331. QJsonRpcLocalServer serviceProvider;
  332. serviceProvider.addService(new TestService);
  333. QVERIFY(serviceProvider.listen("test"));
  334. // Connect to the socket.
  335. QLocalSocket socket;
  336. socket.connectToServer("test");
  337. QVERIFY(socket.waitForConnected());
  338. QJsonRpcSocket serviceSocket(&socket, this);
  339. QSignalSpy spyMessageReceived(&serviceSocket,
  340. SIGNAL(messageReceived(QJsonRpcMessage)));
  341. QJsonRpcMessage request = QJsonRpcMessage::createRequest("service.doesNotExist");
  342. QJsonRpcMessage response = serviceSocket.sendMessageBlocking(request);
  343. QCOMPARE(spyMessageReceived.count(), 1);
  344. QVERIFY(response.isValid());
  345. QVariant message = spyMessageReceived.takeFirst().at(0);
  346. QJsonRpcMessage error = message.value<QJsonRpcMessage>();
  347. QCOMPARE(request.id(), error.id());
  348. QVERIFY(error.errorCode() == QJsonRpc::MethodNotFound);
  349. }
  350. void TestQJsonRpcServer::testLocalInvalidRequest()
  351. {
  352. // Initialize the service provider.
  353. QJsonRpcLocalServer serviceProvider;
  354. serviceProvider.addService(new TestService);
  355. QVERIFY(serviceProvider.listen("test"));
  356. // Connect to the socket.
  357. QLocalSocket socket;
  358. socket.connectToServer("test");
  359. QVERIFY(socket.waitForConnected());
  360. QJsonRpcSocket serviceSocket(&socket, this);
  361. QSignalSpy spyMessageReceived(&serviceSocket,
  362. SIGNAL(messageReceived(QJsonRpcMessage)));
  363. QJsonRpcMessage request("{\"jsonrpc\": \"2.0\", \"id\": 666}");
  364. serviceSocket.sendMessageBlocking(request);
  365. QCOMPARE(spyMessageReceived.count(), 1);
  366. QVariant message = spyMessageReceived.takeFirst().at(0);
  367. QJsonRpcMessage error = message.value<QJsonRpcMessage>();
  368. QCOMPARE(request.id(), error.id());
  369. QVERIFY(error.errorCode() == QJsonRpc::InvalidRequest);
  370. }
  371. void TestQJsonRpcServer::testLocalNoWhitespace()
  372. {
  373. // Initialize the service provider.
  374. QJsonRpcLocalServer serviceProvider;
  375. TestService *service = new TestService;
  376. serviceProvider.addService(service);
  377. QVERIFY(serviceProvider.listen("test"));
  378. // Connect to the socket.
  379. QLocalSocket socket;
  380. socket.connectToServer("test");
  381. QVERIFY(socket.waitForConnected());
  382. QByteArray singleNoWhite("{\"jsonrpc\":\"2.0\",\"method\":\"service.increaseCalled\"}");
  383. QCOMPARE(socket.write(singleNoWhite), (qint64)singleNoWhite.size());
  384. QTest::qWait(200);
  385. QCOMPARE(service->callCount(), 1);
  386. service->resetCount();
  387. QByteArray multipleNoWhite("{\"jsonrpc\":\"2.0\",\"method\":\"service.increaseCalled\"}{\"jsonrpc\":\"2.0\",\"method\":\"service.increaseCalled\"}{\"jsonrpc\":\"2.0\",\"method\":\"service.increaseCalled\"}");
  388. QCOMPARE(socket.write(multipleNoWhite), (qint64)multipleNoWhite.size());
  389. QTest::qWait(200);
  390. QCOMPARE(service->callCount(), 3);
  391. }
  392. void TestQJsonRpcServer::testLocalQVariantMapInvalidParam()
  393. {
  394. QJsonRpcLocalServer serviceProvider;
  395. TestService *service = new TestService;
  396. serviceProvider.addService(service);
  397. QVERIFY(serviceProvider.listen("test"));
  398. QLocalSocket socket;
  399. socket.connectToServer("test");
  400. QVERIFY(socket.waitForConnected());
  401. QJsonRpcSocket serviceSocket(&socket, this);
  402. QSignalSpy spyMessageReceived(&serviceSocket,
  403. SIGNAL(messageReceived(QJsonRpcMessage)));
  404. const char *invalid = "{\"jsonrpc\": \"2.0\", \"id\": 0, \"method\": \"service.variantMapInvalidParam\",\"params\": [[{\"foo\":\"bar\",\"baz\":\"quux\"}, {\"foo\":\"bar\"}]]}";
  405. QJsonRpcMessage request(invalid);
  406. serviceSocket.sendMessageBlocking(request);
  407. QCOMPARE(spyMessageReceived.count(), 1);
  408. QVariant message = spyMessageReceived.takeFirst().at(0);
  409. QJsonRpcMessage error = message.value<QJsonRpcMessage>();
  410. QCOMPARE(request.id(), error.id());
  411. QVERIFY(error.errorCode() == QJsonRpc::InvalidParams);
  412. }
  413. class ServerNotificationHelper : public QObject
  414. {
  415. Q_OBJECT
  416. public:
  417. ServerNotificationHelper(const QJsonRpcMessage &message, QJsonRpcServer *provider)
  418. : m_provider(provider),
  419. m_notification(message) {}
  420. public Q_SLOTS:
  421. void activate() {
  422. m_provider->notifyConnectedClients(m_notification);
  423. }
  424. private:
  425. QJsonRpcServer *m_provider;
  426. QJsonRpcMessage m_notification;
  427. };
  428. void TestQJsonRpcServer::testLocalNotifyConnectedClients()
  429. {
  430. // Initialize the service provider.
  431. QEventLoop firstLoop;
  432. QJsonRpcLocalServer serviceProvider;
  433. QVERIFY(serviceProvider.listen("test"));
  434. serviceProvider.addService(new TestService);
  435. // first client
  436. QLocalSocket first;
  437. first.connectToServer("test");
  438. QVERIFY(first.waitForConnected());
  439. QJsonRpcSocket firstClient(&first, this);
  440. QSignalSpy firstSpyMessageReceived(&firstClient,
  441. SIGNAL(messageReceived(QJsonRpcMessage)));
  442. // send notification
  443. QJsonRpcMessage notification = QJsonRpcMessage::createNotification("testNotification");
  444. connect(&firstClient, SIGNAL(messageReceived(QJsonRpcMessage)), &firstLoop, SLOT(quit()));
  445. ServerNotificationHelper helper(notification, &serviceProvider);
  446. QTimer::singleShot(100, &helper, SLOT(activate()));
  447. firstLoop.exec();
  448. QCOMPARE(firstSpyMessageReceived.count(), 1);
  449. QVariant firstMessage = firstSpyMessageReceived.takeFirst().at(0);
  450. QJsonRpcMessage firstNotification = firstMessage.value<QJsonRpcMessage>();
  451. QCOMPARE(firstNotification, notification);
  452. }
  453. class TestNumberParamsService : public QJsonRpcService
  454. {
  455. Q_OBJECT
  456. Q_CLASSINFO("serviceName", "service")
  457. public:
  458. TestNumberParamsService(QObject *parent = 0)
  459. : QJsonRpcService(parent), m_called(0) {}
  460. int callCount() const { return m_called; }
  461. public Q_SLOTS:
  462. void numberParameters(int intParam, double doubleParam)
  463. {
  464. if (intParam == 10 && doubleParam == 3.14159)
  465. m_called++;
  466. }
  467. private:
  468. int m_called;
  469. };
  470. void TestQJsonRpcServer::testLocalNumberParameters()
  471. {
  472. // Initialize the service provider.
  473. QEventLoop loop;
  474. TestNumberParamsService *service = new TestNumberParamsService;
  475. QJsonRpcLocalServer serviceProvider;
  476. serviceProvider.addService(service);
  477. QVERIFY(serviceProvider.listen("test"));
  478. // Connect to the socket.
  479. QLocalSocket socket;
  480. socket.connectToServer("test");
  481. QVERIFY(socket.waitForConnected());
  482. QJsonRpcSocket serviceSocket(&socket, this);
  483. QJsonRpcMessage request = QJsonRpcMessage::createRequest("service.numberParameters", QVariantList() << 10 << 3.14159);
  484. serviceSocket.sendMessageBlocking(request);
  485. QCOMPARE(service->callCount(), 1);
  486. }
  487. class TestHugeResponseService : public QJsonRpcService
  488. {
  489. Q_OBJECT
  490. Q_CLASSINFO("serviceName", "service")
  491. public:
  492. TestHugeResponseService(QObject *parent = 0)
  493. : QJsonRpcService(parent) {}
  494. public Q_SLOTS:
  495. QVariantMap hugeResponse()
  496. {
  497. QVariantMap result;
  498. for (int i = 0; i < 1000; i++) {
  499. QString key = QString("testKeyForHugeResponse%1").arg(i);
  500. result[key] = "some sample data to make the response larger";
  501. }
  502. return result;
  503. }
  504. };
  505. void TestQJsonRpcServer::testLocalHugeResponse()
  506. {
  507. // Initialize the service provider.
  508. QJsonRpcLocalServer serviceProvider;
  509. serviceProvider.addService(new TestHugeResponseService);
  510. QVERIFY(serviceProvider.listen("test"));
  511. // Connect to the socket.
  512. QLocalSocket socket;
  513. socket.connectToServer("test");
  514. QVERIFY(socket.waitForConnected());
  515. QJsonRpcSocket serviceSocket(&socket, this);
  516. QSignalSpy spyMessageReceived(&serviceSocket,
  517. SIGNAL(messageReceived(QJsonRpcMessage)));
  518. QJsonRpcMessage request = QJsonRpcMessage::createRequest("service.hugeResponse");
  519. QJsonRpcMessage response = serviceSocket.sendMessageBlocking(request);
  520. QCOMPARE(spyMessageReceived.count(), 1);
  521. QVERIFY(response.isValid());
  522. }
  523. class TestComplexMethodService : public QJsonRpcService
  524. {
  525. Q_OBJECT
  526. Q_CLASSINFO("serviceName", "service.complex.prefix.for")
  527. public:
  528. TestComplexMethodService(QObject *parent = 0)
  529. : QJsonRpcService(parent) {}
  530. public Q_SLOTS:
  531. void testMethod() {}
  532. };
  533. void TestQJsonRpcServer::testLocalComplexMethod()
  534. {
  535. // Initialize the service provider.
  536. QEventLoop loop;
  537. QJsonRpcLocalServer serviceProvider;
  538. serviceProvider.addService(new TestComplexMethodService);
  539. QVERIFY(serviceProvider.listen("test"));
  540. // Connect to the socket.
  541. QLocalSocket socket;
  542. socket.connectToServer("test");
  543. QVERIFY(socket.waitForConnected());
  544. QJsonRpcSocket serviceSocket(&socket, this);
  545. QSignalSpy spyMessageReceived(&serviceSocket,
  546. SIGNAL(messageReceived(QJsonRpcMessage)));
  547. QJsonRpcMessage request = QJsonRpcMessage::createRequest("service.complex.prefix.for.testMethod");
  548. QJsonRpcMessage response = serviceSocket.sendMessageBlocking(request);
  549. QCOMPARE(spyMessageReceived.count(), 1);
  550. QVERIFY(response.errorCode() == QJsonRpc::NoError);
  551. QCOMPARE(request.id(), response.id());
  552. }
  553. class TestDefaultParametersService : public QJsonRpcService
  554. {
  555. Q_OBJECT
  556. Q_CLASSINFO("serviceName", "service")
  557. public:
  558. TestDefaultParametersService(QObject *parent = 0)
  559. : QJsonRpcService(parent) {}
  560. public Q_SLOTS:
  561. QString testMethod(const QString &name = QString()) {
  562. if (name.isEmpty())
  563. return "empty string";
  564. return QString("hello %1").arg(name);
  565. }
  566. QString testMethod2(const QString &name = QString(), int year = 2012)
  567. {
  568. return QString("%1%2").arg(name).arg(year);
  569. }
  570. };
  571. void TestQJsonRpcServer::testLocalDefaultParameters()
  572. {
  573. // Initialize the service provider.
  574. QEventLoop loop;
  575. QJsonRpcLocalServer serviceProvider;
  576. serviceProvider.addService(new TestDefaultParametersService);
  577. QVERIFY(serviceProvider.listen("test"));
  578. // Connect to the socket.
  579. QLocalSocket socket;
  580. socket.connectToServer("test");
  581. QVERIFY(socket.waitForConnected());
  582. QJsonRpcSocket serviceSocket(&socket, this);
  583. // test without name
  584. QJsonRpcMessage noNameRequest = QJsonRpcMessage::createRequest("service.testMethod");
  585. QJsonRpcMessage response = serviceSocket.sendMessageBlocking(noNameRequest);
  586. QVERIFY(response.type() != QJsonRpcMessage::Error);
  587. QCOMPARE(response.result().toString(), QLatin1String("empty string"));
  588. // test with name
  589. QJsonRpcMessage nameRequest = QJsonRpcMessage::createRequest("service.testMethod", QLatin1String("matt"));
  590. response = serviceSocket.sendMessageBlocking(nameRequest);
  591. QVERIFY(response.type() != QJsonRpcMessage::Error);
  592. QCOMPARE(response.result().toString(), QLatin1String("hello matt"));
  593. // test multiparameter
  594. QJsonRpcMessage konyRequest = QJsonRpcMessage::createRequest("service.testMethod2", QLatin1String("KONY"));
  595. response = serviceSocket.sendMessageBlocking(konyRequest);
  596. QVERIFY(response.type() != QJsonRpcMessage::Error);
  597. QCOMPARE(response.result().toString(), QLatin1String("KONY2012"));
  598. }
  599. class TestNotifyService : public QJsonRpcService
  600. {
  601. Q_OBJECT
  602. Q_CLASSINFO("serviceName", "service")
  603. public:
  604. TestNotifyService(QObject *parent = 0)
  605. : QJsonRpcService(parent)
  606. {
  607. }
  608. public Q_SLOTS:
  609. void testMethod() { qDebug() << "text"; }
  610. };
  611. void TestQJsonRpcServer::testLocalNotifyServiceSocket()
  612. {
  613. // Initialize the service provider.
  614. QJsonRpcLocalServer serviceProvider;
  615. QVERIFY(serviceProvider.listen("test"));
  616. // Connect to the socket.
  617. QLocalSocket socket;
  618. socket.connectToServer("test");
  619. QVERIFY(socket.waitForConnected());
  620. QJsonRpcServiceSocket serviceSocket(&socket);
  621. TestNumberParamsService *service = new TestNumberParamsService;
  622. serviceSocket.addService(service);
  623. QCOMPARE(service->callCount(), 0);
  624. QEventLoop test;
  625. QTimer::singleShot(10, &test, SLOT(quit()));
  626. test.exec();
  627. serviceProvider.notifyConnectedClients("service.numberParameters", QVariantList() << 10 << 3.14159);
  628. QTimer::singleShot(10, &test, SLOT(quit()));
  629. test.exec();
  630. QCOMPARE(service->callCount(), 1);
  631. }
  632. Q_DECLARE_METATYPE(QList<int>)
  633. void TestQJsonRpcServer::testLocalListOfInts()
  634. {
  635. // Initialize the service provider.
  636. QEventLoop loop;
  637. QJsonRpcLocalServer serviceProvider;
  638. serviceProvider.addService(new TestService);
  639. QVERIFY(serviceProvider.listen("test"));
  640. // Connect to the socket.
  641. QLocalSocket socket;
  642. socket.connectToServer("test");
  643. QVERIFY(socket.waitForConnected());
  644. QJsonRpcSocket serviceSocket(&socket, this);
  645. qRegisterMetaType<QList<int> >("QList<int>");
  646. QList<int> intList = QList<int>() << 300 << 30 << 3;
  647. QVariant variant = QVariant::fromValue(intList);
  648. QJsonRpcMessage intRequest = QJsonRpcMessage::createRequest("service.methodWithListOfInts", variant);
  649. QJsonRpcMessage response = serviceSocket.sendMessageBlocking(intRequest);
  650. QVERIFY(response.type() != QJsonRpcMessage::Error);
  651. QVERIFY(response.result().toBool());
  652. }
  653. void TestQJsonRpcServer::testTcpNoParameter()
  654. {
  655. // Initialize the service provider.
  656. QJsonRpcTcpServer serviceProvider;
  657. serviceProvider.addService(new TestService);
  658. QVERIFY(serviceProvider.listen(QHostAddress::LocalHost, 5555));
  659. // Connect to the socket.
  660. QTcpSocket socket;
  661. socket.connectToHost(QHostAddress::LocalHost, 5555);
  662. QVERIFY(socket.waitForConnected());
  663. QJsonRpcSocket serviceSocket(&socket, this);
  664. QSignalSpy spyMessageReceived(&serviceSocket,
  665. SIGNAL(messageReceived(QJsonRpcMessage)));
  666. QJsonRpcMessage request = QJsonRpcMessage::createRequest("service.noParam");
  667. QJsonRpcMessage response = serviceSocket.sendMessageBlocking(request);
  668. QCOMPARE(spyMessageReceived.count(), 1);
  669. QVERIFY(response.errorCode() == QJsonRpc::NoError);
  670. QCOMPARE(request.id(), response.id());
  671. }
  672. void TestQJsonRpcServer::testTcpSingleParameter()
  673. {
  674. // Initialize the service provider.
  675. QJsonRpcTcpServer serviceProvider;
  676. serviceProvider.addService(new TestService);
  677. QVERIFY(serviceProvider.listen(QHostAddress::LocalHost, 5555));
  678. // Connect to the socket.
  679. QTcpSocket socket;
  680. socket.connectToHost(QHostAddress::LocalHost, 5555);
  681. QVERIFY(socket.waitForConnected());
  682. QJsonRpcSocket serviceSocket(&socket, this);
  683. QSignalSpy spyMessageReceived(&serviceSocket,
  684. SIGNAL(messageReceived(QJsonRpcMessage)));
  685. QJsonRpcMessage request = QJsonRpcMessage::createRequest("service.singleParam", QString("single"));
  686. QJsonRpcMessage response = serviceSocket.sendMessageBlocking(request);
  687. QCOMPARE(spyMessageReceived.count(), 1);
  688. QVERIFY(response.errorCode() == QJsonRpc::NoError);
  689. QCOMPARE(request.id(), response.id());
  690. QCOMPARE(response.result().toString(), QLatin1String("single"));
  691. }
  692. void TestQJsonRpcServer::testTcpMultiparameter()
  693. {
  694. // Initialize the service provider.
  695. QJsonRpcTcpServer serviceProvider;
  696. serviceProvider.addService(new TestService);
  697. QVERIFY(serviceProvider.listen(QHostAddress::LocalHost, 5555));
  698. // Connect to the socket.
  699. QTcpSocket socket;
  700. socket.connectToHost(QHostAddress::LocalHost, 5555);
  701. QVERIFY(socket.waitForConnected());
  702. QJsonRpcSocket serviceSocket(&socket, this);
  703. QSignalSpy spyMessageReceived(&serviceSocket,
  704. SIGNAL(messageReceived(QJsonRpcMessage)));
  705. QJsonRpcMessage request = QJsonRpcMessage::createRequest("service.multipleParam",
  706. QVariantList() << QVariant(QString("a"))
  707. << QVariant(QString("b"))
  708. << QVariant(QString("c")));
  709. QJsonRpcMessage response = serviceSocket.sendMessageBlocking(request);
  710. QCOMPARE(spyMessageReceived.count(), 1);
  711. QVERIFY(response.errorCode() == QJsonRpc::NoError);
  712. QCOMPARE(request.id(), response.id());
  713. QCOMPARE(response.result().toString(), QLatin1String("abc"));
  714. }
  715. void TestQJsonRpcServer::testTcpVariantParameter()
  716. {
  717. // Initialize the service provider.
  718. QJsonRpcTcpServer serviceProvider;
  719. serviceProvider.addService(new TestService);
  720. QVERIFY(serviceProvider.listen(QHostAddress::LocalHost, 5555));
  721. // Connect to the socket.
  722. QTcpSocket socket;
  723. socket.connectToHost(QHostAddress::LocalHost, 5555);
  724. QVERIFY(socket.waitForConnected());
  725. QJsonRpcSocket serviceSocket(&socket, this);
  726. QSignalSpy spyMessageReceived(&serviceSocket,
  727. SIGNAL(messageReceived(QJsonRpcMessage)));
  728. QJsonRpcMessage request = QJsonRpcMessage::createRequest("service.variantParameter",
  729. QVariantList() << QVariant(true));
  730. QJsonRpcMessage response = serviceSocket.sendMessageBlocking(request);
  731. QCOMPARE(spyMessageReceived.count(), 1);
  732. QVERIFY(response.errorCode() == QJsonRpc::NoError);
  733. QCOMPARE(request.id(), response.id());
  734. QVERIFY(response.result() == true);
  735. }
  736. void TestQJsonRpcServer::testTcpInvalidArgs()
  737. {
  738. // Initialize the service provider.
  739. QJsonRpcTcpServer serviceProvider;
  740. serviceProvider.addService(new TestService);
  741. QVERIFY(serviceProvider.listen(QHostAddress::LocalHost, 5555));
  742. // Connect to the socket.
  743. QTcpSocket socket;
  744. socket.connectToHost(QHostAddress::LocalHost, 5555);
  745. QVERIFY(socket.waitForConnected());
  746. QJsonRpcSocket serviceSocket(&socket, this);
  747. QSignalSpy spyMessageReceived(&serviceSocket,
  748. SIGNAL(messageReceived(QJsonRpcMessage)));
  749. QJsonRpcMessage request = QJsonRpcMessage::createRequest("service.noParam",
  750. QVariantList() << false);
  751. serviceSocket.sendMessageBlocking(request);
  752. QCOMPARE(spyMessageReceived.count(), 1);
  753. QVariant message = spyMessageReceived.takeFirst().at(0);
  754. QJsonRpcMessage error = message.value<QJsonRpcMessage>();
  755. QCOMPARE(request.id(), error.id());
  756. QVERIFY(error.errorCode() == QJsonRpc::InvalidParams);
  757. }
  758. void TestQJsonRpcServer::testTcpMethodNotFound()
  759. {
  760. // Initialize the service provider.
  761. QJsonRpcTcpServer serviceProvider;
  762. serviceProvider.addService(new TestService);
  763. QVERIFY(serviceProvider.listen(QHostAddress::LocalHost, 5555));
  764. // Connect to the socket.
  765. QTcpSocket socket;
  766. socket.connectToHost(QHostAddress::LocalHost, 5555);
  767. QVERIFY(socket.waitForConnected());
  768. QJsonRpcSocket serviceSocket(&socket, this);
  769. QSignalSpy spyMessageReceived(&serviceSocket,
  770. SIGNAL(messageReceived(QJsonRpcMessage)));
  771. QJsonRpcMessage request = QJsonRpcMessage::createRequest("service.doesNotExist");
  772. serviceSocket.sendMessageBlocking(request);
  773. QCOMPARE(spyMessageReceived.count(), 1);
  774. QVariant message = spyMessageReceived.takeFirst().at(0);
  775. QJsonRpcMessage error = message.value<QJsonRpcMessage>();
  776. QCOMPARE(request.id(), error.id());
  777. QVERIFY(error.errorCode() == QJsonRpc::MethodNotFound);
  778. }
  779. void TestQJsonRpcServer::testTcpInvalidRequest()
  780. {
  781. // Initialize the service provider.
  782. QJsonRpcTcpServer serviceProvider;
  783. serviceProvider.addService(new TestService);
  784. QVERIFY(serviceProvider.listen(QHostAddress::LocalHost, 5555));
  785. // Connect to the socket.
  786. QTcpSocket socket;
  787. socket.connectToHost(QHostAddress::LocalHost, 5555);
  788. QVERIFY(socket.waitForConnected());
  789. QJsonRpcSocket serviceSocket(&socket, this);
  790. QSignalSpy spyMessageReceived(&serviceSocket,
  791. SIGNAL(messageReceived(QJsonRpcMessage)));
  792. QJsonRpcMessage request("{\"jsonrpc\": \"2.0\", \"id\": 666}");
  793. serviceSocket.sendMessageBlocking(request);
  794. QCOMPARE(spyMessageReceived.count(), 1);
  795. QVariant message = spyMessageReceived.takeFirst().at(0);
  796. QJsonRpcMessage error = message.value<QJsonRpcMessage>();
  797. QCOMPARE(request.id(), error.id());
  798. QVERIFY(error.errorCode() == QJsonRpc::InvalidRequest);
  799. }
  800. void TestQJsonRpcServer::testTcpNotifyConnectedClients()
  801. {
  802. // Initialize the service provider.
  803. QEventLoop firstLoop;
  804. QJsonRpcTcpServer serviceProvider;
  805. serviceProvider.addService(new TestService);
  806. QVERIFY(serviceProvider.listen(QHostAddress::LocalHost, 5555));
  807. // first client
  808. QTcpSocket first;
  809. first.connectToHost(QHostAddress::LocalHost, 5555);
  810. QVERIFY(first.waitForConnected());
  811. QJsonRpcSocket firstClient(&first, this);
  812. QSignalSpy firstSpyMessageReceived(&firstClient,
  813. SIGNAL(messageReceived(QJsonRpcMessage)));
  814. // send notification
  815. QJsonRpcMessage notification = QJsonRpcMessage::createNotification("testNotification");
  816. connect(&firstClient, SIGNAL(messageReceived(QJsonRpcMessage)), &firstLoop, SLOT(quit()));
  817. ServerNotificationHelper helper(notification, &serviceProvider);
  818. QTimer::singleShot(100, &helper, SLOT(activate()));
  819. firstLoop.exec();
  820. QCOMPARE(firstSpyMessageReceived.count(), 1);
  821. QVariant firstMessage = firstSpyMessageReceived.takeFirst().at(0);
  822. QJsonRpcMessage firstNotification = firstMessage.value<QJsonRpcMessage>();
  823. QCOMPARE(firstNotification, notification);
  824. }
  825. void TestQJsonRpcServer::testTcpNumberParameters()
  826. {
  827. // Initialize the service provider.
  828. TestNumberParamsService *service = new TestNumberParamsService;
  829. QJsonRpcTcpServer serviceProvider;
  830. serviceProvider.addService(service);
  831. QVERIFY(serviceProvider.listen(QHostAddress::LocalHost, 5555));
  832. // Connect to the socket.
  833. QTcpSocket socket;
  834. socket.connectToHost(QHostAddress::LocalHost, 5555);
  835. QVERIFY(socket.waitForConnected());
  836. QJsonRpcSocket serviceSocket(&socket, this);
  837. QJsonRpcMessage request = QJsonRpcMessage::createRequest("service.numberParameters", QVariantList() << 10 << 3.14159);
  838. serviceSocket.sendMessageBlocking(request);
  839. QCOMPARE(service->callCount(), 1);
  840. }
  841. void TestQJsonRpcServer::testTcpHugeResponse()
  842. {
  843. // Initialize the service provider.
  844. QJsonRpcTcpServer serviceProvider;
  845. serviceProvider.addService(new TestHugeResponseService(this));
  846. QVERIFY(serviceProvider.listen(QHostAddress::LocalHost, 5555));
  847. // Connect to the socket.
  848. QTcpSocket socket;
  849. socket.connectToHost(QHostAddress::LocalHost, 5555);
  850. QVERIFY(socket.waitForConnected());
  851. QJsonRpcSocket serviceSocket(&socket, this);
  852. QSignalSpy spyMessageReceived(&serviceSocket,
  853. SIGNAL(messageReceived(QJsonRpcMessage)));
  854. QJsonRpcMessage request = QJsonRpcMessage::createRequest("service.hugeResponse");
  855. QJsonRpcMessage response = serviceSocket.sendMessageBlocking(request);
  856. QCOMPARE(spyMessageReceived.count(), 1);
  857. QVERIFY(response.isValid());
  858. }
  859. QTEST_MAIN(TestQJsonRpcServer)
  860. #include "tst_qjsonrpcserver.moc"