@@ -56,4 +56,89 @@ TEST_CASE("recv_multipart test", "[recv_multipart]")
5656 CHECK_THROWS_AS (zmq::recv_multipart (zmq::socket_ref (), std::back_inserter (msgs)), const zmq::error_t &);
5757 }
5858}
59+
60+ TEST_CASE (" recv_multipart_n test" , " [recv_multipart]" )
61+ {
62+ zmq::context_t context (1 );
63+ zmq::socket_t output (context, ZMQ_PAIR);
64+ zmq::socket_t input (context, ZMQ_PAIR);
65+ output.bind (" inproc://multipart.test" );
66+ input.connect (" inproc://multipart.test" );
67+
68+ SECTION (" send 1 message" )
69+ {
70+ input.send (zmq::str_buffer (" hello" ));
71+
72+ std::array<zmq::message_t , 1 > msgs;
73+ auto ret = zmq::recv_multipart_n (output, msgs.data (), msgs.size ());
74+ REQUIRE (ret);
75+ CHECK (*ret == 1 );
76+ CHECK (msgs[0 ].size () == 5 );
77+ }
78+ SECTION (" send 1 message 2" )
79+ {
80+ input.send (zmq::str_buffer (" hello" ));
81+
82+ std::array<zmq::message_t , 2 > msgs;
83+ auto ret = zmq::recv_multipart_n (output, msgs.data (), msgs.size ());
84+ REQUIRE (ret);
85+ CHECK (*ret == 1 );
86+ CHECK (msgs[0 ].size () == 5 );
87+ CHECK (msgs[1 ].size () == 0 );
88+ }
89+ SECTION (" send 2 messages, recv 1" )
90+ {
91+ input.send (zmq::str_buffer (" hello" ), zmq::send_flags::sndmore);
92+ input.send (zmq::str_buffer (" world!" ));
93+
94+ std::array<zmq::message_t , 1 > msgs;
95+ CHECK_THROWS_AS (
96+ zmq::recv_multipart_n (output, msgs.data (), msgs.size ()),
97+ const std::runtime_error&);
98+ }
99+ SECTION (" recv 0" )
100+ {
101+ input.send (zmq::str_buffer (" hello" ), zmq::send_flags::sndmore);
102+ input.send (zmq::str_buffer (" world!" ));
103+
104+ std::array<zmq::message_t , 1 > msgs;
105+ CHECK_THROWS_AS (
106+ zmq::recv_multipart_n (output, msgs.data (), 0 ),
107+ const std::runtime_error&);
108+ }
109+ SECTION (" send 2 messages" )
110+ {
111+ input.send (zmq::str_buffer (" hello" ), zmq::send_flags::sndmore);
112+ input.send (zmq::str_buffer (" world!" ));
113+
114+ std::array<zmq::message_t , 2 > msgs;
115+ auto ret = zmq::recv_multipart_n (output, msgs.data (), msgs.size ());
116+ REQUIRE (ret);
117+ CHECK (*ret == 2 );
118+ CHECK (msgs[0 ].size () == 5 );
119+ CHECK (msgs[1 ].size () == 6 );
120+ }
121+ SECTION (" send no messages, dontwait" )
122+ {
123+ std::array<zmq::message_t , 1 > msgs;
124+ auto ret = zmq::recv_multipart_n (output, msgs.data (), msgs.size (), zmq::recv_flags::dontwait);
125+ CHECK_FALSE (ret);
126+ REQUIRE (msgs[0 ].size () == 0 );
127+ }
128+ SECTION (" send 1 partial message, dontwait" )
129+ {
130+ input.send (zmq::str_buffer (" hello" ), zmq::send_flags::sndmore);
131+
132+ std::array<zmq::message_t , 1 > msgs;
133+ auto ret = zmq::recv_multipart_n (output, msgs.data (), msgs.size (), zmq::recv_flags::dontwait);
134+ CHECK_FALSE (ret);
135+ REQUIRE (msgs[0 ].size () == 0 );
136+ }
137+ SECTION (" recv with invalid socket" )
138+ {
139+ std::array<zmq::message_t , 1 > msgs;
140+ CHECK_THROWS_AS (zmq::recv_multipart_n (zmq::socket_ref (), msgs.data (), msgs.size ()), const zmq::error_t &);
141+ }
142+ }
143+
59144#endif
0 commit comments