X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FPacket.test.cc;h=6aecfbea691148c55825d8e8464df082575f0f27;hb=1a29b75bf774444ec182dfff8480a0c53597bf85;hp=b88993e4bc67132b3144a8dc9f4704a974a3fc95;hpb=9348e1098d66ac2684c8e280abf8d7143c887982;p=senf.git diff --git a/Packets/Packet.test.cc b/Packets/Packet.test.cc index b88993e..6aecfbe 100644 --- a/Packets/Packet.test.cc +++ b/Packets/Packet.test.cc @@ -21,13 +21,14 @@ // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. /** \file - \brief Packet.test unit tests */ + \brief Packet unit tests */ //#include "Packet.test.hh" //#include "Packet.test.ih" // Custom includes #include +#include #include "Packets.hh" #include "../Utils/auto_unit_test.hh" @@ -89,8 +90,8 @@ namespace { using mixin::init; static void dump(packet p, std::ostream & os) { os << "BarPacket:\n" - << "type: " << p->type() << "\n" - << "length: " << p->length() << "\n"; + << " type: " << p->type() << "\n" + << " length: " << p->length() << "\n"; } static void finalize(packet p) { if (p.next(senf::nothrow)) @@ -110,25 +111,50 @@ namespace { } struct IntAnnotation { - int value; + unsigned value; }; - struct ComplexAnnotation { + std::ostream & operator<<(std::ostream & os, IntAnnotation const & v) + { os << v.value; return os; } + + struct LargeAnnotation { + char value[32]; + }; + + std::ostream & operator<<(std::ostream & os, LargeAnnotation const & v) + { os << v.value; return os; } + + struct ComplexAnnotation : senf::ComplexAnnotation + { + ComplexAnnotation() : s(), i() {} std::string s; int i; }; + std::ostream & operator<<(std::ostream & os, ComplexAnnotation const & v) + { os << "('" << v.s << "' " << v.i << ')'; return os; } + + struct ComplexEmptyAnnotation : senf::ComplexAnnotation + {}; + + std::ostream & operator<<(std::ostream & os, ComplexEmptyAnnotation const & v) + { os << "(empty)"; return os; } + + struct InvalidAnnotation + { + std::string value; + }; + + std::ostream & operator<<(std::ostream & os, InvalidAnnotation const & v) + { os << v.value; return os; } + } BOOST_AUTO_UNIT_TEST(packet) { - senf::Packet packet (FooPacket::create()); + senf::Packet packet (FooPacket::create()); BarPacket::createAfter(packet); - SENF_CHECK_NO_THROW( packet.annotation().value = 0xDEADBEEF ); - ComplexAnnotation & ca (packet.annotation()); - ca.s = "dead beef"; - ca.i = 0x12345678; BOOST_REQUIRE( packet ); BOOST_CHECK( packet.next() ); BOOST_CHECK( ! packet.next().next(senf::nothrow) ); @@ -170,7 +196,13 @@ BOOST_AUTO_UNIT_TEST(packet) std::stringstream s; packet.dump(s); - BOOST_CHECK_EQUAL( s.str(), "BarPacket:\ntype: 0\nlength: 0\n" ); + BOOST_CHECK_EQUAL( s.str(), + "Annotations:\n" + " (anonymous namespace)::ComplexAnnotation: no value\n" + " (anonymous namespace)::IntAnnotation: 0\n" + "BarPacket:\n" + " type: 0\n" + " length: 0\n" ); packet.finalizeAll(); BOOST_CHECK_EQUAL( packet.last().as()->type(), @@ -187,7 +219,7 @@ BOOST_AUTO_UNIT_TEST(packet) senf::PacketData::byte data[] = { 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x82, 0x83 }; - BarPacket::createAfter(packet,data); + BarPacket::createAfter(packet, data); BOOST_REQUIRE( packet.next() ); BOOST_REQUIRE( packet.next().is() ); BOOST_CHECK( packet.last().is() ); @@ -204,6 +236,10 @@ BOOST_AUTO_UNIT_TEST(packet) BOOST_CHECK( packet.last().rfind() == packet.last() ); BOOST_CHECK( packet.next() == packet.next() ); BOOST_CHECK( packet.last().prev().prev() == packet ); + + senf::DataPacket::createAfter(packet); + BOOST_CHECK_THROW( packet.next().next().next().parseNextAs(), + senf::InvalidPacketChainException ); } BOOST_AUTO_UNIT_TEST(concretePacket) @@ -247,6 +283,59 @@ BOOST_AUTO_UNIT_TEST(concretePacket) BOOST_CHECK_EQUAL( BarPacket::create()->reserved(), 0xA0A0u ); } +BOOST_AUTO_UNIT_TEST(packetAssign) +{ + BarPacket bar1 (BarPacket::create()); + BarPacket bar2 (BarPacket::create()); + + bar2->type() << 0x2A2Bu; + bar1.parser() << bar2; + + BOOST_CHECK_EQUAL( bar1->type(), 0x2A2Bu ); +} + +BOOST_AUTO_UNIT_TEST(packetAnnotation) +{ + senf::Packet packet (FooPacket::create()); + BarPacket::createAfter(packet); + + ComplexAnnotation & ca (packet.annotation()); + ca.s = "dead beef"; + ca.i = 0x12345678; + SENF_CHECK_NO_THROW( packet.annotation().value = 0xDEADBEEF ); + + senf::Packet p2 (packet.next()); + + BOOST_CHECK_EQUAL( p2.annotation().value, 0xDEADBEEFu ); + 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 ); +} + +#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(); + +# else +# endif +#endif + + invalid_annotation_check_disabled(); + +} + +#endif + ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_