@@ -166,7 +166,7 @@ static constexpr const char* EXPECTED_CALL_MESSAGE_1 = "[2, \"1\", \"Heart
166166static constexpr const char * EXPECTED_CALL_MESSAGE_2 = " [2, \" 2\" , \" Heartbeat\" , {\" id\" :4}]" ;
167167static constexpr const char * EXPECTED_CALLRESULT_MESSAGE_1 = " [3, \" 1\" , {\" name\" :\" bob\" }]" ;
168168static constexpr const char * EXPECTED_CALLRESULT_MESSAGE_2 = " [3, \" 2\" , {\" name\" :\" bob\" }]" ;
169- static constexpr const char * EXPECTED_CALLERROR_MESSAGE_1 = " [4, \" 1 \" , \" NotImplemented\" , \" This is an error!\" , {}]" ;
169+ static constexpr const char * EXPECTED_CALLERROR_MESSAGE_0 = " [4, \" 0 \" , \" NotImplemented\" , \" This is an error!\" , {}]" ;
170170
171171TEST_SUITE (" CALL messages" )
172172{
@@ -184,14 +184,16 @@ TEST_SUITE("CALL messages")
184184
185185 rapidjson::Document rpc_frame;
186186 rapidjson::Value response;
187+ std::string error;
188+ std::string message;
187189 rapidjson::StringBuffer buffer;
188190 rapidjson::Writer<rapidjson::StringBuffer> writer (buffer);
189191
190- CHECK_FALSE (client.call (ACTION, payload, rpc_frame, response, std::chrono::milliseconds (0 )));
192+ CHECK_FALSE (client.call (ACTION, payload, rpc_frame, response, error, message, std::chrono::milliseconds (0 )));
191193 CHECK (websocket.sendCalled ());
192194 CHECK_EQ (strcmp (reinterpret_cast <const char *>(websocket.sentData ()), EXPECTED_CALL_MESSAGE_0), 0 );
193195
194- CHECK_FALSE (client.call (ACTION, payload, rpc_frame, response, std::chrono::milliseconds (0 )));
196+ CHECK_FALSE (client.call (ACTION, payload, rpc_frame, response, error, message, std::chrono::milliseconds (0 )));
195197 CHECK_EQ (strcmp (reinterpret_cast <const char *>(websocket.sentData ()), EXPECTED_CALL_MESSAGE_1), 0 );
196198
197199 std::thread response_thread (
@@ -200,13 +202,41 @@ TEST_SUITE("CALL messages")
200202 std::this_thread::sleep_for (std::chrono::milliseconds (25u ));
201203 websocket.notifyDataReceived (EXPECTED_CALLRESULT_MESSAGE_2, strlen (EXPECTED_CALLRESULT_MESSAGE_2));
202204 });
203- CHECK (client.call (ACTION, payload, rpc_frame, response, std::chrono::milliseconds (50 )));
205+ CHECK (client.call (ACTION, payload, rpc_frame, response, error, message, std::chrono::milliseconds (50 )));
204206 CHECK_EQ (strcmp (reinterpret_cast <const char *>(websocket.sentData ()), EXPECTED_CALL_MESSAGE_2), 0 );
205207 response.Accept (writer);
206208 CHECK_EQ (strcmp (buffer.GetString (), CALLRESULT_PAYLOAD), 0 );
207209 response_thread.join ();
208210 }
209211
212+ TEST_CASE (" Call error" )
213+ {
214+ RpcClientListener listener;
215+ WebsocketClientStub websocket;
216+ RpcClient client (websocket, WS_PROTOCOL);
217+ client.registerListener (listener);
218+ client.registerClientListener (listener);
219+ websocket.setConnected ();
220+
221+ rapidjson::Document payload;
222+ rapidjson::Document rpc_frame;
223+ rapidjson::Value response;
224+ std::string error;
225+ std::string message;
226+
227+ std::thread response_thread (
228+ [&websocket]
229+ {
230+ std::this_thread::sleep_for (std::chrono::milliseconds (25u ));
231+ websocket.notifyDataReceived (EXPECTED_CALLERROR_MESSAGE_0, strlen (EXPECTED_CALLERROR_MESSAGE_0));
232+ });
233+ CHECK (client.call (ACTION, payload, rpc_frame, response, error, message, std::chrono::milliseconds (50 )));
234+ CHECK_EQ (error, " NotImplemented" );
235+ CHECK_EQ (message, " This is an error!" );
236+ CHECK (response.IsObject ());
237+ response_thread.join ();
238+ }
239+
210240 TEST_CASE (" Timeout" )
211241 {
212242 RpcClientListener listener;
@@ -219,16 +249,18 @@ TEST_SUITE("CALL messages")
219249 rapidjson::Document payload;
220250 rapidjson::Document rpc_frame;
221251 rapidjson::Value response;
252+ std::string error;
253+ std::string message;
222254
223255 auto start = std::chrono::steady_clock::now ();
224- CHECK_FALSE (client.call (ACTION, payload, rpc_frame, response, std::chrono::milliseconds (0 )));
256+ CHECK_FALSE (client.call (ACTION, payload, rpc_frame, response, error, message, std::chrono::milliseconds (0 )));
225257 auto end = std::chrono::steady_clock::now ();
226258 std::chrono::duration<double > diff = end - start;
227259 CHECK_LT (diff, std::chrono::milliseconds (5u ));
228260 CHECK (websocket.sendCalled ());
229261
230262 start = std::chrono::steady_clock::now ();
231- CHECK_FALSE (client.call (ACTION, payload, rpc_frame, response, std::chrono::milliseconds (100 )));
263+ CHECK_FALSE (client.call (ACTION, payload, rpc_frame, response, error, message, std::chrono::milliseconds (100 )));
232264 end = std::chrono::steady_clock::now ();
233265 diff = end - start;
234266 CHECK_GT (diff, std::chrono::milliseconds (99u ));
@@ -240,7 +272,7 @@ TEST_SUITE("CALL messages")
240272 std::this_thread::sleep_for (std::chrono::milliseconds (100u ));
241273 websocket.notifyDataReceived (EXPECTED_CALLRESULT_MESSAGE_2, strlen (EXPECTED_CALLRESULT_MESSAGE_2));
242274 });
243- CHECK_FALSE (client.call (ACTION, payload, rpc_frame, response, std::chrono::milliseconds (50 )));
275+ CHECK_FALSE (client.call (ACTION, payload, rpc_frame, response, error, message, std::chrono::milliseconds (50 )));
244276 response_thread.join ();
245277 }
246278
@@ -277,11 +309,11 @@ TEST_SUITE("CALL messages")
277309 listener.received_error = true ;
278310 listener.error_code = IRpc::RPC_ERROR_NOT_IMPLEMENTED;
279311 listener.error_message = CALLERROR_PAYLOAD;
280- websocket.notifyDataReceived (EXPECTED_CALL_MESSAGE_1 , strlen (EXPECTED_CALL_MESSAGE_1 ));
312+ websocket.notifyDataReceived (EXPECTED_CALL_MESSAGE_0 , strlen (EXPECTED_CALL_MESSAGE_0 ));
281313 std::this_thread::sleep_for (std::chrono::milliseconds (50u ));
282314 CHECK_EQ (listener.action , ACTION);
283315 CHECK_EQ (listener.payload , CALL_PAYLOAD);
284316 CHECK (websocket.sendCalled ());
285- CHECK_EQ (strcmp (reinterpret_cast <const char *>(websocket.sentData ()), EXPECTED_CALLERROR_MESSAGE_1 ), 0 );
317+ CHECK_EQ (strcmp (reinterpret_cast <const char *>(websocket.sentData ()), EXPECTED_CALLERROR_MESSAGE_0 ), 0 );
286318 }
287319}
0 commit comments