socket_ref.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #include <catch.hpp>
  2. #include <zmq.hpp>
  3. #ifdef ZMQ_CPP11
  4. #ifdef ZMQ_CPP17
  5. static_assert(std::is_nothrow_swappable_v<zmq::socket_ref>);
  6. #endif
  7. static_assert(sizeof(zmq::socket_ref) == sizeof(void *), "size mismatch");
  8. static_assert(alignof(zmq::socket_ref) == alignof(void *), "alignment mismatch");
  9. static_assert(ZMQ_IS_TRIVIALLY_COPYABLE(zmq::socket_ref),
  10. "needs to be trivially copyable");
  11. TEST_CASE("socket_ref default init", "[socket_ref]")
  12. {
  13. zmq::socket_ref sr;
  14. CHECK(!sr);
  15. CHECK(sr == nullptr);
  16. CHECK(nullptr == sr);
  17. CHECK(sr.handle() == nullptr);
  18. }
  19. TEST_CASE("socket_ref create from nullptr", "[socket_ref]")
  20. {
  21. zmq::socket_ref sr = nullptr;
  22. CHECK(sr == nullptr);
  23. CHECK(sr.handle() == nullptr);
  24. }
  25. TEST_CASE("socket_ref create from handle", "[socket_ref]")
  26. {
  27. void *np = nullptr;
  28. zmq::socket_ref sr{zmq::from_handle, np};
  29. CHECK(sr == nullptr);
  30. CHECK(sr.handle() == nullptr);
  31. }
  32. TEST_CASE("socket_ref compare", "[socket_ref]")
  33. {
  34. zmq::socket_ref sr1;
  35. zmq::socket_ref sr2;
  36. CHECK(sr1 == sr2);
  37. CHECK(!(sr1 != sr2));
  38. }
  39. TEST_CASE("socket_ref compare from socket_t", "[socket_ref]")
  40. {
  41. zmq::context_t context;
  42. zmq::socket_t s1(context, zmq::socket_type::router);
  43. zmq::socket_t s2(context, zmq::socket_type::dealer);
  44. zmq::socket_ref sr1 = s1;
  45. zmq::socket_ref sr2 = s2;
  46. CHECK(sr1);
  47. CHECK(sr2);
  48. CHECK(sr1 == s1);
  49. CHECK(sr2 == s2);
  50. CHECK(sr1.handle() == s1.handle());
  51. CHECK(sr1 != sr2);
  52. CHECK(sr1.handle() != sr2.handle());
  53. CHECK(sr1 != nullptr);
  54. CHECK(nullptr != sr1);
  55. CHECK(sr2 != nullptr);
  56. const bool comp1 = (sr1 < sr2) != (sr1 >= sr2);
  57. CHECK(comp1);
  58. const bool comp2 = (sr1 > sr2) != (sr1 <= sr2);
  59. CHECK(comp2);
  60. std::hash<zmq::socket_ref> hash;
  61. CHECK(hash(sr1) != hash(sr2));
  62. CHECK(hash(sr1) == hash(s1));
  63. }
  64. TEST_CASE("socket_ref assignment", "[socket_ref]")
  65. {
  66. zmq::context_t context;
  67. zmq::socket_t s1(context, zmq::socket_type::router);
  68. zmq::socket_t s2(context, zmq::socket_type::dealer);
  69. zmq::socket_ref sr1 = s1;
  70. zmq::socket_ref sr2 = s2;
  71. sr1 = s2;
  72. CHECK(sr1 == sr2);
  73. CHECK(sr1.handle() == sr2.handle());
  74. sr1 = std::move(sr2);
  75. CHECK(sr1 == sr2);
  76. CHECK(sr1.handle() == sr2.handle());
  77. sr2 = nullptr;
  78. CHECK(sr1 != sr2);
  79. sr1 = nullptr;
  80. CHECK(sr1 == sr2);
  81. }
  82. TEST_CASE("socket_ref swap", "[socket_ref]")
  83. {
  84. zmq::socket_ref sr1;
  85. zmq::socket_ref sr2;
  86. using std::swap;
  87. swap(sr1, sr2);
  88. }
  89. TEST_CASE("socket_ref type punning", "[socket_ref]")
  90. {
  91. struct SVP
  92. {
  93. void *p;
  94. } svp;
  95. struct SSR
  96. {
  97. zmq::socket_ref sr;
  98. } ssr;
  99. zmq::context_t context;
  100. zmq::socket_t socket(context, zmq::socket_type::router);
  101. CHECK(socket.handle() != nullptr);
  102. svp.p = socket.handle();
  103. // static_cast to silence incorrect warning
  104. std::memcpy(static_cast<void *>(&ssr), &svp, sizeof(ssr));
  105. CHECK(ssr.sr == socket);
  106. }
  107. #endif