File: socket_ref.cpp

package info (click to toggle)
cppzmq 4.10.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 420 kB
  • sloc: cpp: 5,715; sh: 23; makefile: 4
file content (118 lines) | stat: -rw-r--r-- 2,996 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <catch2/catch.hpp>
#include <zmq.hpp>
#ifdef ZMQ_CPP11

#ifdef ZMQ_CPP17
static_assert(std::is_nothrow_swappable_v<zmq::socket_ref>);
#endif
static_assert(sizeof(zmq::socket_ref) == sizeof(void *), "size mismatch");
static_assert(alignof(zmq::socket_ref) == alignof(void *), "alignment mismatch");
static_assert(ZMQ_IS_TRIVIALLY_COPYABLE(zmq::socket_ref),
    "needs to be trivially copyable");

TEST_CASE("socket_ref default init", "[socket_ref]")
{
    zmq::socket_ref sr;
    CHECK(!sr);
    CHECK(sr == nullptr);
    CHECK(nullptr == sr);
    CHECK(sr.handle() == nullptr);
}

TEST_CASE("socket_ref create from nullptr", "[socket_ref]")
{
    zmq::socket_ref sr = nullptr;
    CHECK(sr == nullptr);
    CHECK(sr.handle() == nullptr);
}

TEST_CASE("socket_ref create from handle", "[socket_ref]")
{
    void *np = nullptr;
    zmq::socket_ref sr{zmq::from_handle, np};
    CHECK(sr == nullptr);
    CHECK(sr.handle() == nullptr);
}

TEST_CASE("socket_ref compare", "[socket_ref]")
{
    zmq::socket_ref sr1;
    zmq::socket_ref sr2;
    CHECK(sr1 == sr2);
    CHECK(!(sr1 != sr2));
}

TEST_CASE("socket_ref compare from socket_t", "[socket_ref]")
{
    zmq::context_t context;
    zmq::socket_t s1(context, zmq::socket_type::router);
    zmq::socket_t s2(context, zmq::socket_type::dealer);
    zmq::socket_ref sr1 = s1;
    zmq::socket_ref sr2 = s2;
    CHECK(sr1);
    CHECK(sr2);
    CHECK(sr1 == s1);
    CHECK(sr2 == s2);
    CHECK(sr1.handle() == s1.handle());
    CHECK(sr1 != sr2);
    CHECK(sr1.handle() != sr2.handle());
    CHECK(sr1 != nullptr);
    CHECK(nullptr != sr1);
    CHECK(sr2 != nullptr);
    const bool comp1 = (sr1 < sr2) != (sr1 >= sr2);
    CHECK(comp1);
    const bool comp2 = (sr1 > sr2) != (sr1 <= sr2);
    CHECK(comp2);
    std::hash<zmq::socket_ref> hash;
    CHECK(hash(sr1) != hash(sr2));
    CHECK(hash(sr1) == hash(s1));
}

TEST_CASE("socket_ref assignment", "[socket_ref]")
{
    zmq::context_t context;
    zmq::socket_t s1(context, zmq::socket_type::router);
    zmq::socket_t s2(context, zmq::socket_type::dealer);
    zmq::socket_ref sr1 = s1;
    zmq::socket_ref sr2 = s2;
    sr1 = s2;
    CHECK(sr1 == sr2);
    CHECK(sr1.handle() == sr2.handle());
    sr1 = std::move(sr2);
    CHECK(sr1 == sr2);
    CHECK(sr1.handle() == sr2.handle());
    sr2 = nullptr;
    CHECK(sr1 != sr2);
    sr1 = nullptr;
    CHECK(sr1 == sr2);
}

TEST_CASE("socket_ref swap", "[socket_ref]")
{
    zmq::socket_ref sr1;
    zmq::socket_ref sr2;
    using std::swap;
    swap(sr1, sr2);
}

TEST_CASE("socket_ref type punning", "[socket_ref]")
{
    struct SVP
    {
        void *p;
    } svp;
    struct SSR
    {
        zmq::socket_ref sr;
    } ssr;

    zmq::context_t context;
    zmq::socket_t socket(context, zmq::socket_type::router);
    CHECK(socket.handle() != nullptr);
    svp.p = socket.handle();
    // static_cast to silence incorrect warning
    std::memcpy(static_cast<void *>(&ssr), &svp, sizeof(ssr));
    CHECK(ssr.sr == socket);
}

#endif