// $Id$
//
-// Copyright (C) 2007
-// Fraunhofer Institute for Open Communication Systems (FOKUS)
-// Competence Center NETwork research (NET), St. Augustin, GERMANY
+// Copyright (C) 2007
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
// Stefan Bund <g0dil@berlios.de>
//
// This program is free software; you can redistribute it and/or modify
// Custom includes
#include <sstream>
+#include <boost/static_assert.hpp>
#include "Packets.hh"
#include "../Utils/auto_unit_test.hh"
senf::PacketRegistry<RegTag>::RegistrationProxy<BarPacket> registerBar(2u);
}
+ struct IntAnnotation {
+ unsigned value;
+ };
+
+ struct LargeAnnotation {
+ char value[32];
+ };
+
+ struct ComplexAnnotation : senf::ComplexAnnotation
+ {
+ std::string s;
+ int i;
+ };
+
+ struct ComplexEmptyAnnotation : senf::ComplexAnnotation
+ {};
+
+ struct InvalidAnnotation
+ {
+ std::string value;
+ };
+
}
BOOST_AUTO_UNIT_TEST(packet)
packet.dump(s);
BOOST_CHECK_EQUAL( s.str(), "BarPacket:\ntype: 0\nlength: 0\n" );
- packet.finalize();
+ packet.finalizeAll();
BOOST_CHECK_EQUAL( packet.last().as<BarPacket>()->type(),
- BarPacket::type::parser::type_t::value_type(-1) );
+ BarPacket::Parser::type_t::value_type(-1) );
packet.last().append(FooPacket::create());
- packet.finalize();
+ packet.finalizeThis();
+ packet.finalizeTo<BarPacket>();
+ packet.finalizeTo(packet.find<BarPacket>());
+ packet.finalizeAll();
BOOST_CHECK_EQUAL( packet.find<BarPacket>()->type(), 1u );
BOOST_CHECK( packet.factory() == FooPacket::factory() );
BOOST_CHECK_EQUAL( FooPacket::create().size(), 4u );
BOOST_CHECK_EQUAL( FooPacket::create(senf::noinit).size(), 0u );
BOOST_CHECK_THROW( FooPacket::create(2u), senf::TruncatedPacketException );
- BOOST_CHECK_EQUAL( FooPacket::create(10u).size(), 10u );
+ // No 'u' suffix here to check, that the disable_if works ...
+ BOOST_CHECK_EQUAL( FooPacket::create(10).size(), 10u );
BOOST_CHECK_EQUAL( FooPacket::create(2u,senf::noinit).size(), 2u );
BOOST_CHECK_EQUAL( FooPacket::create(data).size(), 6u );
BOOST_CHECK_EQUAL( packet.size(), 4u );
BOOST_CHECK_THROW( FooPacket::createAfter(packet,2u), senf::TruncatedPacketException );
- BOOST_CHECK_EQUAL( FooPacket::createAfter(packet,10u).size(), 10u );
+ // No 'u' suffix here to check, that the disable_if works ...
+ BOOST_CHECK_EQUAL( FooPacket::createAfter(packet,10).size(), 10u );
BOOST_CHECK_EQUAL( packet.size(), 14u );
BOOST_CHECK_EQUAL( FooPacket::createAfter(packet,2u,senf::noinit).size(), 2u );
BOOST_CHECK_EQUAL( BarPacket::create()->reserved(), 0xA0A0u );
}
+BOOST_AUTO_UNIT_TEST(packetAnnotation)
+{
+ senf::Packet packet (FooPacket::create());
+ BarPacket::createAfter(packet);
+
+ ComplexAnnotation & ca (packet.annotation<ComplexAnnotation>());
+ ca.s = "dead beef";
+ ca.i = 0x12345678;
+ SENF_CHECK_NO_THROW( packet.annotation<IntAnnotation>().value = 0xDEADBEEF );
+
+ senf::Packet p2 (packet.next());
+
+ BOOST_CHECK_EQUAL( p2.annotation<IntAnnotation>().value, 0xDEADBEEFu );
+ BOOST_CHECK_EQUAL( p2.annotation<ComplexAnnotation>().s, "dead beef" );
+ BOOST_CHECK_EQUAL( p2.annotation<ComplexAnnotation>().i, 0x12345678 );
+
+ BOOST_CHECK( senf::detail::AnnotationIndexer<IntAnnotation>::Small );
+ BOOST_CHECK( ! senf::detail::AnnotationIndexer<LargeAnnotation>::Small );
+ BOOST_CHECK( ! senf::detail::AnnotationIndexer<ComplexAnnotation>::Small );
+ BOOST_CHECK( ! senf::detail::AnnotationIndexer<ComplexEmptyAnnotation>::Small );
+}
+
+#ifdef COMPILE_CHECK
+
+COMPILE_FAIL(invalidAnnotation)
+{
+#if 0 // The traits check fails for user defined but trivial constructors so ...
+# ifdef BOOST_HAS_TYPE_TRAITS_INTRINSICS
+
+ senf::Packet packet (FooPacket::create());
+ (void) packet.annotation<InvalidAnnotation>();
+
+# else
+# endif
+#endif
+
+ invalid_annotation_check_disabled();
+
+}
+
+#endif
+
///////////////////////////////cc.e////////////////////////////////////////
#undef prefix_