Browse Source

Add subscription method for QGrpcAsyncReply

- Add subscription method to encapsulate connections to finished and
  error signals
- Update and implement tests
Alexey Edelev 5 years ago
parent
commit
4b3702681a
3 changed files with 87 additions and 6 deletions
  1. 22 0
      src/grpc/qgrpcasyncreply.h
  2. 60 1
      tests/test_grpc/clienttest.cpp
  3. 5 5
      tests/test_grpc/echoserver/main.cpp

+ 22 - 0
src/grpc/qgrpcasyncreply.h

@@ -87,6 +87,28 @@ public:
         m_channel->abort(this);
     }
 
+    /*!
+     * \brief Subscribe to QGrpcAsyncReply signals
+     */
+    template <typename Func1, typename Func2>
+    inline void subscribe(QObject *receiver, Func1 finishCallback, Func2 errorCallback,
+                                     Qt::ConnectionType type = Qt::AutoConnection)
+    {
+        QObject::connect(this, &QGrpcAsyncReply::finished, receiver, finishCallback, type);
+        QObject::connect(this, &QGrpcAsyncReply::error, receiver, errorCallback, type);
+    }
+
+    /*!
+     * \brief Overloaded QGrpcAsyncReply::subscribe method, to subscribe to finished signal
+     *        only
+     */
+    template <typename Func1>
+    inline void subscribe(QObject *receiver, Func1 finishCallback,
+                                     Qt::ConnectionType type = Qt::AutoConnection)
+    {
+        QObject::connect(this, &QGrpcAsyncReply::finished, receiver, finishCallback, type);
+    }
+
 signals:
     /*!
      * \brief The signal is emitted when reply is ready for read. Usualy called by channel when all chunks of data

+ 60 - 1
tests/test_grpc/clienttest.cpp

@@ -174,7 +174,7 @@ TEST_F(ClientTest, StringEchoDeferredAsyncAbortTest)
         errorCalled = true;
     });
 
-    QTimer::singleShot(2000, reply, &QGrpcAsyncReply::abort);
+    QTimer::singleShot(500, reply, &QGrpcAsyncReply::abort);
     QTimer::singleShot(5000, &waiter, &QEventLoop::quit);
 
     waiter.exec();
@@ -388,3 +388,62 @@ TEST_F(ClientTest, ClientSyncTestUnattachedChannelSignal)
     delete ret;
 }
 
+TEST_F(ClientTest, AsyncReplySubscribeTest)
+{
+    QTimer callTimeout;
+    TestServiceClient testClient;
+    testClient.attachChannel(std::make_shared<QGrpcHttp2Channel>(m_echoServerAddress, InsecureCredentials()));
+    SimpleStringMessage request(QString{"Some status message"});
+    QGrpcStatus::StatusCode asyncStatus = QGrpcStatus::StatusCode::Ok;
+    QEventLoop waiter;
+    QString statusMessage;
+
+    QObject::connect(&callTimeout, &QTimer::timeout, &waiter, &QEventLoop::quit);
+    callTimeout.setInterval(5000);
+    auto reply = testClient.testMethodStatusMessage(request);
+
+    reply->subscribe(&m_app, []() {
+        ASSERT_TRUE(false);
+    },
+    [&asyncStatus, &waiter, &statusMessage](const QGrpcStatus &status) {
+        asyncStatus = status.code();
+        statusMessage = status.message();
+        waiter.quit();
+    });
+
+    callTimeout.start();
+    waiter.exec();
+    callTimeout.stop();
+
+    ASSERT_STREQ(statusMessage.toStdString().c_str(), request.testFieldString().toStdString().c_str());
+
+    SimpleStringMessage result;
+    request.setTestFieldString("Hello beach!");
+
+    reply = testClient.testMethod(request);
+    reply->subscribe(&m_app, [reply, &result, &waiter]() {
+        result = reply->read<SimpleStringMessage>();
+        waiter.quit();
+    });
+
+    callTimeout.start();
+    waiter.exec();
+    callTimeout.stop();
+    ASSERT_STREQ(result.testFieldString().toStdString().c_str(), request.testFieldString().toStdString().c_str());
+
+    result.setTestFieldString("");
+    request.setTestFieldString("Hello beach1!");
+
+    reply = testClient.testMethod(request);
+    reply->subscribe(&m_app, [reply, &result, &waiter]() {
+        result = reply->read<SimpleStringMessage>();
+        waiter.quit();
+    }, []() {
+        ASSERT_TRUE(false);
+    });
+
+    callTimeout.start();
+    waiter.exec();
+    callTimeout.stop();
+    ASSERT_STREQ(result.testFieldString().toStdString().c_str(), request.testFieldString().toStdString().c_str());
+}

+ 5 - 5
tests/test_grpc/echoserver/main.cpp

@@ -13,7 +13,7 @@ public:
         std::cerr << "testMethod called" << std::endl << request->testfieldstring() << std::endl;
         response->set_testfieldstring(request->testfieldstring());
         if (request->testfieldstring() == "sleep") {
-            std::this_thread::sleep_for(std::chrono::seconds(3));
+            std::this_thread::sleep_for(std::chrono::seconds(1));
         }
         return ::grpc::Status();
     }
@@ -25,22 +25,22 @@ public:
         qtprotobufnamespace::tests::SimpleStringMessage msg;
 
         msg.set_testfieldstring(request->testfieldstring() + "1");
-        std::this_thread::sleep_for(std::chrono::seconds(3));
+        std::this_thread::sleep_for(std::chrono::seconds(1));
         std::cerr << "send back " << (request->testfieldstring() + "1") << std::endl;
         writer->Write(msg);
 
         msg.set_testfieldstring(request->testfieldstring() + "2");
-        std::this_thread::sleep_for(std::chrono::seconds(3));
+        std::this_thread::sleep_for(std::chrono::seconds(1));
         std::cerr << "send back " << (request->testfieldstring() + "2") << std::endl;
         writer->Write(msg);
 
         msg.set_testfieldstring(request->testfieldstring() + "3");
-        std::this_thread::sleep_for(std::chrono::seconds(3));
+        std::this_thread::sleep_for(std::chrono::seconds(1));
         std::cerr << "send back " << (request->testfieldstring() + "3") << std::endl;
         writer->Write(msg);
 
         msg.set_testfieldstring(request->testfieldstring() + "4");
-        std::this_thread::sleep_for(std::chrono::seconds(3));
+        std::this_thread::sleep_for(std::chrono::seconds(1));
         std::cerr << "send back " << (request->testfieldstring() + "4") << std::endl;
         writer->WriteLast(msg, grpc::WriteOptions());