X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2FPacket.test.cc;h=62b22c4cc7b3093f82895c786d32c92f97d9f6d1;hb=80550046686fc160f5d7ff076f1b167a13538466;hp=e917d7244a6f56499d012da7fb5f7cd0cbce9c88;hpb=9cb871b939efe93e35dd96808d25089399acfc46;p=senf.git diff --git a/senf/Packets/Packet.test.cc b/senf/Packets/Packet.test.cc index e917d72..62b22c4 100644 --- a/senf/Packets/Packet.test.cc +++ b/senf/Packets/Packet.test.cc @@ -29,6 +29,7 @@ // Custom includes #include #include +#include #include "Packets.hh" #include @@ -90,8 +91,8 @@ namespace { using mixin::init; static void dump(packet p, std::ostream & os) { os << "BarPacket:\n" - << " type: " << p->type() << "\n" - << " length: " << p->length() << "\n"; + << senf::fieldName("type") << p->type() << "\n" + << senf::fieldName("length") << p->length() << "\n"; } static void finalize(packet p) { if (p.next(senf::nothrow)) @@ -106,12 +107,12 @@ namespace { typedef BarPacketType::packet BarPacket; namespace reg { - senf::PacketRegistry::RegistrationProxy registerFoo(1u); - senf::PacketRegistry::RegistrationProxy registerBar(2u); + senf::PacketRegistry::ScopedRegistrationProxy registerFoo(1u); + senf::PacketRegistry::ScopedRegistrationProxy registerBar(2u); } struct IntAnnotation { - unsigned value; + boost::uint32_t value; }; std::ostream & operator<<(std::ostream & os, IntAnnotation const & v) @@ -126,9 +127,12 @@ namespace { struct ComplexAnnotation : senf::ComplexAnnotation { - ComplexAnnotation() : s(), i() {} + ComplexAnnotation() : s("empty"), i(-1) {} std::string s; - int i; + boost::int32_t i; + // padding so the size does not depend on the platform ... + struct _ {std::string s;boost::int32_t i;}; + char __ [32-sizeof(_)]; }; std::ostream & operator<<(std::ostream & os, ComplexAnnotation const & v) @@ -152,12 +156,14 @@ namespace { SENF_AUTO_UNIT_TEST(packet) { + BOOST_CHECK(! senf::Packet().is() ); senf::Packet packet (FooPacket::create()); BarPacket::createAfter(packet); BOOST_REQUIRE( packet ); BOOST_CHECK( packet.next() ); BOOST_CHECK( ! packet.next().next(senf::nothrow) ); + BOOST_CHECK( ! packet.next().next(senf::nothrow).is() ); BOOST_CHECK( ! packet.prev(senf::nothrow) ); BOOST_CHECK( packet.next().prev() == packet ); SENF_CHECK_NOT_EQUAL( packet.next(), packet ); @@ -172,8 +178,18 @@ SENF_AUTO_UNIT_TEST(packet) BOOST_CHECK( packet.first() == packet ); BOOST_CHECK( packet.last() == packet.next() ); + BOOST_CHECK( ! packet.is_shared() ); + { + senf::Packet p2 (packet); + BOOST_CHECK( packet.is_shared() ); + BOOST_CHECK( p2.is_shared() ); + } + BOOST_CHECK( ! packet.is_shared() ); + senf::Packet p2 (packet.next()); BOOST_CHECK( p2 ); + BOOST_CHECK( packet.is_shared() ); + BOOST_CHECK( p2.is_shared() ); packet.parseNextAs(); BOOST_CHECK_EQUAL( packet.size(), 12u ); BOOST_CHECK_EQUAL( packet.next().size(), 8u ); @@ -182,6 +198,7 @@ SENF_AUTO_UNIT_TEST(packet) BOOST_CHECK( packet.next().as() ); p2 = packet.next().clone(); + BOOST_CHECK( ! packet.is_shared() ); BOOST_REQUIRE( p2 ); packet.next().append( p2 ); BOOST_REQUIRE( packet.next().next() ); @@ -198,11 +215,10 @@ SENF_AUTO_UNIT_TEST(packet) packet.dump(s); BOOST_CHECK_EQUAL( s.str(), "Annotations:\n" - " (anonymous namespace)::ComplexAnnotation: no value\n" - " (anonymous namespace)::IntAnnotation: 0\n" + " (anonymous namespace)::IntAnnotation : 0\n" "BarPacket:\n" - " type: 0\n" - " length: 0\n" ); + " type : 0\n" + " length : 0\n" ); packet.finalizeAll(); BOOST_CHECK_EQUAL( packet.last().as()->type(), @@ -313,10 +329,16 @@ SENF_AUTO_UNIT_TEST(packetAssign) SENF_AUTO_UNIT_TEST(packetAnnotation) { + typedef senf::detail::AnnotationRegistry Reg; + senf::Packet packet (FooPacket::create()); BarPacket::createAfter(packet); ComplexAnnotation & ca (packet.annotation()); + + BOOST_CHECK_EQUAL( ca.s, "empty" ); + BOOST_CHECK_EQUAL( ca.i, -1 ); + ca.s = "dead beef"; ca.i = 0x12345678; SENF_CHECK_NO_THROW( packet.annotation().value = 0xDEADBEEF ); @@ -327,10 +349,33 @@ SENF_AUTO_UNIT_TEST(packetAnnotation) BOOST_CHECK_EQUAL( p2.annotation().s, "dead beef" ); BOOST_CHECK_EQUAL( p2.annotation().i, 0x12345678 ); - BOOST_CHECK( senf::detail::AnnotationIndexer::Small ); - BOOST_CHECK( ! senf::detail::AnnotationIndexer::Small ); - BOOST_CHECK( ! senf::detail::AnnotationIndexer::Small ); - BOOST_CHECK( ! senf::detail::AnnotationIndexer::Small ); + senf::Packet pClone (packet.clone()); + + p2.clearAnnotations(); + BOOST_CHECK_EQUAL( p2.annotation().s, "empty" ); + BOOST_CHECK_EQUAL( p2.annotation().i, -1 ); + BOOST_CHECK_EQUAL( p2.annotation().value, 0 ); + + BOOST_CHECK_EQUAL( pClone.annotation().value, 0xDEADBEEFu ); + BOOST_CHECK_EQUAL( pClone.annotation().s, "dead beef" ); + BOOST_CHECK_EQUAL( pClone.annotation().i, 0x12345678 ); + + BOOST_CHECK( Reg::lookup() >= 0 ); + BOOST_CHECK( Reg::lookup() < 0 ); + BOOST_CHECK( Reg::lookup() < 0 ); + BOOST_CHECK( Reg::lookup() < 0 ); + + std::stringstream ss; + senf::dumpPacketAnnotationRegistry(ss); + BOOST_CHECK_EQUAL( + ss.str(), + "SENF_PACKET_ANNOTATION_SLOTS = 8\n" + "SENF_PACKET_ANNOTATION_SLOTSIZE = 16\n" + "TYPE FAST COMPLEX SIZE\n" + "(anonymous namespace)::ComplexAnnotation no yes 32\n" + "(anonymous namespace)::ComplexEmptyAnnotation no yes 1\n" + "(anonymous namespace)::IntAnnotation yes no 4\n" + "(anonymous namespace)::LargeAnnotation no no 32\n" ); } #ifdef COMPILE_CHECK