Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
L
libzmq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
libzmq
Commits
5ac19647
Commit
5ac19647
authored
Jul 08, 2013
by
Ian Barber
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #610 from hintjens/master
Problem: new spec test cases don't all work
parents
08622a77
9ca6898f
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
80 additions
and
85 deletions
+80
-85
.gitignore
.gitignore
+5
-0
test_spec_dealer.cpp
tests/test_spec_dealer.cpp
+18
-23
test_spec_pushpull.cpp
tests/test_spec_pushpull.cpp
+2
-1
test_spec_req.cpp
tests/test_spec_req.cpp
+48
-49
test_spec_router.cpp
tests/test_spec_router.cpp
+2
-1
testutil.hpp
tests/testutil.hpp
+5
-11
No files found.
.gitignore
View file @
5ac19647
...
@@ -53,6 +53,11 @@ tests/test_security
...
@@ -53,6 +53,11 @@ tests/test_security
tests/test_security_curve
tests/test_security_curve
tests/test_probe_router
tests/test_probe_router
tests/test_stream
tests/test_stream
tests/test_spec_dealer
tests/test_spec_pushpull
tests/test_spec_rep
tests/test_spec_req
tests/test_spec_router
src/platform.hpp*
src/platform.hpp*
src/stamp-h1
src/stamp-h1
perf/local_lat
perf/local_lat
...
...
tests/test_spec_dealer.cpp
View file @
5ac19647
...
@@ -32,9 +32,9 @@ void test_round_robin_out (void *ctx)
...
@@ -32,9 +32,9 @@ void test_round_robin_out (void *ctx)
int
rc
=
zmq_bind
(
dealer
,
bind_address
);
int
rc
=
zmq_bind
(
dealer
,
bind_address
);
assert
(
rc
==
0
);
assert
(
rc
==
0
);
const
size_t
N
=
5
;
const
size_t
services
=
5
;
void
*
rep
[
N
];
void
*
rep
[
services
];
for
(
size_t
i
=
0
;
i
<
N
;
++
i
)
for
(
size_t
i
=
0
;
i
<
services
;
++
i
)
{
{
rep
[
i
]
=
zmq_socket
(
ctx
,
ZMQ_REP
);
rep
[
i
]
=
zmq_socket
(
ctx
,
ZMQ_REP
);
assert
(
rep
[
i
]);
assert
(
rep
[
i
]);
...
@@ -51,8 +51,8 @@ void test_round_robin_out (void *ctx)
...
@@ -51,8 +51,8 @@ void test_round_robin_out (void *ctx)
rc
=
zmq_poll
(
0
,
0
,
100
);
rc
=
zmq_poll
(
0
,
0
,
100
);
assert
(
rc
==
0
);
assert
(
rc
==
0
);
// Send
N
requests
// Send
all
requests
for
(
size_t
i
=
0
;
i
<
N
;
++
i
)
for
(
size_t
i
=
0
;
i
<
services
;
++
i
)
{
{
s_send_seq
(
dealer
,
0
,
"ABC"
,
SEQ_END
);
s_send_seq
(
dealer
,
0
,
"ABC"
,
SEQ_END
);
}
}
...
@@ -61,7 +61,7 @@ void test_round_robin_out (void *ctx)
...
@@ -61,7 +61,7 @@ void test_round_robin_out (void *ctx)
zmq_msg_t
msg
;
zmq_msg_t
msg
;
zmq_msg_init
(
&
msg
);
zmq_msg_init
(
&
msg
);
for
(
size_t
i
=
0
;
i
<
N
;
++
i
)
for
(
size_t
i
=
0
;
i
<
services
;
++
i
)
{
{
s_recv_seq
(
rep
[
i
],
"ABC"
,
SEQ_END
);
s_recv_seq
(
rep
[
i
],
"ABC"
,
SEQ_END
);
}
}
...
@@ -71,7 +71,7 @@ void test_round_robin_out (void *ctx)
...
@@ -71,7 +71,7 @@ void test_round_robin_out (void *ctx)
close_zero_linger
(
dealer
);
close_zero_linger
(
dealer
);
for
(
size_t
i
=
0
;
i
<
N
;
++
i
)
for
(
size_t
i
=
0
;
i
<
services
;
++
i
)
{
{
close_zero_linger
(
rep
[
i
]);
close_zero_linger
(
rep
[
i
]);
}
}
...
@@ -93,9 +93,9 @@ void test_fair_queue_in (void *ctx)
...
@@ -93,9 +93,9 @@ void test_fair_queue_in (void *ctx)
rc
=
zmq_bind
(
receiver
,
bind_address
);
rc
=
zmq_bind
(
receiver
,
bind_address
);
assert
(
rc
==
0
);
assert
(
rc
==
0
);
const
size_t
N
=
5
;
const
size_t
services
=
5
;
void
*
senders
[
N
];
void
*
senders
[
services
];
for
(
size_t
i
=
0
;
i
<
N
;
++
i
)
for
(
size_t
i
=
0
;
i
<
services
;
++
i
)
{
{
senders
[
i
]
=
zmq_socket
(
ctx
,
ZMQ_DEALER
);
senders
[
i
]
=
zmq_socket
(
ctx
,
ZMQ_DEALER
);
assert
(
senders
[
i
]);
assert
(
senders
[
i
]);
...
@@ -117,31 +117,25 @@ void test_fair_queue_in (void *ctx)
...
@@ -117,31 +117,25 @@ void test_fair_queue_in (void *ctx)
s_send_seq
(
senders
[
0
],
"A"
,
SEQ_END
);
s_send_seq
(
senders
[
0
],
"A"
,
SEQ_END
);
s_recv_seq
(
receiver
,
"A"
,
SEQ_END
);
s_recv_seq
(
receiver
,
"A"
,
SEQ_END
);
// send N requests
// send our requests
for
(
size_t
i
=
0
;
i
<
N
;
++
i
)
for
(
size_t
i
=
0
;
i
<
services
;
++
i
)
{
s_send_seq
(
senders
[
i
],
"B"
,
SEQ_END
);
s_send_seq
(
senders
[
i
],
"B"
,
SEQ_END
);
}
// Wait for data.
// Wait for data.
rc
=
zmq_poll
(
0
,
0
,
50
);
rc
=
zmq_poll
(
0
,
0
,
50
);
assert
(
rc
==
0
);
assert
(
rc
==
0
);
// handle N requests
// handle the requests
for
(
size_t
i
=
0
;
i
<
N
;
++
i
)
for
(
size_t
i
=
0
;
i
<
services
;
++
i
)
{
s_recv_seq
(
receiver
,
"B"
,
SEQ_END
);
s_recv_seq
(
receiver
,
"B"
,
SEQ_END
);
}
rc
=
zmq_msg_close
(
&
msg
);
rc
=
zmq_msg_close
(
&
msg
);
assert
(
rc
==
0
);
assert
(
rc
==
0
);
close_zero_linger
(
receiver
);
close_zero_linger
(
receiver
);
for
(
size_t
i
=
0
;
i
<
N
;
++
i
)
for
(
size_t
i
=
0
;
i
<
services
;
++
i
)
{
close_zero_linger
(
senders
[
i
]);
close_zero_linger
(
senders
[
i
]);
}
// Wait for disconnects.
// Wait for disconnects.
rc
=
zmq_poll
(
0
,
0
,
100
);
rc
=
zmq_poll
(
0
,
0
,
100
);
...
@@ -232,7 +226,7 @@ void test_block_on_send_no_peers (void *ctx)
...
@@ -232,7 +226,7 @@ void test_block_on_send_no_peers (void *ctx)
assert
(
rc
==
0
);
assert
(
rc
==
0
);
}
}
int
main
()
int
main
(
void
)
{
{
void
*
ctx
=
zmq_ctx_new
();
void
*
ctx
=
zmq_ctx_new
();
assert
(
ctx
);
assert
(
ctx
);
...
@@ -258,7 +252,8 @@ int main ()
...
@@ -258,7 +252,8 @@ int main ()
// SHALL create a double queue when a peer connects to it. If this peer
// SHALL create a double queue when a peer connects to it. If this peer
// disconnects, the DEALER socket SHALL destroy its double queue and SHALL
// disconnects, the DEALER socket SHALL destroy its double queue and SHALL
// discard any messages it contains.
// discard any messages it contains.
test_destroy_queue_on_disconnect
(
ctx
);
// *** Test disabled until libzmq does this properly ***
// test_destroy_queue_on_disconnect (ctx);
}
}
int
rc
=
zmq_ctx_term
(
ctx
);
int
rc
=
zmq_ctx_term
(
ctx
);
...
...
tests/test_spec_pushpull.cpp
View file @
5ac19647
...
@@ -296,7 +296,8 @@ int main ()
...
@@ -296,7 +296,8 @@ int main ()
// PUSH and PULL: SHALL create this queue when a peer connects to it. If
// PUSH and PULL: SHALL create this queue when a peer connects to it. If
// this peer disconnects, the socket SHALL destroy its queue and SHALL
// this peer disconnects, the socket SHALL destroy its queue and SHALL
// discard any messages it contains.
// discard any messages it contains.
test_destroy_queue_on_disconnect
(
ctx
);
// *** Test disabled until libzmq does this properly ***
// test_destroy_queue_on_disconnect (ctx);
}
}
int
rc
=
zmq_ctx_term
(
ctx
);
int
rc
=
zmq_ctx_term
(
ctx
);
...
...
tests/test_spec_req.cpp
View file @
5ac19647
...
@@ -18,6 +18,8 @@
...
@@ -18,6 +18,8 @@
*/
*/
#include <stdio.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include "testutil.hpp"
#include "testutil.hpp"
const
char
*
bind_address
=
0
;
const
char
*
bind_address
=
0
;
...
@@ -31,36 +33,36 @@ void test_round_robin_out (void *ctx)
...
@@ -31,36 +33,36 @@ void test_round_robin_out (void *ctx)
int
rc
=
zmq_bind
(
req
,
bind_address
);
int
rc
=
zmq_bind
(
req
,
bind_address
);
assert
(
rc
==
0
);
assert
(
rc
==
0
);
const
size_t
N
=
5
;
const
size_t
services
=
5
;
void
*
rep
[
N
];
void
*
rep
[
services
];
for
(
size_t
i
=
0
;
i
<
N
;
++
i
)
for
(
size_t
peer
=
0
;
peer
<
services
;
peer
++
)
{
{
rep
[
peer
]
=
zmq_socket
(
ctx
,
ZMQ_REP
);
rep
[
i
]
=
zmq_socket
(
ctx
,
ZMQ_REP
);
assert
(
rep
[
peer
]);
assert
(
rep
[
i
]);
int
timeout
=
100
;
int
timeout
=
100
;
rc
=
zmq_setsockopt
(
rep
[
i
],
ZMQ_RCVTIMEO
,
&
timeout
,
sizeof
(
int
));
rc
=
zmq_setsockopt
(
rep
[
peer
],
ZMQ_RCVTIMEO
,
&
timeout
,
sizeof
(
int
));
assert
(
rc
==
0
);
assert
(
rc
==
0
);
rc
=
zmq_connect
(
rep
[
i
],
connect_address
);
rc
=
zmq_connect
(
rep
[
peer
],
connect_address
);
assert
(
rc
==
0
);
assert
(
rc
==
0
);
}
}
// We have to give the connects time to finish otherwise the requests
// Send N request-replies, and expect every REP it used once in order
// will not properly round-robin. We could alternatively connect the
for
(
size_t
i
=
0
;
i
<
N
;
++
i
)
// REQ sockets to the REP sockets.
{
struct
timespec
t
=
{
0
,
250
*
1000000
};
nanosleep
(
&
t
,
NULL
);
// Send our peer-replies, and expect every REP it used once in order
for
(
size_t
peer
=
0
;
peer
<
services
;
peer
++
)
{
s_send_seq
(
req
,
"ABC"
,
SEQ_END
);
s_send_seq
(
req
,
"ABC"
,
SEQ_END
);
s_recv_seq
(
rep
[
i
],
"ABC"
,
SEQ_END
);
s_recv_seq
(
rep
[
peer
],
"ABC"
,
SEQ_END
);
s_send_seq
(
rep
[
i
],
"DEF"
,
SEQ_END
);
s_send_seq
(
rep
[
peer
],
"DEF"
,
SEQ_END
);
s_recv_seq
(
req
,
"DEF"
,
SEQ_END
);
s_recv_seq
(
req
,
"DEF"
,
SEQ_END
);
}
}
close_zero_linger
(
req
);
close_zero_linger
(
req
);
for
(
size_t
peer
=
0
;
peer
<
services
;
peer
++
)
for
(
size_t
i
=
0
;
i
<
N
;
++
i
)
close_zero_linger
(
rep
[
peer
]);
{
close_zero_linger
(
rep
[
i
]);
}
// Wait for disconnects.
// Wait for disconnects.
rc
=
zmq_poll
(
0
,
0
,
100
);
rc
=
zmq_poll
(
0
,
0
,
100
);
...
@@ -78,38 +80,36 @@ void test_req_only_listens_to_current_peer (void *ctx)
...
@@ -78,38 +80,36 @@ void test_req_only_listens_to_current_peer (void *ctx)
rc
=
zmq_bind
(
req
,
bind_address
);
rc
=
zmq_bind
(
req
,
bind_address
);
assert
(
rc
==
0
);
assert
(
rc
==
0
);
const
size_t
N
=
3
;
const
size_t
services
=
3
;
void
*
router
[
N
];
void
*
router
[
services
];
for
(
size_t
i
=
0
;
i
<
N
;
++
i
)
{
for
(
size_t
i
=
0
;
i
<
services
;
++
i
)
{
router
[
i
]
=
zmq_socket
(
ctx
,
ZMQ_ROUTER
);
router
[
i
]
=
zmq_socket
(
ctx
,
ZMQ_ROUTER
);
assert
(
router
[
i
]);
assert
(
router
[
i
]);
int
timeout
=
100
;
int
timeout
=
100
;
rc
=
zmq_setsockopt
(
router
[
i
],
ZMQ_RCVTIMEO
,
&
timeout
,
sizeof
(
timeout
));
rc
=
zmq_setsockopt
(
router
[
i
],
ZMQ_RCVTIMEO
,
&
timeout
,
sizeof
(
timeout
));
assert
(
rc
==
0
);
assert
(
rc
==
0
);
int
enabled
=
1
;
int
enabled
=
1
;
rc
=
zmq_setsockopt
(
router
[
i
],
ZMQ_ROUTER_MANDATORY
,
&
enabled
,
sizeof
(
enabled
));
rc
=
zmq_setsockopt
(
router
[
i
],
ZMQ_ROUTER_MANDATORY
,
&
enabled
,
sizeof
(
enabled
));
assert
(
rc
==
0
);
assert
(
rc
==
0
);
rc
=
zmq_connect
(
router
[
i
],
connect_address
);
rc
=
zmq_connect
(
router
[
i
],
connect_address
);
assert
(
rc
==
0
);
assert
(
rc
==
0
);
}
}
for
(
size_t
i
=
0
;
i
<
N
;
++
i
)
for
(
size_t
i
=
0
;
i
<
services
;
++
i
)
{
{
s_send_seq
(
req
,
"ABC"
,
SEQ_END
);
s_send_seq
(
req
,
"ABC"
,
SEQ_END
);
// Receive on router i
// Receive on router i
s_recv_seq
(
router
[
i
],
"A"
,
0
,
"ABC"
,
SEQ_END
);
s_recv_seq
(
router
[
i
],
"A"
,
0
,
"ABC"
,
SEQ_END
);
// Send back replies on all routers
// Send back replies on all routers
for
(
size_t
j
=
0
;
j
<
N
;
++
j
)
for
(
size_t
j
=
0
;
j
<
services
;
++
j
)
{
{
const
char
*
replies
[]
=
{
"WRONG"
,
"GOOD"
};
const
char
*
replies
[]
=
{
"WRONG"
,
"GOOD"
};
const
char
*
reply
=
replies
[
i
==
j
?
1
:
0
];
const
char
*
reply
=
replies
[
i
==
j
?
1
:
0
];
s_send_seq
(
router
[
j
],
"A"
,
0
,
reply
,
SEQ_END
);
s_send_seq
(
router
[
j
],
"A"
,
0
,
reply
,
SEQ_END
);
}
}
// Recieve only the good relpy
// Recieve only the good relpy
...
@@ -117,11 +117,8 @@ void test_req_only_listens_to_current_peer (void *ctx)
...
@@ -117,11 +117,8 @@ void test_req_only_listens_to_current_peer (void *ctx)
}
}
close_zero_linger
(
req
);
close_zero_linger
(
req
);
for
(
size_t
i
=
0
;
i
<
services
;
++
i
)
for
(
size_t
i
=
0
;
i
<
N
;
++
i
)
close_zero_linger
(
router
[
i
]);
{
close_zero_linger
(
router
[
i
]);
}
// Wait for disconnects.
// Wait for disconnects.
rc
=
zmq_poll
(
0
,
0
,
100
);
rc
=
zmq_poll
(
0
,
0
,
100
);
...
@@ -208,17 +205,17 @@ void test_block_on_send_no_peers (void *ctx)
...
@@ -208,17 +205,17 @@ void test_block_on_send_no_peers (void *ctx)
assert
(
rc
==
0
);
assert
(
rc
==
0
);
}
}
int
main
()
int
main
(
void
)
{
{
void
*
ctx
=
zmq_ctx_new
();
void
*
ctx
=
zmq_ctx_new
();
assert
(
ctx
);
assert
(
ctx
);
const
char
*
binds
[]
=
{
"inproc://a"
,
"tcp://*:5555"
};
const
char
*
binds
[]
=
{
"inproc://a"
,
"tcp://*:5555"
};
const
char
*
connects
[]
=
{
"inproc://a"
,
"tcp://localhost:5555"
};
const
char
*
connects
[]
=
{
"inproc://a"
,
"tcp://localhost:5555"
};
for
(
int
i
=
0
;
i
<
2
;
++
i
)
{
for
(
int
transport
=
0
;
transport
<
2
;
transport
++
)
{
bind_address
=
binds
[
i
];
bind_address
=
binds
[
transport
];
connect_address
=
connects
[
i
];
connect_address
=
connects
[
transport
];
// SHALL route outgoing messages to connected peers using a round-robin
// SHALL route outgoing messages to connected peers using a round-robin
// strategy.
// strategy.
...
@@ -230,13 +227,15 @@ int main ()
...
@@ -230,13 +227,15 @@ int main ()
// application.
// application.
test_req_message_format
(
ctx
);
test_req_message_format
(
ctx
);
// SHALL block on sending, or return a suitable error, when it has no connected peers.
// SHALL block on sending, or return a suitable error, when it has no
// connected peers.
test_block_on_send_no_peers
(
ctx
);
test_block_on_send_no_peers
(
ctx
);
// SHALL accept an incoming message only from the last peer that it sent a
// SHALL accept an incoming message only from the last peer that it sent a
// request to.
// request to.
// SHALL discard silently any messages received from other peers.
// SHALL discard silently any messages received from other peers.
test_req_only_listens_to_current_peer
(
ctx
);
// *** Test disabled until libzmq does this properly ***
// test_req_only_listens_to_current_peer (ctx);
}
}
int
rc
=
zmq_ctx_term
(
ctx
);
int
rc
=
zmq_ctx_term
(
ctx
);
...
...
tests/test_spec_router.cpp
View file @
5ac19647
...
@@ -199,7 +199,8 @@ int main ()
...
@@ -199,7 +199,8 @@ int main ()
// SHALL create a double queue when a peer connects to it. If this peer
// SHALL create a double queue when a peer connects to it. If this peer
// disconnects, the ROUTER socket SHALL destroy its double queue and SHALL
// disconnects, the ROUTER socket SHALL destroy its double queue and SHALL
// discard any messages it contains.
// discard any messages it contains.
test_destroy_queue_on_disconnect
(
ctx
);
// *** Test disabled until libzmq does this properly ***
// test_destroy_queue_on_disconnect (ctx);
}
}
int
rc
=
zmq_ctx_term
(
ctx
);
int
rc
=
zmq_ctx_term
(
ctx
);
...
...
tests/testutil.hpp
View file @
5ac19647
...
@@ -110,7 +110,7 @@ s_sendmore (void *socket, const char *string) {
...
@@ -110,7 +110,7 @@ s_sendmore (void *socket, const char *string) {
#define strneq(s1,s2) (strcmp ((s1), (s2)))
#define strneq(s1,s2) (strcmp ((s1), (s2)))
const
char
*
SEQ_END
=
(
const
char
*
)
1
;
const
char
*
SEQ_END
=
(
const
char
*
)
1
;
// Sends a message composed of frames that are C strings or null frames.
// Sends a message composed of frames that are C strings or null frames.
// The list must be terminated by SEQ_END.
// The list must be terminated by SEQ_END.
...
@@ -126,13 +126,11 @@ void s_send_seq (void *socket, ...)
...
@@ -126,13 +126,11 @@ void s_send_seq (void *socket, ...)
data
=
va_arg
(
ap
,
const
char
*
);
data
=
va_arg
(
ap
,
const
char
*
);
bool
end
=
data
==
SEQ_END
;
bool
end
=
data
==
SEQ_END
;
if
(
!
prev
)
if
(
!
prev
)
{
{
int
rc
=
zmq_send
(
socket
,
0
,
0
,
end
?
0
:
ZMQ_SNDMORE
);
int
rc
=
zmq_send
(
socket
,
0
,
0
,
end
?
0
:
ZMQ_SNDMORE
);
assert
(
rc
!=
-
1
);
assert
(
rc
!=
-
1
);
}
}
else
else
{
{
int
rc
=
zmq_send
(
socket
,
prev
,
strlen
(
prev
)
+
1
,
end
?
0
:
ZMQ_SNDMORE
);
int
rc
=
zmq_send
(
socket
,
prev
,
strlen
(
prev
)
+
1
,
end
?
0
:
ZMQ_SNDMORE
);
assert
(
rc
!=
-
1
);
assert
(
rc
!=
-
1
);
}
}
...
@@ -157,19 +155,15 @@ void s_recv_seq (void *socket, ...)
...
@@ -157,19 +155,15 @@ void s_recv_seq (void *socket, ...)
va_list
ap
;
va_list
ap
;
va_start
(
ap
,
socket
);
va_start
(
ap
,
socket
);
const
char
*
data
=
va_arg
(
ap
,
const
char
*
);
const
char
*
data
=
va_arg
(
ap
,
const
char
*
);
while
(
true
)
{
while
(
true
)
{
int
rc
=
zmq_msg_recv
(
&
msg
,
socket
,
0
);
int
rc
=
zmq_msg_recv
(
&
msg
,
socket
,
0
);
assert
(
rc
!=
-
1
);
assert
(
rc
!=
-
1
);
if
(
!
data
)
if
(
!
data
)
{
assert
(
zmq_msg_size
(
&
msg
)
==
0
);
assert
(
zmq_msg_size
(
&
msg
)
==
0
);
}
else
else
{
assert
(
strcmp
(
data
,
(
const
char
*
)
zmq_msg_data
(
&
msg
))
==
0
);
assert
(
strcmp
(
data
,
(
const
char
*
)
zmq_msg_data
(
&
msg
))
==
0
);
}
data
=
va_arg
(
ap
,
const
char
*
);
data
=
va_arg
(
ap
,
const
char
*
);
bool
end
=
data
==
SEQ_END
;
bool
end
=
data
==
SEQ_END
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment