sock_ut.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. #include "sock.h"
  2. #include <library/cpp/testing/unittest/registar.h>
  3. #include <library/cpp/threading/future/legacy_future.h>
  4. #include <util/system/fs.h>
  5. Y_UNIT_TEST_SUITE(TSocketTest) {
  6. Y_UNIT_TEST(InetDgramTest) {
  7. char buf[256];
  8. TSockAddrInetDgram servAddr(IpFromString("127.0.0.1"), 0);
  9. TSockAddrInetDgram cliAddr(IpFromString("127.0.0.1"), 0);
  10. TSockAddrInetDgram servFromAddr;
  11. TSockAddrInetDgram cliFromAddr;
  12. TInetDgramSocket cliSock;
  13. TInetDgramSocket servSock;
  14. cliSock.CheckSock();
  15. servSock.CheckSock();
  16. TBaseSocket::Check(cliSock.Bind(&cliAddr));
  17. TBaseSocket::Check(servSock.Bind(&servAddr));
  18. // client
  19. const char reqStr[] = "Hello, world!!!";
  20. TBaseSocket::Check(cliSock.SendTo(reqStr, sizeof(reqStr), &servAddr));
  21. // server
  22. TBaseSocket::Check(servSock.RecvFrom(buf, 256, &servFromAddr));
  23. UNIT_ASSERT(strcmp(reqStr, buf) == 0);
  24. const char repStr[] = "The World's greatings to you";
  25. TBaseSocket::Check(servSock.SendTo(repStr, sizeof(repStr), &servFromAddr));
  26. // client
  27. TBaseSocket::Check(cliSock.RecvFrom(buf, 256, &cliFromAddr));
  28. UNIT_ASSERT(strcmp(repStr, buf) == 0);
  29. }
  30. void RunLocalDgramTest(const char* localServerSockName, const char* localClientSockName) {
  31. char buf[256];
  32. TSockAddrLocalDgram servAddr(localServerSockName);
  33. TSockAddrLocalDgram cliAddr(localClientSockName);
  34. TSockAddrLocalDgram servFromAddr;
  35. TSockAddrLocalDgram cliFromAddr;
  36. TLocalDgramSocket cliSock;
  37. TLocalDgramSocket servSock;
  38. cliSock.CheckSock();
  39. servSock.CheckSock();
  40. TBaseSocket::Check(cliSock.Bind(&cliAddr), "bind client");
  41. TBaseSocket::Check(servSock.Bind(&servAddr), "bind server");
  42. // client
  43. const char reqStr[] = "Hello, world!!!";
  44. TBaseSocket::Check(cliSock.SendTo(reqStr, sizeof(reqStr), &servAddr), "send from client");
  45. // server
  46. TBaseSocket::Check(servSock.RecvFrom(buf, 256, &servFromAddr), "receive from client");
  47. UNIT_ASSERT(strcmp(reqStr, buf) == 0);
  48. const char repStr[] = "The World's greatings to you";
  49. TBaseSocket::Check(servSock.SendTo(repStr, sizeof(repStr), &servFromAddr), "send to client");
  50. // client
  51. TBaseSocket::Check(cliSock.RecvFrom(buf, 256, &cliFromAddr), "receive from server");
  52. UNIT_ASSERT(strcmp(repStr, buf) == 0);
  53. }
  54. Y_UNIT_TEST(LocalDgramTest) {
  55. const char* localServerSockName = "./serv_sock";
  56. const char* localClientSockName = "./cli_sock";
  57. RunLocalDgramTest(localServerSockName, localClientSockName);
  58. NFs::Remove(localServerSockName);
  59. NFs::Remove(localClientSockName);
  60. }
  61. template <class A, class S>
  62. void RunInetStreamTest(const char* ip) {
  63. char buf[256];
  64. A servAddr(ip, 0);
  65. A newAddr;
  66. S cliSock;
  67. S servSock;
  68. S newSock;
  69. cliSock.CheckSock();
  70. servSock.CheckSock();
  71. newSock.CheckSock();
  72. // server
  73. int yes = 1;
  74. CheckedSetSockOpt(servSock, SOL_SOCKET, SO_REUSEADDR, yes, "servSock, SO_REUSEADDR");
  75. TBaseSocket::Check(servSock.Bind(&servAddr), "bind");
  76. TBaseSocket::Check(servSock.Listen(10), "listen");
  77. // client
  78. TBaseSocket::Check(cliSock.Connect(&servAddr), "connect");
  79. // server
  80. TBaseSocket::Check(servSock.Accept(&newSock, &newAddr), "accept");
  81. // client
  82. const char reqStr[] = "Hello, world!!!";
  83. TBaseSocket::Check(cliSock.Send(reqStr, sizeof(reqStr)), "send");
  84. // server - new
  85. TBaseSocket::Check(newSock.Recv(buf, 256), "recv");
  86. UNIT_ASSERT(strcmp(reqStr, buf) == 0);
  87. const char repStr[] = "The World's greatings to you";
  88. TBaseSocket::Check(newSock.Send(repStr, sizeof(repStr)), "send");
  89. // client
  90. TBaseSocket::Check(cliSock.Recv(buf, 256), "recv");
  91. UNIT_ASSERT(strcmp(repStr, buf) == 0);
  92. }
  93. Y_UNIT_TEST(InetStreamTest) {
  94. RunInetStreamTest<TSockAddrInetStream, TInetStreamSocket>("127.0.0.1");
  95. }
  96. Y_UNIT_TEST(Inet6StreamTest) {
  97. RunInetStreamTest<TSockAddrInet6Stream, TInet6StreamSocket>("::1");
  98. }
  99. void RunLocalStreamTest(const char* localServerSockName) {
  100. char buf[256];
  101. TSockAddrLocalStream servAddr(localServerSockName);
  102. TSockAddrLocalStream newAddr;
  103. TLocalStreamSocket cliSock;
  104. TLocalStreamSocket servSock;
  105. TLocalStreamSocket newSock;
  106. cliSock.CheckSock();
  107. servSock.CheckSock();
  108. newSock.CheckSock();
  109. // server
  110. TBaseSocket::Check(servSock.Bind(&servAddr), "bind");
  111. TBaseSocket::Check(servSock.Listen(10), "listen");
  112. NThreading::TLegacyFuture<void> f([&]() {
  113. // server
  114. TBaseSocket::Check(servSock.Accept(&newSock, &newAddr), "accept");
  115. });
  116. // client
  117. TBaseSocket::Check(cliSock.Connect(&servAddr), "connect");
  118. f.Get();
  119. // client
  120. const char reqStr[] = "Hello, world!!!";
  121. TBaseSocket::Check(cliSock.Send(reqStr, sizeof(reqStr)), "send");
  122. // server - new
  123. TBaseSocket::Check(newSock.Recv(buf, 256), "recv");
  124. UNIT_ASSERT(strcmp(reqStr, buf) == 0);
  125. const char repStr[] = "The World's greatings to you";
  126. TBaseSocket::Check(newSock.Send(repStr, sizeof(repStr)), "send");
  127. // client
  128. TBaseSocket::Check(cliSock.Recv(buf, 256), "recv");
  129. UNIT_ASSERT(strcmp(repStr, buf) == 0);
  130. }
  131. Y_UNIT_TEST(LocalStreamTest) {
  132. const char* localServerSockName = "./serv_sock2";
  133. RunLocalStreamTest(localServerSockName);
  134. NFs::Remove(localServerSockName);
  135. }
  136. }