File: test_stream_timeout.cpp

package info (click to toggle)
zeromq3 4.3.5-1
  • links: PTS
  • area: main
  • in suites: forky, sid, trixie
  • size: 6,548 kB
  • sloc: cpp: 56,475; ansic: 4,968; makefile: 1,607; sh: 1,400; xml: 196; python: 40
file content (140 lines) | stat: -rw-r--r-- 5,166 bytes parent folder | download
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/* SPDX-License-Identifier: MPL-2.0 */

#include "testutil.hpp"
#include "testutil_monitoring.hpp"
#include "testutil_unity.hpp"

#include <stdlib.h>
#include <string.h>

SETUP_TEARDOWN_TESTCONTEXT

static void test_stream_handshake_timeout_accept ()
{
    char my_endpoint[MAX_SOCKET_STRING];

    //  We use this socket in raw mode, to make a connection and send nothing
    void *stream = test_context_socket (ZMQ_STREAM);

    int zero = 0;
    TEST_ASSERT_SUCCESS_ERRNO (
      zmq_setsockopt (stream, ZMQ_LINGER, &zero, sizeof (zero)));

    //  We'll be using this socket to test TCP stream handshake timeout
    void *dealer = test_context_socket (ZMQ_DEALER);
    TEST_ASSERT_SUCCESS_ERRNO (
      zmq_setsockopt (dealer, ZMQ_LINGER, &zero, sizeof (zero)));
    int val, tenth = 100;
    size_t vsize = sizeof (val);

    // check for the expected default handshake timeout value - 30 sec
    TEST_ASSERT_SUCCESS_ERRNO (
      zmq_getsockopt (dealer, ZMQ_HANDSHAKE_IVL, &val, &vsize));
    TEST_ASSERT_EQUAL (sizeof (val), vsize);
    TEST_ASSERT_EQUAL_INT (30000, val);
    // make handshake timeout faster - 1/10 sec
    TEST_ASSERT_SUCCESS_ERRNO (
      zmq_setsockopt (dealer, ZMQ_HANDSHAKE_IVL, &tenth, sizeof (tenth)));
    vsize = sizeof (val);
    // make sure zmq_setsockopt changed the value
    TEST_ASSERT_SUCCESS_ERRNO (
      zmq_getsockopt (dealer, ZMQ_HANDSHAKE_IVL, &val, &vsize));
    TEST_ASSERT_EQUAL (sizeof (val), vsize);
    TEST_ASSERT_EQUAL_INT (tenth, val);

    //  Create and connect a socket for collecting monitor events on dealer
    void *dealer_mon = test_context_socket (ZMQ_PAIR);

    TEST_ASSERT_SUCCESS_ERRNO (zmq_socket_monitor (
      dealer, "inproc://monitor-dealer",
      ZMQ_EVENT_CONNECTED | ZMQ_EVENT_DISCONNECTED | ZMQ_EVENT_ACCEPTED));

    //  Connect to the inproc endpoint so we'll get events
    TEST_ASSERT_SUCCESS_ERRNO (
      zmq_connect (dealer_mon, "inproc://monitor-dealer"));

    // bind dealer socket to accept connection from non-sending stream socket
    bind_loopback_ipv4 (dealer, my_endpoint, sizeof my_endpoint);

    TEST_ASSERT_SUCCESS_ERRNO (zmq_connect (stream, my_endpoint));

    // we should get ZMQ_EVENT_ACCEPTED and then ZMQ_EVENT_DISCONNECTED
    int event = get_monitor_event (dealer_mon, NULL, NULL);
    TEST_ASSERT_EQUAL_INT (ZMQ_EVENT_ACCEPTED, event);
    event = get_monitor_event (dealer_mon, NULL, NULL);
    TEST_ASSERT_EQUAL_INT (ZMQ_EVENT_DISCONNECTED, event);

    test_context_socket_close (dealer);
    test_context_socket_close (dealer_mon);
    test_context_socket_close (stream);
}

static void test_stream_handshake_timeout_connect ()
{
    char my_endpoint[MAX_SOCKET_STRING];

    //  We use this socket in raw mode, to accept a connection and send nothing
    void *stream = test_context_socket (ZMQ_STREAM);

    int zero = 0;
    TEST_ASSERT_SUCCESS_ERRNO (
      zmq_setsockopt (stream, ZMQ_LINGER, &zero, sizeof (zero)));

    bind_loopback_ipv4 (stream, my_endpoint, sizeof my_endpoint);

    //  We'll be using this socket to test TCP stream handshake timeout
    void *dealer = test_context_socket (ZMQ_DEALER);
    TEST_ASSERT_SUCCESS_ERRNO (
      zmq_setsockopt (dealer, ZMQ_LINGER, &zero, sizeof (zero)));
    int val, tenth = 100;
    size_t vsize = sizeof (val);

    // check for the expected default handshake timeout value - 30 sec
    TEST_ASSERT_SUCCESS_ERRNO (
      zmq_getsockopt (dealer, ZMQ_HANDSHAKE_IVL, &val, &vsize));
    TEST_ASSERT_EQUAL (sizeof (val), vsize);
    TEST_ASSERT_EQUAL_INT (30000, val);
    // make handshake timeout faster - 1/10 sec
    TEST_ASSERT_SUCCESS_ERRNO (
      zmq_setsockopt (dealer, ZMQ_HANDSHAKE_IVL, &tenth, sizeof (tenth)));
    vsize = sizeof (val);
    // make sure zmq_setsockopt changed the value
    TEST_ASSERT_SUCCESS_ERRNO (
      zmq_getsockopt (dealer, ZMQ_HANDSHAKE_IVL, &val, &vsize));
    TEST_ASSERT_EQUAL (sizeof (val), vsize);
    TEST_ASSERT_EQUAL_INT (tenth, val);

    //  Create and connect a socket for collecting monitor events on dealer
    void *dealer_mon = test_context_socket (ZMQ_PAIR);

    TEST_ASSERT_SUCCESS_ERRNO (zmq_socket_monitor (
      dealer, "inproc://monitor-dealer",
      ZMQ_EVENT_CONNECTED | ZMQ_EVENT_DISCONNECTED | ZMQ_EVENT_ACCEPTED));

    //  Connect to the inproc endpoint so we'll get events
    TEST_ASSERT_SUCCESS_ERRNO (
      zmq_connect (dealer_mon, "inproc://monitor-dealer"));

    // connect dealer socket to non-sending stream socket
    TEST_ASSERT_SUCCESS_ERRNO (zmq_connect (dealer, my_endpoint));

    // we should get ZMQ_EVENT_CONNECTED and then ZMQ_EVENT_DISCONNECTED
    int event = get_monitor_event (dealer_mon, NULL, NULL);
    TEST_ASSERT_EQUAL_INT (ZMQ_EVENT_CONNECTED, event);
    event = get_monitor_event (dealer_mon, NULL, NULL);
    TEST_ASSERT_EQUAL_INT (ZMQ_EVENT_DISCONNECTED, event);

    test_context_socket_close (dealer);
    test_context_socket_close (dealer_mon);
    test_context_socket_close (stream);
}

int main ()
{
    setup_test_environment ();

    UNITY_BEGIN ();
    RUN_TEST (test_stream_handshake_timeout_accept);
    RUN_TEST (test_stream_handshake_timeout_connect);
    return UNITY_END ();
}