SocketTest.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. /*
  2. * Author: Patrick-Christopher Mattulat
  3. * Company: Lynar Studios
  4. * E-Mail: webmaster@lynarstudios.com
  5. * Created: 2020-11-16
  6. * Changed: 2022-12-27
  7. *
  8. * */
  9. #include <ls_std/ls_std_os.hpp>
  10. #include <gtest/gtest.h>
  11. #include <ls_std/ls_std_network.hpp>
  12. #include <ls_std/ls_std_core.hpp>
  13. #include <ls_std_core_test.hpp>
  14. #include <ls_std_common_test.hpp>
  15. using namespace ls::std::network;
  16. using namespace ::testing;
  17. using namespace ::std;
  18. using namespace ls::std::core;
  19. using namespace ls::std::core::type;
  20. using namespace ls_std_core_test;
  21. using namespace ls_std_common_test;
  22. namespace
  23. {
  24. class SocketTest : public ::testing::Test
  25. {
  26. protected:
  27. SocketTest() = default;
  28. ~SocketTest() override = default;
  29. void SetUp() override
  30. {}
  31. void TearDown() override
  32. {}
  33. static SocketParameter generateSocketParameter()
  34. {
  35. SocketParameter socketParameter{};
  36. socketParameter.protocolFamilyType = ProtocolFamilyType::PROTOCOL_FAMILY_TYPE_IPV4;
  37. SocketAddress socketAddress{};
  38. socketAddress.protocolType = ProtocolType::PROTOCOL_TYPE_TCP;
  39. socketAddress.ipAddress = "127.0.0.1";
  40. socketAddress.port = 2220;
  41. socketParameter.socketAddress = socketAddress;
  42. return socketParameter;
  43. }
  44. };
  45. TEST_F(SocketTest, getClassName)
  46. {
  47. ASSERT_STREQ("Socket", Socket{generateSocketParameter()}.getClassName().c_str());
  48. }
  49. TEST_F(SocketTest, read)
  50. {
  51. SocketParameter parameter = generateSocketParameter();
  52. #if LS_STD_UNIX_PLATFORM
  53. shared_ptr<MockPosixSocket> mockSocket = make_shared<MockPosixSocket>();
  54. shared_ptr<MockPosixReader> mockReader = make_shared<MockPosixReader>();
  55. parameter.posixSocket = mockSocket;
  56. parameter.posixReader = mockReader;
  57. EXPECT_CALL(*mockSocket, create(_, _, _)).Times(AtLeast(1));
  58. ON_CALL(*mockSocket, create(_, _, _)).WillByDefault(Return(0));
  59. EXPECT_CALL(*mockReader, read(_, _, _)).Times(AtLeast(1));
  60. ON_CALL(*mockReader, read(_, _, _)).WillByDefault(Return(1));
  61. EXPECT_CALL(*mockSocket, close(_)).Times(AtLeast(1));
  62. ON_CALL(*mockSocket, close(_)).WillByDefault(Return(0));
  63. #endif
  64. parameter.readBufferSize = 32;
  65. Socket socket{parameter};
  66. ASSERT_FALSE(socket.read().empty());
  67. }
  68. TEST_F(SocketTest, read_no_buffer_size_set)
  69. {
  70. SocketParameter parameter = generateSocketParameter();
  71. #if LS_STD_UNIX_PLATFORM
  72. shared_ptr<MockPosixSocket> mockSocket = make_shared<MockPosixSocket>();
  73. parameter.posixSocket = mockSocket;
  74. EXPECT_CALL(*mockSocket, create(_, _, _)).Times(AtLeast(1));
  75. ON_CALL(*mockSocket, create(_, _, _)).WillByDefault(Return(0));
  76. EXPECT_CALL(*mockSocket, close(_)).Times(AtLeast(1));
  77. ON_CALL(*mockSocket, close(_)).WillByDefault(Return(0));
  78. #endif
  79. Socket socket{parameter};
  80. EXPECT_THROW({
  81. try
  82. {
  83. byte_field data = socket.read();
  84. }
  85. catch (const IllegalArgumentException &_exception)
  86. {
  87. throw;
  88. }
  89. }, IllegalArgumentException);
  90. }
  91. TEST_F(SocketTest, read_api_call_failed)
  92. {
  93. SocketParameter parameter = generateSocketParameter();
  94. #if LS_STD_UNIX_PLATFORM
  95. shared_ptr<MockPosixSocket> mockSocket = make_shared<MockPosixSocket>();
  96. shared_ptr<MockPosixReader> mockReader = make_shared<MockPosixReader>();
  97. parameter.posixSocket = mockSocket;
  98. parameter.posixReader = mockReader;
  99. EXPECT_CALL(*mockSocket, create(_, _, _)).Times(AtLeast(1));
  100. ON_CALL(*mockSocket, create(_, _, _)).WillByDefault(Return(0));
  101. EXPECT_CALL(*mockReader, read(_, _, _)).Times(AtLeast(1));
  102. ON_CALL(*mockReader, read(_, _, _)).WillByDefault(Return(-1));
  103. EXPECT_CALL(*mockSocket, close(_)).Times(AtLeast(1));
  104. ON_CALL(*mockSocket, close(_)).WillByDefault(Return(0));
  105. #endif
  106. parameter.readBufferSize = 32;
  107. Socket socket{parameter};
  108. EXPECT_THROW({
  109. try
  110. {
  111. byte_field data = socket.read();
  112. }
  113. catch (const FileOperationException &_exception)
  114. {
  115. throw;
  116. }
  117. }, FileOperationException);
  118. }
  119. TEST_F(SocketTest, write)
  120. {
  121. SocketParameter parameter = generateSocketParameter();
  122. #if LS_STD_UNIX_PLATFORM
  123. shared_ptr<MockPosixSocket> mockSocket = make_shared<MockPosixSocket>();
  124. shared_ptr<MockPosixWriter> mockWriter = make_shared<MockPosixWriter>();
  125. parameter.posixSocket = mockSocket;
  126. parameter.posixWriter = mockWriter;
  127. EXPECT_CALL(*mockSocket, create(_, _, _)).Times(AtLeast(1));
  128. ON_CALL(*mockSocket, create(_, _, _)).WillByDefault(Return(0));
  129. EXPECT_CALL(*mockWriter, write(_, _, _)).Times(AtLeast(1));
  130. ON_CALL(*mockWriter, write(_, _, _)).WillByDefault(Return(0));
  131. EXPECT_CALL(*mockSocket, close(_)).Times(AtLeast(1));
  132. ON_CALL(*mockSocket, close(_)).WillByDefault(Return(0));
  133. #endif
  134. Socket socket{parameter};
  135. ASSERT_TRUE(socket.write("Hello Server!"));
  136. }
  137. TEST_F(SocketTest, accept) // TODO: adjust accept tests due to signature change
  138. {
  139. SocketParameter parameter = generateSocketParameter();
  140. #if LS_STD_UNIX_PLATFORM
  141. shared_ptr<MockPosixSocket> mockSocket = make_shared<MockPosixSocket>();
  142. parameter.posixSocket = mockSocket;
  143. EXPECT_CALL(*mockSocket, create(_, _, _)).Times(AtLeast(1));
  144. ON_CALL(*mockSocket, create(_, _, _)).WillByDefault(Return(0));
  145. EXPECT_CALL(*mockSocket, accept(_, _, _)).Times(AtLeast(1));
  146. ON_CALL(*mockSocket, accept(_, _, _)).WillByDefault(Return(0));
  147. EXPECT_CALL(*mockSocket, close(_)).Times(AtLeast(1));
  148. ON_CALL(*mockSocket, close(_)).WillByDefault(Return(0));
  149. #endif
  150. Socket socket{parameter};
  151. ASSERT_TRUE(socket.accept());
  152. }
  153. TEST_F(SocketTest, accept_wrong_protocol)
  154. {
  155. SocketParameter parameter = generateSocketParameter();
  156. parameter.socketAddress.protocolType = PROTOCOL_TYPE_UDP;
  157. #if LS_STD_UNIX_PLATFORM
  158. shared_ptr<MockPosixSocket> mockSocket = make_shared<MockPosixSocket>();
  159. parameter.posixSocket = mockSocket;
  160. EXPECT_CALL(*mockSocket, create(_, _, _)).Times(AtLeast(1));
  161. ON_CALL(*mockSocket, create(_, _, _)).WillByDefault(Return(0));
  162. EXPECT_CALL(*mockSocket, close(_)).Times(AtLeast(1));
  163. ON_CALL(*mockSocket, close(_)).WillByDefault(Return(0));
  164. #endif
  165. Socket socket{parameter};
  166. EXPECT_THROW({
  167. try
  168. {
  169. bool listened = socket.accept();
  170. }
  171. catch (const WrongProtocolException &_exception)
  172. {
  173. throw;
  174. }
  175. }, WrongProtocolException);
  176. }
  177. TEST_F(SocketTest, bind)
  178. {
  179. SocketParameter parameter = generateSocketParameter();
  180. #if LS_STD_UNIX_PLATFORM
  181. shared_ptr<MockPosixSocket> mockSocket = make_shared<MockPosixSocket>();
  182. parameter.posixSocket = mockSocket;
  183. EXPECT_CALL(*mockSocket, create(_, _, _)).Times(AtLeast(1));
  184. ON_CALL(*mockSocket, create(_, _, _)).WillByDefault(Return(0));
  185. EXPECT_CALL(*mockSocket, bind(_, _, _)).Times(AtLeast(1));
  186. ON_CALL(*mockSocket, bind(_, _, _)).WillByDefault(Return(0));
  187. EXPECT_CALL(*mockSocket, close(_)).Times(AtLeast(1));
  188. ON_CALL(*mockSocket, close(_)).WillByDefault(Return(0));
  189. #endif
  190. Socket socket{parameter};
  191. ASSERT_TRUE(socket.bind());
  192. }
  193. TEST_F(SocketTest, close)
  194. {
  195. SocketParameter parameter = generateSocketParameter();
  196. #if LS_STD_UNIX_PLATFORM
  197. shared_ptr<MockPosixSocket> mockSocket = make_shared<MockPosixSocket>();
  198. parameter.posixSocket = mockSocket;
  199. EXPECT_CALL(*mockSocket, create(_, _, _)).Times(AtLeast(1));
  200. ON_CALL(*mockSocket, create(_, _, _)).WillByDefault(Return(0));
  201. EXPECT_CALL(*mockSocket, close(_)).Times(AtLeast(1));
  202. ON_CALL(*mockSocket, close(_)).WillByDefault(Return(0));
  203. #endif
  204. Socket socket{parameter};
  205. ASSERT_TRUE(socket.close());
  206. }
  207. TEST_F(SocketTest, connect)
  208. {
  209. SocketParameter parameter = generateSocketParameter();
  210. #if LS_STD_UNIX_PLATFORM
  211. shared_ptr<MockPosixSocket> mockSocket = make_shared<MockPosixSocket>();
  212. parameter.posixSocket = mockSocket;
  213. EXPECT_CALL(*mockSocket, create(_, _, _)).Times(AtLeast(1));
  214. ON_CALL(*mockSocket, create(_, _, _)).WillByDefault(Return(0));
  215. EXPECT_CALL(*mockSocket, connect(_, _, _)).Times(AtLeast(1));
  216. ON_CALL(*mockSocket, connect(_, _, _)).WillByDefault(Return(0));
  217. EXPECT_CALL(*mockSocket, close(_)).Times(AtLeast(1));
  218. ON_CALL(*mockSocket, close(_)).WillByDefault(Return(0));
  219. #endif
  220. Socket socket{parameter};
  221. ASSERT_TRUE(socket.connect());
  222. }
  223. TEST_F(SocketTest, handle)
  224. {
  225. SocketParameter parameter = generateSocketParameter();
  226. #if LS_STD_UNIX_PLATFORM
  227. shared_ptr<MockPosixSocket> mockSocket = make_shared<MockPosixSocket>();
  228. parameter.posixSocket = mockSocket;
  229. EXPECT_CALL(*mockSocket, create(_, _, _)).Times(AtLeast(1));
  230. ON_CALL(*mockSocket, create(_, _, _)).WillByDefault(Return(0));
  231. EXPECT_CALL(*mockSocket, accept(_, _, _)).Times(AtLeast(1));
  232. ON_CALL(*mockSocket, accept(_, _, _)).WillByDefault(Return(5));
  233. EXPECT_CALL(*mockSocket, close(_)).Times(AtLeast(1));
  234. ON_CALL(*mockSocket, close(_)).WillByDefault(Return(0));
  235. #endif
  236. Socket socket{parameter};
  237. connection_id acceptedConnection = socket.accept();
  238. ASSERT_TRUE(socket.handle(acceptedConnection));
  239. }
  240. TEST_F(SocketTest, handle_no_accepted_connection)
  241. {
  242. SocketParameter parameter = generateSocketParameter();
  243. #if LS_STD_UNIX_PLATFORM
  244. shared_ptr<MockPosixSocket> mockSocket = make_shared<MockPosixSocket>();
  245. parameter.posixSocket = mockSocket;
  246. EXPECT_CALL(*mockSocket, create(_, _, _)).Times(AtLeast(1));
  247. ON_CALL(*mockSocket, create(_, _, _)).WillByDefault(Return(0));
  248. EXPECT_CALL(*mockSocket, close(_)).Times(AtLeast(1));
  249. ON_CALL(*mockSocket, close(_)).WillByDefault(Return(0));
  250. #endif
  251. Socket socket{parameter};
  252. ASSERT_FALSE(socket.handle(13));
  253. }
  254. TEST_F(SocketTest, isInitialized)
  255. {
  256. Socket socket{generateSocketParameter()};
  257. ASSERT_TRUE(socket.isInitialized());
  258. }
  259. TEST_F(SocketTest, listen)
  260. {
  261. SocketParameter parameter = generateSocketParameter();
  262. #if LS_STD_UNIX_PLATFORM
  263. shared_ptr<MockPosixSocket> mockSocket = make_shared<MockPosixSocket>();
  264. parameter.posixSocket = mockSocket;
  265. EXPECT_CALL(*mockSocket, create(_, _, _)).Times(AtLeast(1));
  266. ON_CALL(*mockSocket, create(_, _, _)).WillByDefault(Return(0));
  267. EXPECT_CALL(*mockSocket, listen(_, _)).Times(AtLeast(1));
  268. ON_CALL(*mockSocket, listen(_, _)).WillByDefault(Return(0));
  269. EXPECT_CALL(*mockSocket, close(_)).Times(AtLeast(1));
  270. ON_CALL(*mockSocket, close(_)).WillByDefault(Return(0));
  271. #endif
  272. Socket socket{parameter};
  273. ASSERT_TRUE(socket.listen());
  274. }
  275. TEST_F(SocketTest, listen_wrong_protocol)
  276. {
  277. SocketParameter parameter = generateSocketParameter();
  278. parameter.socketAddress.protocolType = PROTOCOL_TYPE_UDP;
  279. #if LS_STD_UNIX_PLATFORM
  280. shared_ptr<MockPosixSocket> mockSocket = make_shared<MockPosixSocket>();
  281. parameter.posixSocket = mockSocket;
  282. EXPECT_CALL(*mockSocket, create(_, _, _)).Times(AtLeast(1));
  283. ON_CALL(*mockSocket, create(_, _, _)).WillByDefault(Return(0));
  284. EXPECT_CALL(*mockSocket, close(_)).Times(AtLeast(1));
  285. ON_CALL(*mockSocket, close(_)).WillByDefault(Return(0));
  286. #endif
  287. Socket socket{parameter};
  288. EXPECT_THROW({
  289. try
  290. {
  291. bool listened = socket.listen();
  292. }
  293. catch (const WrongProtocolException &_exception)
  294. {
  295. throw;
  296. }
  297. }, WrongProtocolException);
  298. }
  299. }