Packets/GenericTLV: added bytes(key) member to registry
[senf.git] / senf / Packets / GenericTLV.test.cc
index 84be10c..b403c33 100644 (file)
@@ -1,9 +1,9 @@
 // $Id$
 //
-// Copyright (C) 2008
+// Copyright (C) 2009
 // Fraunhofer Institute for Open Communication Systems (FOKUS)
 // Competence Center NETwork research (NET), St. Augustin, GERMANY
-//     @AUTHOR@
+//     Thorsten Horstmann <tho@berlios.de>
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -25,7 +25,7 @@
 
 // Custom includes
 #include "GenericTLV.hh"
-#include <senf/Utils/hexdump.hh>
+#include <senf/Packets/DefaultBundle/IPv6Extensions.hh>
 
 #include <senf/Utils/auto_unit_test.hh>
 #include <boost/test/test_tools.hpp>
@@ -41,6 +41,8 @@ namespace {
         SENF_PARSER_FIELD    ( type,   senf::UInt8Parser );
         SENF_PARSER_FIELD_RO ( length, senf::UInt8Parser );
         SENF_PARSER_FINALIZE ( MyTLVParserBase           );
+        
+        typedef senf::GenericTLVParserRegistry<MyTLVParserBase> Registry;
     };
     
     struct MyGenericTLVParser
@@ -59,10 +61,41 @@ namespace {
        SENF_PARSER_FINALIZE ( MyConcreteTLVParser         );
     
        SENF_PARSER_INIT() {
-           type() = TYPEID;
+           type() = typeId;
+           length_() = 4;
+       }
+       static type_t::value_type const typeId = 0x42;
+       
+       void dump(std::ostream & os) const {
+           boost::io::ios_all_saver ias(os);
+           os << "  MyConcreteTLVParser\n"
+              << "    type:   " << senf::format::dumpint(type()) << "\n"
+              << "    length: " << senf::format::dumpint(length()) << "\n"
+              << "    value:  " << senf::format::dumpint(myValue()) << "\n";
+       }
+   };
+   
+   struct MyConcrete2TLVParser
+       : public MyTLVParserBase
+   {
+   #   include SENF_PARSER()
+       SENF_PARSER_INHERIT  ( MyTLVParserBase             );
+       SENF_PARSER_FIELD    ( myValue, senf::UInt32Parser );
+       SENF_PARSER_FINALIZE ( MyConcrete2TLVParser         );
+    
+       SENF_PARSER_INIT() {
+           type() = typeId;
            length_() = 4;
-       }        
-       static const type_t::value_type TYPEID = 0x42;
+       }
+       static type_t::value_type const typeId = 0x47;
+       
+       void dump(std::ostream & os) const {
+           boost::io::ios_all_saver ias(os);
+           os << "  MyConcreteTLVParser\n"
+              << "    type:   " << senf::format::dumpint(type()) << "\n"
+              << "    length: " << senf::format::dumpint(length()) << "\n"
+              << "    value:  " << senf::format::dumpint(myValue()) << "\n";
+       }
    };
         
     class MyTestPacketParser
@@ -89,7 +122,7 @@ namespace {
 }
 
 
-BOOST_AUTO_UNIT_TEST(GenericTLV_parser)
+SENF_AUTO_UNIT_TEST(GenericTLV_parser)
 {
     BOOST_CHECK_EQUAL( senf::init_bytes<MyGenericTLVParser>::value, 
             senf::init_bytes<MyTLVParserBase>::value) ;
@@ -122,7 +155,7 @@ BOOST_AUTO_UNIT_TEST(GenericTLV_parser)
     BOOST_CHECK_EQUAL( concreteTLVParser.myValue(), 0xabababab );
 }
 
-BOOST_AUTO_UNIT_TEST(GenericTLV_packet)
+SENF_AUTO_UNIT_TEST(GenericTLV_packet)
 {
     MyTestPacket p ( MyTestPacket::create());
     MyTestPacket::Parser::tlv_list_t::container tlvContainer (p->tlv_list() );
@@ -141,6 +174,56 @@ BOOST_AUTO_UNIT_TEST(GenericTLV_packet)
 }
 
 
+SENF_AUTO_UNIT_TEST(GenericTLV_registry)
+{
+    typedef senf::GenericTLVParserRegistry<MyTLVParserBase> MyTLVParserRegistry;
+    MyTestPacket p ( MyTestPacket::create());
+    MyTestPacket::Parser::tlv_list_t::container tlvContainer (p->tlv_list() );
+    MyConcreteTLVParser conreteTLVParser ( 
+            tlvContainer.push_back_space().init<MyConcreteTLVParser>());
+    conreteTLVParser.myValue() << 0xffff;
+    p.finalizeThis();
+        
+    std::stringstream ss;
+    tlvContainer.begin()->dump( ss);
+    BOOST_CHECK_EQUAL( ss.str().substr(0,58), 
+            "  GenericTLVParser<(anonymous namespace)::MyTLVParserBase>" );
+    BOOST_CHECK( ! MyTLVParserRegistry::instance().isRegistered( tlvContainer.begin()->type()));
+    
+    MyTLVParserRegistry::instance().registerParser<MyConcreteTLVParser>();
+    BOOST_CHECK( MyTLVParserRegistry::instance().isRegistered( tlvContainer.begin()->type()));
+    BOOST_CHECK_EQUAL( 
+            MyTLVParserRegistry::instance().bytes( *tlvContainer.begin()),
+            senf::bytes( *tlvContainer.begin()) );
+    
+    ss.str(""); ss.clear();
+    
+    tlvContainer.begin()->dump( ss);
+    BOOST_CHECK_EQUAL( ss.str().substr(0,21), "  MyConcreteTLVParser" );
+}
+
+SENF_AUTO_UNIT_TEST(GenericTLV_predicate)
+{
+    MyTestPacket p ( MyTestPacket::create() );
+    MyTestPacket::Parser::tlv_list_t::container tlvContainer (p->tlv_list() );
+    MyConcreteTLVParser conreteTLVParser ( 
+            tlvContainer.push_back_space().init<MyConcreteTLVParser>());
+    conreteTLVParser.myValue() << 0xffff;
+    MyConcrete2TLVParser conreteTLVParser2 ( 
+            tlvContainer.push_back_space().init<MyConcrete2TLVParser>());
+    conreteTLVParser2.myValue() << 0xdddd;
+    p.finalizeThis();
+    
+//     typedef senf::IPv6HopByHopOptionsPacket::Parser::options_t::container optContainer_t; 
+//     optContainer_t optC (p->tlv_list() );
+    
+    MyTestPacket::Parser::tlv_list_t::container testTlvContainer (p->tlv_list() );
+    MyTestPacket::Parser::tlv_list_t::container::iterator it = std::find_if (
+      testTlvContainer.begin(), testTlvContainer.end(), 
+      senf::detail::Predicate< senf::GenericTLVParserBase<MyTLVParserBase>, MyConcreteTLVParser>() );
+    BOOST_CHECK( it->is<MyConcreteTLVParser>()) ;
+}
+
 ///////////////////////////////cc.e////////////////////////////////////////
 #undef prefix_