RpcClientTest.cc 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #include <gtest/gtest.h>
  2. #include "Rpc/RpcClient.h"
  3. #include "Thread/CountBarrier.h"
  4. #include "Thread/ThreadPool.h"
  5. #include "Rpc/RpcController.h"
  6. #include "Rpc/Echo.pb.h"
  7. namespace Egametang {
  8. class RpcServerTest: public RpcCommunicator
  9. {
  10. public:
  11. CountBarrier& barrier;
  12. int32 num;
  13. boost::asio::ip::tcp::acceptor acceptor;
  14. public:
  15. RpcServerTest(boost::asio::io_service& ioService, int port, CountBarrier& barrier):
  16. RpcCommunicator(ioService), acceptor(ioService),
  17. barrier(barrier), num(0)
  18. {
  19. boost::asio::ip::address address;
  20. address.from_string("127.0.0.1");
  21. boost::asio::ip::tcp::endpoint endpoint(address, port);
  22. acceptor.open(endpoint.protocol());
  23. acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
  24. acceptor.bind(endpoint);
  25. acceptor.listen();
  26. acceptor.async_accept(socket,
  27. boost::bind(&RpcServerTest::OnAsyncAccept, this,
  28. boost::asio::placeholders::error));
  29. }
  30. void OnAsyncAccept(const boost::system::error_code& err)
  31. {
  32. if (err)
  33. {
  34. return;
  35. }
  36. RpcMetaPtr meta(new RpcMeta());
  37. StringPtr message(new std::string);
  38. RecvMeta(meta, message);
  39. }
  40. void Stop()
  41. {
  42. acceptor.close();
  43. socket.close();
  44. }
  45. virtual void OnRecvMessage(RpcMetaPtr meta, StringPtr message)
  46. {
  47. EchoRequest request;
  48. request.ParseFromString(*message);
  49. num = request.num();
  50. EchoResponse response;
  51. response.set_num(num);
  52. StringPtr responseMessage(new std::string);
  53. response.SerializeToString(responseMessage.get());
  54. RpcMetaPtr responseMeta(new RpcMeta());
  55. responseMeta->id = meta->id;
  56. responseMeta->size = responseMessage->size();
  57. SendMeta(responseMeta, responseMessage);
  58. }
  59. virtual void OnSendMessage(RpcMetaPtr meta, StringPtr message)
  60. {
  61. barrier.Signal();
  62. }
  63. };
  64. class RpcClientTest: public testing::Test
  65. {
  66. protected:
  67. int port;
  68. public:
  69. RpcClientTest(): port(10002)
  70. {
  71. }
  72. virtual ~RpcClientTest()
  73. {
  74. }
  75. };
  76. static void IOServiceRun(boost::asio::io_service* ioService)
  77. {
  78. ioService->run();
  79. }
  80. TEST_F(RpcClientTest, Echo)
  81. {
  82. boost::asio::io_service ioServer;
  83. boost::asio::io_service ioClient;
  84. CountBarrier barrier(2);
  85. RpcServerTest server(ioServer, port, barrier);
  86. RpcClientPtr client(new RpcClient(ioClient, "127.0.0.1", port));
  87. EchoService_Stub service(client.get());
  88. ThreadPool threadPool(2);
  89. threadPool.Schedule(boost::bind(&IOServiceRun, &ioServer));
  90. threadPool.Schedule(boost::bind(&IOServiceRun, &ioClient));
  91. EchoRequest request;
  92. request.set_num(100);
  93. EchoResponse response;
  94. ASSERT_EQ(0, response.num());
  95. service.Echo(NULL, &request, &response,
  96. google::protobuf::NewCallback(&barrier, &CountBarrier::Signal));
  97. barrier.Wait();
  98. client->Stop();
  99. server.Stop();
  100. ioServer.stop();
  101. ioClient.stop();
  102. // 必须主动让client和server stop才能wait线程
  103. threadPool.Wait();
  104. ASSERT_EQ(100, response.num());
  105. }
  106. } // namespace Egametang
  107. int main(int argc, char* argv[])
  108. {
  109. testing::InitGoogleTest(&argc, argv);
  110. return RUN_ALL_TESTS();
  111. }