1 #define BOOST_TEST_MODULE TQTcpServerTest
2 #include <QTest>
3 #include <iostream>
4 
5 #include <QTcpServer>
6 #include <QTcpSocket>
7 #include <QHostAddress>
8 #include <QThread>
9 
10 #ifndef Q_MOC_RUN
11   #include "thrift/protocol/TBinaryProtocol.h"
12   #include "thrift/async/TAsyncProcessor.h"
13   #include "thrift/qt/TQTcpServer.h"
14   #include "thrift/qt/TQIODeviceTransport.h"
15 
16   #include "gen-cpp/ParentService.h"
17 #endif
18 
19 using namespace apache::thrift;
20 
21 struct AsyncHandler : public test::ParentServiceCobSvIf {
22   std::vector<std::string> strings;
addStringAsyncHandler23   void addString(std::function<void()> cob, const std::string& s) override {
24     strings.push_back(s);
25     cob();
26   }
getStringsAsyncHandler27   void getStrings(std::function<void(std::vector<std::string> const& _return)> cob) override {
28     cob(strings);
29   }
30 
31   // Overrides not used in this test
incrementGenerationAsyncHandler32   void incrementGeneration(std::function<void(int32_t const& _return)> cob) override {}
getGenerationAsyncHandler33   void getGeneration(std::function<void(int32_t const& _return)> cob) override {}
getDataWaitAsyncHandler34   void getDataWait(std::function<void(std::string const& _return)> cob,
35                            const int32_t length) override {}
onewayWaitAsyncHandler36   void onewayWait(std::function<void()> cob) override {}
exceptionWaitAsyncHandler37   void exceptionWait(
38       std::function<void()> cob,
39       std::function<void(::apache::thrift::TDelayedException* _throw)> /* exn_cob */,
40       const std::string& message) override {}
unexpectedExceptionWaitAsyncHandler41   void unexpectedExceptionWait(std::function<void()> cob, const std::string& message) override {}
42 };
43 
44 class TQTcpServerTest : public QObject {
45   Q_OBJECT
46 
47 private slots:
48   void initTestCase();
49   void cleanupTestCase();
50   void test_communicate();
51 
52 private:
53   std::shared_ptr<QThread> serverThread;
54   std::shared_ptr<async::TQTcpServer> server;
55   std::shared_ptr<test::ParentServiceClient> client;
56 };
57 
initTestCase()58 void TQTcpServerTest::initTestCase() {
59   // setup server
60   std::shared_ptr<QTcpServer> serverSocket = std::make_shared<QTcpServer>();
61   server.reset(new async::TQTcpServer(serverSocket,
62                                       std::make_shared<test::ParentServiceAsyncProcessor>(
63                                       std::make_shared<AsyncHandler>()),
64                                       std::make_shared<protocol::TBinaryProtocolFactory>()));
65   QVERIFY(serverSocket->listen(QHostAddress::LocalHost));
66   int port = serverSocket->serverPort();
67   QVERIFY(port > 0);
68 
69   //setup server thread and move server to it
70   serverThread.reset(new QThread());
71   serverSocket->moveToThread(serverThread.get());
72   server->moveToThread(serverThread.get());
73   serverThread->start();
74 
75   // setup client
76   std::shared_ptr<QTcpSocket> socket = std::make_shared<QTcpSocket>();
77   client.reset(new test::ParentServiceClient(std::make_shared<protocol::TBinaryProtocol>(
78       std::make_shared<transport::TQIODeviceTransport>(socket))));
79   socket->connectToHost(QHostAddress::LocalHost, port);
80   QVERIFY(socket->waitForConnected());
81 }
82 
cleanupTestCase()83 void TQTcpServerTest::cleanupTestCase() {
84   //first, stop the thread which holds the server
85   serverThread->quit();
86   serverThread->wait();
87   // now, it is safe to delete the server
88   server.reset();
89   // delete thread now
90   serverThread.reset();
91 
92   // cleanup client
93   client.reset();
94 }
95 
test_communicate()96 void TQTcpServerTest::test_communicate() {
97   client->addString("foo");
98   client->addString("bar");
99 
100   std::vector<std::string> reply;
101   client->getStrings(reply);
102   QCOMPARE(QString::fromStdString(reply[0]), QString("foo"));
103   QCOMPARE(QString::fromStdString(reply[1]), QString("bar"));
104 }
105 
106 
107 #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
108 QTEST_GUILESS_MAIN(TQTcpServerTest);
109 #else
110 #undef QT_GUI_LIB
111 QTEST_MAIN(TQTcpServerTest);
112 #endif
113 #include "TQTcpServerTest.moc"
114