#include #include #ifdef ZMQ_HAS_RVALUE_REFS /// \todo split this up into separate test cases /// TEST (multipart, legacy_test) { using namespace zmq; bool ok = true; (void) ok; float num = 0; (void) num; std::string str = ""; message_t msg; // Create two PAIR sockets and connect over inproc context_t context (1); socket_t output (context, ZMQ_PAIR); socket_t input (context, ZMQ_PAIR); output.bind ("inproc://multipart.test"); input.connect ("inproc://multipart.test"); // Test send and receive of single-frame message multipart_t multipart; assert (multipart.empty ()); multipart.push (message_t ("Hello", 5)); assert (multipart.size () == 1); ok = multipart.send (output); assert (multipart.empty ()); assert (ok); ok = multipart.recv (input); assert (multipart.size () == 1); assert (ok); msg = multipart.pop (); assert (multipart.empty ()); assert (std::string (msg.data (), msg.size ()) == "Hello"); // Test send and receive of multi-frame message multipart.addstr ("A"); multipart.addstr ("BB"); multipart.addstr ("CCC"); assert (multipart.size () == 3); multipart_t copy = multipart.clone (); assert (copy.size () == 3); ok = copy.send (output); assert (copy.empty ()); assert (ok); ok = copy.recv (input); assert (copy.size () == 3); assert (ok); assert (copy.equal (&multipart)); multipart.clear (); assert (multipart.empty ()); // Test message frame manipulation multipart.add (message_t ("Frame5", 6)); multipart.addstr ("Frame6"); multipart.addstr ("Frame7"); multipart.addtyp (8.0f); multipart.addmem ("Frame9", 6); multipart.push (message_t ("Frame4", 6)); multipart.pushstr ("Frame3"); multipart.pushstr ("Frame2"); multipart.pushtyp (1.0f); multipart.pushmem ("Frame0", 6); assert (multipart.size () == 10); msg = multipart.remove (); assert (multipart.size () == 9); assert (std::string (msg.data (), msg.size ()) == "Frame9"); msg = multipart.pop (); assert (multipart.size () == 8); assert (std::string (msg.data (), msg.size ()) == "Frame0"); num = multipart.poptyp (); assert (multipart.size () == 7); assert (num == 1.0f); str = multipart.popstr (); assert (multipart.size () == 6); assert (str == "Frame2"); str = multipart.popstr (); assert (multipart.size () == 5); assert (str == "Frame3"); str = multipart.popstr (); assert (multipart.size () == 4); assert (str == "Frame4"); str = multipart.popstr (); assert (multipart.size () == 3); assert (str == "Frame5"); str = multipart.popstr (); assert (multipart.size () == 2); assert (str == "Frame6"); str = multipart.popstr (); assert (multipart.size () == 1); assert (str == "Frame7"); num = multipart.poptyp (); assert (multipart.empty ()); assert (num == 8.0f); // Test message constructors and concatenation multipart_t head ("One", 3); head.addstr ("Two"); assert (head.size () == 2); multipart_t tail (std::string ("One-hundred")); tail.pushstr ("Ninety-nine"); assert (tail.size () == 2); multipart_t tmp (message_t ("Fifty", 5)); assert (tmp.size () == 1); multipart_t mid = multipart_t::create (49.0f); mid.append (std::move (tmp)); assert (mid.size () == 2); assert (tmp.empty ()); multipart_t merged (std::move (mid)); merged.prepend (std::move (head)); merged.append (std::move (tail)); assert (merged.size () == 6); assert (head.empty ()); assert (tail.empty ()); ok = merged.send (output); assert (merged.empty ()); assert (ok); multipart_t received (input); assert (received.size () == 6); str = received.popstr (); assert (received.size () == 5); assert (str == "One"); str = received.popstr (); assert (received.size () == 4); assert (str == "Two"); num = received.poptyp (); assert (received.size () == 3); assert (num == 49.0f); str = received.popstr (); assert (received.size () == 2); assert (str == "Fifty"); str = received.popstr (); assert (received.size () == 1); assert (str == "Ninety-nine"); str = received.popstr (); assert (received.empty ()); assert (str == "One-hundred"); } #endif