示例#1
0
BOOST_AUTO_TEST_CASE_TEMPLATE(InstanceName, T, Tests)
{
  BOOST_REQUIRE(T::Strategy::getStrategyName().at(-1).isVersion());
  uint64_t maxVersion = T::Strategy::getStrategyName().at(-1).toVersion();
  BOOST_REQUIRE_LE(T::getMinVersion(), maxVersion);

  Forwarder forwarder;
  for (uint64_t version = T::getMinVersion(); version <= maxVersion; ++version) {
    Name versionedName = T::getVersionedStrategyName(version);
    unique_ptr<typename T::Strategy> instance;
    BOOST_CHECK_NO_THROW(instance = make_unique<typename T::Strategy>(forwarder, versionedName));
    BOOST_CHECK_EQUAL(instance->getInstanceName(), versionedName);

    if (!T::canAcceptParameters()) {
      Name nameWithParameters = Name(versionedName).append("param");
      BOOST_CHECK_THROW(typename T::Strategy(forwarder, nameWithParameters), std::invalid_argument);
    }
  }

  if (T::getMinVersion() > 0) {
    Name version0Name = T::getVersionedStrategyName(0);
    BOOST_CHECK_THROW(typename T::Strategy(forwarder, version0Name), std::invalid_argument);
    Name earlyVersionName = T::getVersionedStrategyName(T::getMinVersion() - 1);
    BOOST_CHECK_THROW(typename T::Strategy(forwarder, earlyVersionName), std::invalid_argument);
  }

  if (maxVersion < std::numeric_limits<uint64_t>::max()) {
    Name versionMaxName = T::getVersionedStrategyName(std::numeric_limits<uint64_t>::max());
    BOOST_CHECK_THROW(typename T::Strategy(forwarder, versionMaxName), std::invalid_argument);
    Name lateVersionName = T::getVersionedStrategyName(maxVersion + 1);
    BOOST_CHECK_THROW(typename T::Strategy(forwarder, lateVersionName), std::invalid_argument);
  }
}
BOOST_AUTO_TEST_CASE_TEMPLATE( move_random_data_through_the_buffer, sizes, test_sizes )
{
    std::vector< std::uint8_t >   test_data = this->random_data( 20 );
    std::vector< std::uint8_t >   received_data;
    std::vector< std::size_t >    transmit_sizes;
    std::vector< std::size_t >    receive_sizes;

    const std::size_t max_rx_size_value = std::tuple_element< 0, sizes >::type::value;
    const std::size_t min_size          = std::tuple_element< 1, sizes >::type::value;
    const std::size_t max_size          = std::tuple_element< 2, sizes >::type::value;

    max_rx_size( max_rx_size_value );

    auto emergency_counter = 2 * test_data.size();
    bool sequence_number   = false;

    for ( std::size_t send_size = 0; send_size < test_data.size(); --emergency_counter )
    {
        BOOST_REQUIRE( emergency_counter );
        auto read = allocate_receive_buffer();

        // if there is room in the receive buffer, I allocate that memory and simulate a received PDU
        if ( read.size )
        {
            const std::size_t size = std::min< std::size_t >( random_value( min_size, max_size ), test_data.size() - send_size );

            if ( size != 0 )
            {
                transmit_sizes.push_back( size );
            }

            read.buffer[ 1 ] = size;
            read.buffer[ 0 ] = 2;

            if ( sequence_number )
                read.buffer[ 0 ] |= 8;

            sequence_number = !sequence_number;

            std::copy( test_data.begin() + send_size, test_data.begin() + send_size + size, &read.buffer[ 2 ] );
            received( read );

            send_size += size;
        }
        // if there is no more room left, I simulate the receiving of an pdu
        else
        {
            auto next = next_received();
            BOOST_REQUIRE_NE( next.size, 0u );
            BOOST_REQUIRE_NE( next.buffer[ 1 ], 0u );

            receive_sizes.push_back( next.buffer[ 1 ] );
            BOOST_REQUIRE_LE( receive_sizes.size(), transmit_sizes.size() );
            BOOST_REQUIRE_EQUAL( receive_sizes.back(), transmit_sizes[ receive_sizes.size() - 1 ] );

            received_data.insert( received_data.end(), &next.buffer[ 2 ], &next.buffer[ 2 ] + next.buffer[ 1 ] );
            free_received();
        }
    }

    for ( auto next = next_received(); next.size; next = next_received(), --emergency_counter )
    {
        BOOST_REQUIRE( emergency_counter );
        receive_sizes.push_back( next.buffer[ 1 ] );
        BOOST_REQUIRE_LE( receive_sizes.size(), transmit_sizes.size() );
        BOOST_REQUIRE_EQUAL( receive_sizes.back(), transmit_sizes[ receive_sizes.size() - 1 ] );

        received_data.insert( received_data.end(), &next.buffer[ 2 ], &next.buffer[ 2 ] + next.buffer[ 1 ] );
        free_received();
    }

    BOOST_CHECK_EQUAL_COLLECTIONS( test_data.begin(), test_data.end(), received_data.begin(), received_data.end() );
}