General Purpose library for Freestanding C++ and POSIX systems
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

284 lines
6.5 KiB

  1. #include "shared_fd.hpp"
  2. #include "test_scaffold.h"
  3. #include <thread>
  4. #include <chrono>
  5. #include <iostream>
  6. #include <iomanip>
  7. struct create_test : public test_scaffold {
  8. create_test() {
  9. name = __FILE__ ":1";
  10. }
  11. virtual int run() {
  12. auto fd = gp::shared_fd::create("./bin/test_n", int(gp::open_modes::user_read) | int(gp::open_modes::user_write));
  13. return fd.is_valid()?0:1;
  14. }
  15. };
  16. append_test dummy_sdfhuisd3(new create_test{});
  17. struct open_test : public test_scaffold {
  18. open_test() {
  19. name = __FILE__ ":2";
  20. }
  21. virtual int run() {
  22. auto fd = gp::shared_fd::open("./bin/test_n", int(gp::open_options::append));
  23. return fd.is_valid()?0:1;
  24. }
  25. };
  26. append_test dummy_sdf564dd3(new open_test{});
  27. struct manip_test : public test_scaffold {
  28. manip_test() {
  29. name = __FILE__ ":3";
  30. }
  31. virtual int run() {
  32. auto fd = gp::shared_fd::open("./bin/test_n", int(gp::open_options::append));
  33. int error = fd.is_valid()?0:1;
  34. error += !(fd.get()>=0);
  35. auto fd_cpy = fd;
  36. error += fd_cpy.is_valid()?0:1;
  37. gp::shared_fd constr_cpy(fd_cpy);
  38. error += constr_cpy.is_valid()?0:1;
  39. gp::shared_fd constr_mv(std::move(constr_cpy));
  40. error += constr_mv.is_valid()?0:1;
  41. gp::shared_fd assign_cpy;
  42. assign_cpy.operator=(fd_cpy);
  43. error += assign_cpy.is_valid()?0:1;
  44. gp::shared_fd assign_mv;
  45. assign_mv.operator=(std::move(assign_cpy));
  46. error += assign_mv.is_valid()?0:1;
  47. error += (!assign_cpy.is_valid())?0:1;
  48. return error;
  49. }
  50. };
  51. append_test dummy_lkjs64dd3(new manip_test{});
  52. struct rw_test : public test_scaffold {
  53. rw_test() {
  54. name = __FILE__ ":4";
  55. }
  56. virtual int run() {
  57. auto fd = gp::shared_fd::open("./bin/test_n", int(gp::open_options::write));
  58. int error = fd.is_valid()?0:1;
  59. fd.write("potatoes");
  60. error += fd.has_failed();
  61. fd = gp::shared_fd::open("./bin/test_n", int(gp::open_options::read));
  62. std::array<char,8> buffer;
  63. auto str = fd.read(std::string_view(buffer.begin(), buffer.size()));
  64. error += fd.has_failed();
  65. error += (str != "potatoes");
  66. return error;
  67. }
  68. };
  69. append_test dummy_l6z5e4rdd3(new rw_test{});
  70. struct rw_err_test : public test_scaffold {
  71. rw_err_test() {
  72. name = __FILE__ ":5";
  73. }
  74. virtual int run() {
  75. auto fd = gp::shared_fd::create("./bin/test_n", int(gp::open_modes::user_read) | int(gp::open_modes::user_write));
  76. fd = gp::shared_fd::open("./bin/test_n", int(gp::open_options::read));
  77. int error = fd.is_valid()?0:1;
  78. fd.write("potatoes");
  79. error += fd.has_failed();
  80. fd = gp::shared_fd::open("./bin/test_n", int(gp::open_options::write));
  81. error += fd.is_valid()?0:1;
  82. std::array<char,8> buffer;
  83. auto str = fd.read(std::string_view(buffer.begin(), buffer.size()));
  84. error += fd.has_failed();
  85. return error == 2 ? 0 : 1;
  86. }
  87. };
  88. append_test dummy_l6987erd3(new rw_err_test{});
  89. struct make_address_test : public test_scaffold {
  90. make_address_test() {
  91. name = __FILE__ ":6";
  92. }
  93. virtual int run() {
  94. int error = 0;
  95. gp::address ipv4 = gp::make_ipv4("127.0.0.1", 0x1234);
  96. auto p = std::get<sockaddr_in>(ipv4);
  97. error += (p.sin_family != AF_INET);
  98. error += (p.sin_addr.s_addr != htonl(0x7F000001));
  99. error += (p.sin_port != htons(0x1234));
  100. try{
  101. gp::make_ipv4("not an IP", 1234);
  102. error += 1;
  103. }catch(...){}
  104. std::string filename = "/tmp/my_socket";
  105. gp::address unix = gp::make_unix(filename);
  106. auto q = std::get<sockaddr_un>(unix);
  107. error += (q.sun_family != AF_UNIX);
  108. error += strcmp(filename.c_str(), q.sun_path);
  109. try{
  110. std::string long_str(1024, 'p');
  111. gp::make_unix(long_str);
  112. error += 1;
  113. }catch(...){}
  114. return error;
  115. }
  116. };
  117. append_test dummy_l6923ml3(new make_address_test{});
  118. struct sockets_test : public test_scaffold {
  119. sockets_test() {
  120. name = __FILE__ ":7";
  121. }
  122. virtual int run() {
  123. int error = 0;
  124. auto v = gp::shared_fd::socket(gp::socket_domain::ip4, gp::socket_protocol::tcp_like);
  125. error += !(v.is_valid());
  126. v = gp::shared_fd::socket(gp::socket_domain::ip4, gp::socket_protocol::tcp_like);
  127. error += !(v.is_valid());
  128. auto pair_v = gp::shared_fd::unix_socket_pair(gp::socket_protocol::tcp_like, (gp::net_socket_opt_flags)0);
  129. error += !(pair_v.first.is_valid());
  130. error += !(pair_v.second.is_valid());
  131. pair_v = gp::shared_fd::unix_socket_pair(gp::socket_protocol::tcp_like, (gp::net_socket_opt_flags)-1);
  132. error += pair_v.first.is_valid();
  133. error += pair_v.second.is_valid();
  134. auto u_v = gp::shared_fd::unix_socket(gp::socket_protocol::tcp_like, (gp::socket_opt_flags)0);
  135. error += !(u_v.is_valid());
  136. u_v = gp::shared_fd::unix_socket(gp::socket_protocol::tcp_like, (gp::socket_opt_flags)-1);
  137. error += u_v.is_valid();
  138. return error;
  139. }
  140. };
  141. append_test dummy_r3321443(new sockets_test{});
  142. using namespace std::chrono_literals;
  143. struct sockets_co_test : public test_scaffold {
  144. sockets_co_test() {
  145. name = __FILE__ ":8";
  146. }
  147. virtual int run() {
  148. std::atomic_int error = 0;
  149. {
  150. auto v2 = gp::shared_fd::tcp_socket();
  151. error += !(v2.is_valid());
  152. std::thread sside([&](){
  153. auto v1 = gp::shared_fd::tcp_socket();
  154. v1.bind(gp::make_ipv4("0.0.0.0",1235));
  155. error += v1.has_failed();
  156. v1.listen();
  157. std::cout << "listens?:" << v1.is_valid()<<std::endl;
  158. error += !(v1.is_valid());
  159. gp::shared_fd listener = v1;
  160. gp::shared_fd v3;
  161. do
  162. {
  163. v3 = listener.accept();
  164. std::this_thread::sleep_for(500ms);
  165. std::cout << "accept_attempt:" << v3.error()<<std::endl;
  166. }while(listener.must_retry());
  167. puts("accepted");
  168. error += !(listener.has_failed());
  169. do
  170. {
  171. v3.write("potatoes");
  172. std::this_thread::sleep_for(1ms);
  173. }while(v3.must_retry());
  174. puts("sent");
  175. error += !(v3.has_failed());
  176. return;
  177. });
  178. std::this_thread::sleep_for(6ms);
  179. v2.connect(gp::make_ipv4("255.255.255.255",1235));
  180. error += v2.has_failed();
  181. do{
  182. v2.connect(gp::make_ipv4("127.0.0.1",1235));
  183. std::this_thread::sleep_for(500ms);
  184. std::cout << "connect_attempt:" << v2.is_valid() << " with " << v2.error()<<std::endl;
  185. }while(v2.error() != EISCONN);
  186. std::this_thread::sleep_for(1ms);
  187. auto status = v2.was_connection_refused();
  188. error += status;
  189. if(!status)
  190. {
  191. puts("connected");
  192. std::array<char, 32> buffer;
  193. std::string_view retstr;
  194. do
  195. {
  196. retstr = v2.read(std::string_view(buffer.begin(), buffer.size()));
  197. std::this_thread::sleep_for(1ms);
  198. }
  199. while(v2.must_retry());
  200. puts("received");
  201. std::cout<< "out:" << std::quoted(retstr) << std::endl;
  202. error += !(v2.has_failed());
  203. error += retstr != "potatoes";
  204. if(sside.joinable())
  205. sside.join();
  206. }
  207. return error;
  208. }
  209. return error;
  210. }
  211. };
  212. // append_test dummy_polmdf43(new sockets_co_test{});