Wisp 1.2.1 C++ Unit Test Coverage
Current view: top level - tests/wisp/protocol - CallerTest.cc (source / functions) Hit Total Coverage
Test: Wisp 1.2.1 C++ Unit Tests Lines: 204 204 100.0 %
Date: 2011-05-11 Functions: 32 33 97.0 %
Branches: 794 1760 45.1 %

           Branch data     Line data    Source code
       1                 :            : /* Copyright 2006-2011 Savarese Software Research Corporation
       2                 :            :  *
       3                 :            :  * Licensed under the Apache License, Version 2.0 (the "License");
       4                 :            :  * you may not use this file except in compliance with the License.
       5                 :            :  * You may obtain a copy of the License at
       6                 :            :  *
       7                 :            :  *     http://www.savarese.com/software/ApacheLicense-2.0
       8                 :            :  *
       9                 :            :  * Unless required by applicable law or agreed to in writing, software
      10                 :            :  * distributed under the License is distributed on an "AS IS" BASIS,
      11                 :            :  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      12                 :            :  * See the License for the specific language governing permissions and
      13                 :            :  * limitations under the License.
      14                 :            :  */
      15                 :            : 
      16                 :            : #include <ssrc/wisp/utility/TimeValue.h>
      17                 :            : #include <ssrc/wisp/protocol/Caller.h>
      18                 :            : 
      19                 :            : #define BOOST_TEST_MODULE CallerTest
      20                 :            : #include <boost/test/unit_test.hpp>
      21                 :            : 
      22                 :            : using namespace NS_SSRC_WISP;
      23                 :            : using namespace NS_SSRC_WISP_PROTOCOL;
      24                 :            : using NS_SSRC_WISP_UTILITY::TimeValue;
      25                 :            : using ssrc::spread::Message;
      26                 :            : 
      27                 :            : #define MBOX WISP_SPREAD_DAEMON
      28                 :            : 
      29                 :            : enum ProtocolNumber { ProtoTest = 1776 };
      30                 :            : 
      31                 :         38 : WISP_DEFINE_PROTOCOL(ProtoTest);
      32                 :            : 
      33                 :            : struct InitTest {
      34                 :          1 :   InitTest() {
      35                 :          1 :     std::srand(TimeValue::now_seconds());
      36                 :          1 :   }
      37                 :            : };
      38                 :            : 
      39                 :          1 : BOOST_GLOBAL_FIXTURE(InitTest)
      40                 :            : 
      41                 :            : struct TestProtocol : public ServiceProtocol<ProtoTest> {
      42                 :            :   enum MessageType {
      43                 :            :     Stop, EchoRequest, EchoReply, SendString, RequestBigPacket, ReturnBigPacket
      44                 :            :   };
      45                 :            : 
      46                 :            :   typedef MessageProtoTest<Stop> MessageStop;
      47                 :            :   typedef MessageProtoTest<EchoRequest> MessageEchoRequest;
      48                 :            :   typedef MessageProtoTest<EchoReply> MessageEchoReply;
      49                 :            : 
      50                 :         10 :   WISP_PROTOCOL_MESSAGE(SendString, MessageProtoTest, ((string, str)));
      51                 :            : 
      52                 :            :   typedef MessageProtoTest<RequestBigPacket> MessageRequestBigPacket;
      53                 :            : 
      54                 :            :   WISP_PROTOCOL_MESSAGE_WITH_INIT(ReturnBigPacket, MessageProtoTest,
      55                 :            :                                   ((ByteBuffer, payload)),
      56                 :         15 :                                   (ByteBuffer(0)));
      57                 :            : 
      58                 :            :   WISP_ONE_WAY_CALL(caller_type, Stop);
      59                 :            :   WISP_ONE_WAY_CALL(caller_type, EchoReply);
      60                 :            :   WISP_TWO_WAY_CALL(caller_type, EchoRequest, EchoReply);
      61                 :            :   WISP_ONE_WAY_CALL(caller_type, SendString);
      62                 :            :   WISP_ONE_WAY_CALL(caller_type, ReturnBigPacket);
      63                 :            :   WISP_TWO_WAY_CALL(caller_type, RequestBigPacket, ReturnBigPacket);
      64                 :            : };
      65                 :            : 
      66                 :            : const unsigned int JumboCapacity    = 1048832;
      67                 :            : const unsigned int JumboPayloadSize = 1048576;
      68                 :            : 
      69                 :            : WISP_IMPORT(TestProtocol, MessageStop);
      70                 :            : WISP_IMPORT(TestProtocol, MessageEchoRequest);
      71                 :            : WISP_IMPORT(TestProtocol, MessageEchoReply);
      72                 :            : WISP_IMPORT(TestProtocol, MessageSendString);
      73                 :            : WISP_IMPORT(TestProtocol, CallStop);
      74                 :            : WISP_IMPORT(TestProtocol, CallEchoRequest);
      75                 :            : WISP_IMPORT(TestProtocol, CallEchoReply);
      76                 :            : WISP_IMPORT(TestProtocol, CallSendString);
      77                 :            : 
      78                 :            : WISP_IMPORT(TestProtocol, MessageReturnBigPacket);
      79                 :            : WISP_IMPORT(TestProtocol, CallRequestBigPacket);
      80                 :            : WISP_IMPORT(TestProtocol, CallReturnBigPacket);
      81                 :            : 
      82 [ +  - ][ +  - ]:          2 : BOOST_AUTO_TEST_CASE(test_receive) {
      83 [ +  - ][ +  - ]:          2 :   Caller<> call(MBOX, "", Message::DefaultCapacity, true);
         [ +  - ][ +  - ]
                 [ +  - ]
      84                 :            : 
      85                 :            :   CallEchoRequest::future_ptr future_echo =
      86 [ +  - ][ +  - ]:          2 :     call(CallEchoRequest(), call.name(), Message::Safe);
      87                 :            : 
      88 [ +  - ][ +  - ]:          2 :   message_info_ptr info;
      89         [ +  - ]:          1 :   call.receive(info);
      90                 :            : 
      91 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->id() == MessageEchoRequest::id);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
      92 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->role() == TwoWayRequest);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
      93 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->token() == future_echo->token());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
      94                 :            : 
      95         [ +  - ]:          1 :   call(CallEchoReply(), call.name(), future_echo->token(), Message::Safe);
      96                 :            : 
      97         [ +  - ]:          1 :   call.receive(info);
      98                 :            : 
      99 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->id() == MessageEchoReply::id);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     100 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->role() == TwoWayResponse);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     101 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->token() == future_echo->token());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     102                 :            : 
     103                 :            :   MessageEchoReply msg_reply;
     104 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE_NO_THROW(future_echo->unpack(msg_reply, *info));
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ -  + ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     105 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(!future_echo->valid());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     106                 :          1 : }
     107                 :            : 
     108 [ +  - ][ +  - ]:          2 : BOOST_AUTO_TEST_CASE(test_future) {
     109 [ +  - ][ +  - ]:          2 :   Caller<> call(MBOX, "", Message::DefaultCapacity, true);
         [ +  - ][ +  - ]
                 [ +  - ]
     110                 :            : 
     111                 :            :   CallEchoRequest::future_ptr future_echo1 =
     112 [ +  - ][ +  - ]:          2 :     call(CallEchoRequest(), call.name(), Message::Safe);
     113         [ +  - ]:          1 :   call(CallEchoReply(), call.name(), future_echo1->token(), Message::Safe);
     114                 :            : 
     115 [ +  - ][ +  - ]:          1 :   call(CallStop(), call.name(), Message::Safe);
     116                 :            : 
     117                 :            :   CallEchoRequest::future_ptr future_echo3 =
     118 [ +  - ][ +  - ]:          2 :     call(CallEchoRequest(), call.name(), Message::Safe);
     119                 :            : 
     120 [ +  - ][ +  - ]:          1 :   call(CallStop(), call.name(), Message::Safe);
     121                 :            : 
     122         [ +  - ]:          1 :   call.send<CallSendString>(Message::Safe, call.name(), "bar");
     123         [ +  - ]:          1 :   call.send<CallSendString>(Message::Safe, call.name(), "foo");
     124                 :            : 
     125 [ +  - ][ +  - ]:          1 :   call.join("foo");
                 [ +  - ]
     126                 :            : 
     127         [ +  - ]:          1 :   call(CallEchoReply(), call.name(), future_echo3->token(), Message::Safe);
     128                 :            : 
     129 [ +  - ][ +  - ]:          2 :   message_info_ptr info;
     130         [ +  - ]:          1 :   call.receive_request(info);
     131 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->id() == MessageEchoRequest::id);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     132         [ +  - ]:          1 :   call.receive_request(info);
     133 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->id() == MessageStop::id);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     134                 :            : 
     135 [ +  - ][ +  - ]:          1 :   call(CallStop(), call.name(), Message::Safe);
     136                 :            : 
     137                 :            :   CallEchoRequest::future_ptr future_echo2 =
     138 [ +  - ][ +  - ]:          2 :     call(CallEchoRequest(), call.name(), Message::Safe);
     139                 :            : 
     140 [ +  - ][ +  - ]:          1 :   call.leave("foo");
                 [ +  - ]
     141                 :            : 
     142         [ +  - ]:          1 :   call(CallEchoReply(), call.name(), future_echo2->token(), Message::Safe);
     143                 :            : 
     144 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(!future_echo2->ready());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
                 [ -  + ]
     145 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(future_echo2->valid());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     146                 :            : 
     147                 :            :   MessageEchoReply msg_reply;
     148 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE_NO_THROW(future_echo1->receive(msg_reply));
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ -  + ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     149 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(!future_echo1->valid());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     150                 :            : 
     151 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE_NO_THROW(future_echo2->receive(msg_reply));
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ -  + ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     152 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(!future_echo2->valid());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     153                 :            : 
     154         [ +  - ]:          1 :   call.receive_request(info);
     155 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->id() == MessageEchoRequest::id);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     156                 :            : 
     157         [ +  - ]:          1 :   call.receive_request(info);
     158 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->id() == MessageStop::id);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     159                 :            : 
     160 [ +  - ][ +  - ]:          2 :   MessageSendString msg_send_str;
     161         [ +  - ]:          1 :   call.receive_request(info);
     162 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->id() == MessageSendString::id);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     163         [ +  - ]:          1 :   call.unpack(msg_send_str, *info);
     164 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE("bar" == msg_send_str.str);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
                 [ -  + ]
     165                 :            : 
     166 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(future_echo3->ready());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
                 [ -  + ]
     167 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(future_echo3->valid());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     168 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE_NO_THROW(future_echo3->receive(msg_reply));
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ -  + ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     169 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(!future_echo3->valid());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     170                 :            : 
     171         [ +  - ]:          1 :   call.receive_request(info);
     172 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->id() == MessageSendString::id);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     173         [ +  - ]:          1 :   call.unpack(msg_send_str, *info);
     174 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE("foo" == msg_send_str.str);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
                 [ -  + ]
     175                 :            : 
     176         [ +  - ]:          1 :   call.receive_request(info);
     177 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->message.is_membership());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     178                 :            : 
     179         [ +  - ]:          1 :   call.receive_request(info);
     180 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->id() == MessageStop::id);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     181                 :            : 
     182         [ +  - ]:          1 :   call.receive_request(info);
     183 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->id() == MessageEchoRequest::id);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     184                 :            : 
     185         [ +  - ]:          1 :   call.receive_request(info);
     186 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->message.is_membership());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     187                 :          1 : }
     188                 :            : 
     189 [ +  - ][ +  - ]:          2 : BOOST_AUTO_TEST_CASE(test_receive_jumbo_response) {
     190 [ +  - ][ +  - ]:          2 :   Caller<> call(MBOX, "", JumboCapacity, true);
         [ +  - ][ +  - ]
                 [ +  - ]
     191                 :            : 
     192                 :            :   CallRequestBigPacket::future_ptr future_packet =
     193 [ +  - ][ +  - ]:          2 :     call(CallRequestBigPacket(), call.name(), Message::Safe);
     194                 :            : 
     195                 :            :   CallEchoRequest::future_ptr future_echo =
     196 [ +  - ][ +  - ]:          2 :     call(CallEchoRequest(), call.name(), Message::Safe);
     197                 :            : 
     198 [ +  - ][ +  - ]:          2 :   message_info_ptr info;
     199         [ +  - ]:          1 :   call.receive(info);
     200                 :            : 
     201 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->id() == CallRequestBigPacket::parameter_type::id);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     202 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->role() == TwoWayRequest);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     203 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->token() == future_packet->token());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     204                 :            : 
     205 [ +  - ][ +  - ]:          2 :   MessageReturnBigPacket packet_msg;
         [ +  - ][ +  - ]
     206                 :            : 
     207         [ +  - ]:          1 :   packet_msg.payload.resize(JumboPayloadSize);
     208         [ +  + ]:     262145 :   while(packet_msg.payload.offset() < JumboPayloadSize) {
     209                 :     262144 :     int bytes = std::rand();
     210         [ +  - ]:     262144 :     packet_msg.payload.write(&bytes, sizeof(bytes));
     211                 :            :   }
     212                 :            : 
     213                 :          1 :   call.reply<CallReturnBigPacket>(info->sender(), info->token(), packet_msg,
     214         [ +  - ]:          2 :                                   Message::Safe);
     215         [ +  - ]:          1 :   call.receive(info);
     216                 :            : 
     217 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->id() == MessageEchoRequest::id);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     218 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->role() == TwoWayRequest);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     219 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->token() == future_echo->token());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     220                 :            : 
     221         [ +  - ]:          1 :   call(CallEchoReply(), call.name(), info->token(), Message::Safe);
     222         [ +  - ]:          1 :   info.reset();
     223                 :            : 
     224                 :            :   MessageEchoReply echo_reply;
     225 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE_NO_THROW(future_echo->receive(echo_reply));
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ -  + ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     226 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(!future_echo->valid());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     227                 :            : 
     228 [ +  - ][ +  - ]:          2 :   MessageReturnBigPacket packet_reply;
         [ +  - ][ +  - ]
     229                 :            : 
     230 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE_NO_THROW(future_packet->receive(packet_reply));
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ -  + ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     231 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(!future_packet->valid());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     232                 :            : 
     233 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE_EQUAL(packet_reply.payload.size(), packet_msg.payload.size());
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     234         [ +  - ]:          3 :   BOOST_REQUIRE_EQUAL(std::memcmp(&packet_msg.payload[0],
           [ +  -  +  - ]
                 [ -  + ]
     235                 :            :                                   &packet_reply.payload[0],
     236 [ +  - ][ +  - ]:          2 :                                   packet_msg.payload.size()), 0);
     237                 :          1 : }
     238                 :            : 
     239 [ +  - ][ +  - ]:          2 : BOOST_AUTO_TEST_CASE(test_receive_jumbo_request) {
     240 [ +  - ][ +  - ]:          2 :   Caller<> call(MBOX, "", JumboCapacity, true);
         [ +  - ][ +  - ]
                 [ +  - ]
     241                 :            : 
     242                 :            :   CallEchoRequest::future_ptr future_echo =
     243 [ +  - ][ +  - ]:          2 :     call(CallEchoRequest(), call.name(), Message::Safe);
     244                 :            : 
     245 [ +  - ][ +  - ]:          2 :   MessageReturnBigPacket packet_msg;
         [ +  - ][ +  - ]
     246                 :            : 
     247         [ +  - ]:          1 :   packet_msg.payload.resize(JumboPayloadSize);
     248         [ +  + ]:     262145 :   while(packet_msg.payload.offset() < JumboPayloadSize) {
     249                 :     262144 :     int bytes = std::rand();
     250         [ +  - ]:     262144 :     packet_msg.payload.write(&bytes, sizeof(bytes));
     251                 :            :   }
     252                 :            : 
     253         [ +  - ]:          1 :   call.send<CallReturnBigPacket>(call.name(), packet_msg, Message::Safe);
     254                 :            : 
     255 [ +  - ][ +  - ]:          2 :   message_info_ptr info;
     256         [ +  - ]:          1 :   call.receive_request(info);
     257                 :            : 
     258 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->id() == MessageEchoRequest::id);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     259 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->role() == TwoWayRequest);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     260 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->token() == future_echo->token());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     261                 :            : 
     262         [ +  - ]:          1 :   call(CallEchoReply(), call.name(), info->token(), Message::Safe);
     263         [ +  - ]:          1 :   info.reset();
     264                 :            : 
     265                 :            :   MessageEchoReply echo_reply;
     266 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE_NO_THROW(future_echo->receive(echo_reply));
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ -  + ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     267 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(!future_echo->valid());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     268                 :            : 
     269         [ +  - ]:          1 :   call.receive_request(info);
     270                 :            : 
     271 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->header.message_size > packet_msg.payload.size());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     272                 :            : 
     273                 :            :   const unsigned int header_size = 
     274                 :          1 :     info->header.message_size - packet_msg.payload.size();
     275                 :            : 
     276         [ +  - ]:          3 :   BOOST_REQUIRE_EQUAL(std::memcmp(&packet_msg.payload[0],
           [ +  -  +  - ]
                 [ -  + ]
     277                 :            :                                   &info->message[header_size],
     278 [ +  - ][ +  - ]:          2 :                                   packet_msg.payload.size()), 0);
     279                 :          1 : }
     280                 :            : 
     281 [ +  - ][ +  - ]:          2 : BOOST_AUTO_TEST_CASE(test_receive_jumbo) {
     282 [ +  - ][ +  - ]:          2 :   Caller<> call(MBOX, "", JumboCapacity, true);
         [ +  - ][ +  - ]
                 [ +  - ]
     283                 :            : 
     284                 :            :   CallEchoRequest::future_ptr future_echo =
     285 [ +  - ][ +  - ]:          2 :     call(CallEchoRequest(), call.name(), Message::Safe);
     286                 :            : 
     287 [ +  - ][ +  - ]:          2 :   MessageReturnBigPacket packet_msg;
         [ +  - ][ +  - ]
     288                 :            : 
     289         [ +  - ]:          1 :   packet_msg.payload.resize(JumboPayloadSize);
     290         [ +  + ]:     262145 :   while(packet_msg.payload.offset() < JumboPayloadSize) {
     291                 :     262144 :     int bytes = std::rand();
     292         [ +  - ]:     262144 :     packet_msg.payload.write(&bytes, sizeof(bytes));
     293                 :            :   }
     294                 :            : 
     295         [ +  - ]:          1 :   call.send<CallReturnBigPacket>(call.name(), packet_msg, Message::Safe);
     296                 :            : 
     297 [ +  - ][ +  - ]:          2 :   message_info_ptr info;
     298         [ +  - ]:          1 :   call.receive(info);
     299                 :            : 
     300 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->id() == MessageEchoRequest::id);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     301 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->role() == TwoWayRequest);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     302 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->token() == future_echo->token());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     303                 :            : 
     304         [ +  - ]:          1 :   call(CallEchoReply(), call.name(), info->token(), Message::Safe);
     305                 :            : 
     306                 :            :   MessageEchoReply echo_reply;
     307 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE_NO_THROW(future_echo->receive(echo_reply));
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ -  + ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     308 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(!future_echo->valid());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     309                 :            : 
     310         [ +  - ]:          1 :   call.receive(info);
     311                 :            : 
     312 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->header.message_size > packet_msg.payload.size());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     313                 :            : 
     314                 :            :   const unsigned int header_size = 
     315                 :          1 :     info->header.message_size - packet_msg.payload.size();
     316                 :            : 
     317 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->groups[0] == call.name());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
                 [ -  + ]
     318         [ +  - ]:          3 :   BOOST_REQUIRE_EQUAL(std::memcmp(&packet_msg.payload[0],
           [ +  -  +  - ]
                 [ -  + ]
     319                 :            :                                   &info->message[header_size],
     320 [ +  - ][ +  - ]:          2 :                                   packet_msg.payload.size()), 0);
     321                 :            : 
     322 [ +  - ][ +  - ]:          2 :   MessageReturnBigPacket packet_recv;
         [ +  - ][ +  - ]
     323                 :            : 
     324 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE_NO_THROW(call.unpacker().unpack(packet_recv,info->message));
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ -  + ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     325 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE_EQUAL(packet_recv.payload.size(), packet_msg.payload.size());
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     326         [ +  - ]:          3 :   BOOST_REQUIRE_EQUAL(std::memcmp(&packet_msg.payload[0],
           [ +  -  +  - ]
                 [ -  + ]
     327                 :            :                                   &packet_recv.payload[0],
     328 [ +  - ][ +  - ]:          2 :                                   packet_msg.payload.size()), 0);
     329                 :          1 : }
     330                 :            : 
     331 [ +  - ][ +  - ]:          2 : BOOST_AUTO_TEST_CASE(test_erase_jumbo_messages) {
     332                 :          1 :   const unsigned int message_size = Caller<>::MaxUnfragmentedMessageSize;
     333 [ +  - ][ +  - ]:          2 :   Caller<> call(MBOX, "", message_size, true);
         [ +  - ][ +  - ]
                 [ +  - ]
     334                 :            : 
     335                 :            :   CallRequestBigPacket::future_ptr future_packet =
     336 [ +  - ][ +  - ]:          2 :     call(CallRequestBigPacket(), call.name(), Message::Safe);
     337                 :            : 
     338                 :            :   CallEchoRequest::future_ptr future_echo =
     339 [ +  - ][ +  - ]:          2 :     call(CallEchoRequest(), call.name(), Message::Safe);
     340                 :            : 
     341 [ +  - ][ +  - ]:          2 :   message_info_ptr info;
     342         [ +  - ]:          1 :   call.receive(info);
     343                 :            : 
     344 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->id() == CallRequestBigPacket::parameter_type::id);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     345 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->role() == TwoWayRequest);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     346 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->token() == future_packet->token());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     347                 :            : 
     348                 :          1 :   CallHeader header(MessageReturnBigPacket::id,info->token(),TwoWayResponse);
     349 [ +  - ][ +  - ]:          2 :   Message message(message_size + 1024);
     350                 :            : 
     351         [ +  - ]:          1 :   call.packer().pack(header, message);
     352                 :            : 
     353         [ +  + ]:      33021 :   while(message.offset() < message_size + 1024) {
     354                 :      33020 :     int bytes = std::rand();
     355         [ +  - ]:      33020 :     message.write(&bytes, sizeof(bytes));
     356                 :            :   }
     357                 :            : 
     358         [ +  - ]:          1 :   header.message_size = message.size();
     359         [ +  - ]:          1 :   message.rewind();
     360                 :            : 
     361         [ +  - ]:          1 :   call.packer().pack(header, message);
     362                 :            : 
     363         [ +  - ]:          1 :   message.resize(message_size);
     364                 :            :   // Cheat so we can send
     365                 :          1 :   ssrc::spread::Mailbox *mbox = &const_cast<Mailbox &>(call.mbox());
     366         [ +  - ]:          1 :   mbox->send(message, call.name());
     367                 :            : 
     368         [ +  - ]:          1 :   call.receive(info);
     369                 :            : 
     370 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->id() == MessageEchoRequest::id);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     371 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->role() == TwoWayRequest);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     372 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->token() == future_echo->token());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     373                 :            : 
     374         [ +  - ]:          1 :   call(CallEchoReply(), call.name(), info->token(), Message::Safe);
     375         [ +  - ]:          1 :   info.reset();
     376                 :            : 
     377                 :            :   MessageEchoReply echo_reply;
     378 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE_NO_THROW(future_echo->receive(echo_reply));
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ -  + ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     379 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(!future_echo->valid());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     380                 :            : 
     381 [ +  - ][ +  - ]:          1 :   future_echo = call(CallEchoRequest(), call.name(), Message::Safe);
                 [ +  - ]
     382                 :            : 
     383 [ +  - ][ +  - ]:          2 :   std::vector<Caller<>::jumbo_message_key_type> keys;
     384                 :            : 
     385 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE_EQUAL(static_cast<unsigned int>(keys.size()), 0u);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
                 [ -  + ]
     386 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE_EQUAL(call.count_jumbo_messages(), 1u);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
                 [ -  + ]
     387                 :            :     
     388         [ +  - ]:          1 :   call.collect_jumbo_message_keys(keys);
     389                 :            : 
     390 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE_EQUAL(static_cast<unsigned int>(keys.size()), 1u);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
                 [ -  + ]
     391                 :            : 
     392 [ +  - ][ +  - ]:          1 :   call.erase_jumbo_messages(keys.begin(), keys.end());
                 [ +  - ]
     393                 :            : 
     394 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE_EQUAL(call.count_jumbo_messages(), 0u);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
                 [ -  + ]
     395                 :            : 
     396 [ +  - ][ +  - ]:          1 :   call.erase_jumbo_messages(keys.begin(), keys.end());
                 [ +  - ]
     397                 :            : 
     398 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE_EQUAL(call.count_jumbo_messages(), 0u);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
                 [ -  + ]
     399                 :            : 
     400         [ +  - ]:          1 :   call.receive(info);
     401                 :            : 
     402 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->id() == MessageEchoRequest::id);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     403 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->role() == TwoWayRequest);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     404 [ +  - ][ +  - ]:          1 :   BOOST_REQUIRE(info->token() == future_echo->token());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
     405 [ +  - ][ +  - ]:          6 : }
         [ +  - ][ +  - ]