THRIFT-3566: fixed TQTcpServerTest - it was never executed and working
Client: C++
Patch: Sebastian Zenker

C++/Qt: TQTcpServerTest did never execute the actual test method test_communicate() as it wasn't declared as a Qt slot. The test gets now executed but it is broken because server and (synchronous) client cannot be executed in the same thread.
diff --git a/lib/cpp/test/qt/TQTcpServerTest.cpp b/lib/cpp/test/qt/TQTcpServerTest.cpp
index 0cad6a9..422d771 100644
--- a/lib/cpp/test/qt/TQTcpServerTest.cpp
+++ b/lib/cpp/test/qt/TQTcpServerTest.cpp
@@ -5,6 +5,7 @@
 #include <QTcpServer>
 #include <QTcpSocket>
 #include <QHostAddress>
+#include <QThread>
 
 #ifndef Q_MOC_RUN
   #include <boost/smart_ptr.hpp>
@@ -42,46 +43,68 @@
 };
 
 class TQTcpServerTest : public QObject {
-  void init() {
-    // setup server
-    serverSocket.reset(new QTcpServer);
-    server.reset(new async::TQTcpServer(serverSocket,
-                                        boost::make_shared<test::ParentServiceAsyncProcessor>(
-                                            boost::make_shared<AsyncHandler>()),
-                                        boost::make_shared<protocol::TBinaryProtocolFactory>()));
-    QVERIFY(serverSocket->listen(QHostAddress::LocalHost));
-    int port = serverSocket->serverPort();
-    QVERIFY(port > 0);
+  Q_OBJECT
 
-    // setup client
-    socket.reset(new QTcpSocket);
-    client.reset(new test::ParentServiceClient(boost::make_shared<protocol::TBinaryProtocol>(
-        boost::make_shared<transport::TQIODeviceTransport>(socket))));
-    socket->connectToHost(QHostAddress::LocalHost, port);
-    QVERIFY(socket->waitForConnected());
-  }
+private slots:
+  void initTestCase();
+  void cleanupTestCase();
+  void test_communicate();
 
-  void cleanup() {
-    socket->close();
-    serverSocket->close();
-  }
-
-  void test_communicate() {
-    client->addString("foo");
-    client->addString("bar");
-
-    std::vector<std::string> reply;
-    client->getStrings(reply);
-    QCOMPARE(reply[0], "foo");
-    QCOMPARE(reply[1], "foo");
-  }
-
-  boost::shared_ptr<QTcpServer> serverSocket;
+private:
+  boost::shared_ptr<QThread> serverThread;
   boost::shared_ptr<async::TQTcpServer> server;
-  boost::shared_ptr<QTcpSocket> socket;
   boost::shared_ptr<test::ParentServiceClient> client;
 };
 
+void TQTcpServerTest::initTestCase() {
+  // setup server
+  boost::shared_ptr<QTcpServer> serverSocket = boost::make_shared<QTcpServer>();
+  server.reset(new async::TQTcpServer(serverSocket,
+                                      boost::make_shared<test::ParentServiceAsyncProcessor>(
+                                          boost::make_shared<AsyncHandler>()),
+                                      boost::make_shared<protocol::TBinaryProtocolFactory>()));
+  QVERIFY(serverSocket->listen(QHostAddress::LocalHost));
+  int port = serverSocket->serverPort();
+  QVERIFY(port > 0);
+
+  //setup server thread and move server to it
+  serverThread.reset(new QThread());
+  serverSocket->moveToThread(serverThread.get());
+  server->moveToThread(serverThread.get());
+  serverThread->start();
+
+  // setup client
+  boost::shared_ptr<QTcpSocket> socket = boost::make_shared<QTcpSocket>();
+  client.reset(new test::ParentServiceClient(boost::make_shared<protocol::TBinaryProtocol>(
+      boost::make_shared<transport::TQIODeviceTransport>(socket))));
+  socket->connectToHost(QHostAddress::LocalHost, port);
+  QVERIFY(socket->waitForConnected());
+}
+
+void TQTcpServerTest::cleanupTestCase() {
+  //first, stop the thread which holds the server
+  serverThread->quit();
+  serverThread->wait();
+  // now, it is safe to delete the server
+  server.reset();
+  // delete thread now
+  serverThread.reset();
+
+  // cleanup client
+  client.reset();
+}
+
+void TQTcpServerTest::test_communicate() {
+  client->addString("foo");
+  client->addString("bar");
+
+  std::vector<std::string> reply;
+  client->getStrings(reply);
+  QCOMPARE(QString::fromStdString(reply[0]), QString("foo"));
+  QCOMPARE(QString::fromStdString(reply[1]), QString("bar"));
+}
+
+
 #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
 QTEST_GUILESS_MAIN(TQTcpServerTest);
 #else