File: test_srcfd.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 (91 lines) | stat: -rw-r--r-- 2,250 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
/* SPDX-License-Identifier: MPL-2.0 */

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

#include <string.h>

SETUP_TEARDOWN_TESTCONTEXT

#define MSG_SIZE 20

#ifdef _WIN32
#include <winsock2.h>
#include <ws2tcpip.h>
#else
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#endif

void test_srcfd ()
{
    char my_endpoint[MAX_SOCKET_STRING];

    //  Create the infrastructure

    void *rep = test_context_socket (ZMQ_REP);
    void *req = test_context_socket (ZMQ_REQ);

    bind_loopback_ipv4 (rep, my_endpoint, sizeof (my_endpoint));

    TEST_ASSERT_SUCCESS_ERRNO (zmq_connect (req, my_endpoint));

    char tmp[MSG_SIZE];
    memset (tmp, 0, MSG_SIZE);
    zmq_send (req, tmp, MSG_SIZE, 0);

    zmq_msg_t msg;
    TEST_ASSERT_SUCCESS_ERRNO (zmq_msg_init (&msg));

    zmq_recvmsg (rep, &msg, 0);
    TEST_ASSERT_EQUAL_UINT (MSG_SIZE, zmq_msg_size (&msg));

    // get the messages source file descriptor
    int src_fd = zmq_msg_get (&msg, ZMQ_SRCFD);
    TEST_ASSERT_GREATER_OR_EQUAL (0, src_fd);

    TEST_ASSERT_SUCCESS_ERRNO (zmq_msg_close (&msg));

    // get the remote endpoint
    struct sockaddr_storage ss;
#ifdef ZMQ_HAVE_HPUX
    int addrlen = sizeof ss;
#else
    socklen_t addrlen = sizeof ss;
#endif
    TEST_ASSERT_SUCCESS_RAW_ERRNO (
      getpeername (src_fd, (struct sockaddr *) &ss, &addrlen));

    char host[NI_MAXHOST];
    TEST_ASSERT_SUCCESS_RAW_ERRNO (getnameinfo ((struct sockaddr *) &ss,
                                                addrlen, host, sizeof host,
                                                NULL, 0, NI_NUMERICHOST));

    // assert it is localhost which connected
    TEST_ASSERT_EQUAL_STRING ("127.0.0.1", host);

    test_context_socket_close (rep);
    test_context_socket_close (req);

    // sleep a bit for the socket to be freed
    msleep (SETTLE_TIME);

    // getting name from closed socket will fail
#ifdef ZMQ_HAVE_WINDOWS
    const int expected_errno = WSAENOTSOCK;
#else
    const int expected_errno = EBADF;
#endif
    TEST_ASSERT_FAILURE_RAW_ERRNO (
      expected_errno, getpeername (src_fd, (struct sockaddr *) &ss, &addrlen));
}

int main ()
{
    setup_test_environment ();

    UNITY_BEGIN ();
    RUN_TEST (test_srcfd);
    return UNITY_END ();
}