test and fix backward printing
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Thu, 28 Jun 2007 13:43:27 +0200
changeset 907 c67b33c30a8e
parent 906 459b7a591892
child 908 a8bfc0d02134
test and fix backward printing
src/common/packet-metadata.cc
src/common/packet-metadata.h
--- a/src/common/packet-metadata.cc	Thu Jun 28 13:01:40 2007 +0200
+++ b/src/common/packet-metadata.cc	Thu Jun 28 13:43:27 2007 +0200
@@ -964,44 +964,43 @@
 }
 
 uint32_t
-PacketMetadata::DoPrint (struct PacketMetadata::SmallItem *item, uint32_t current,
-                        Buffer data, uint32_t offset, const PacketPrinter &printer,
-                        std::ostream &os) const
+PacketMetadata::DoPrint (const struct PacketMetadata::SmallItem *item, 
+                         const struct PacketMetadata::ExtraItem *extraItem,
+                         Buffer data, uint32_t offset, const PacketPrinter &printer,
+                         std::ostream &os) const
 {
-  PacketMetadata::ExtraItem extraItem;
-  ReadItems (current, item, &extraItem);
   uint32_t uid = item->typeUid & 0xfffffffe;
   if (uid == 0)
     {
       // payload.
-      printer.PrintPayload (os, extraItem.packetUid, item->size, 
-                            extraItem.fragmentStart, 
-                            item->size - extraItem.fragmentEnd);
+      printer.PrintPayload (os, extraItem->packetUid, item->size, 
+                            extraItem->fragmentStart, 
+                            item->size - extraItem->fragmentEnd);
     }
-  else if (extraItem.fragmentStart != 0 ||
-           extraItem.fragmentEnd != item->size)
+  else if (extraItem->fragmentStart != 0 ||
+           extraItem->fragmentEnd != item->size)
     {
-      printer.PrintChunkFragment (uid, os, extraItem.packetUid, item->size, 
-                                  extraItem.fragmentStart, 
-                                  item->size - extraItem.fragmentEnd);
+      printer.PrintChunkFragment (uid, os, extraItem->packetUid, item->size, 
+                                  extraItem->fragmentStart, 
+                                  item->size - extraItem->fragmentEnd);
     }
   else if (PacketPrinter::IsHeader (uid))
     {
       ns3::Buffer::Iterator j = data.Begin ();
       j.Next (offset);
-      printer.PrintChunk (uid, j, os, extraItem.packetUid, item->size);
+      printer.PrintChunk (uid, j, os, extraItem->packetUid, item->size);
     }
   else if (PacketPrinter::IsTrailer (uid))
     {
       ns3::Buffer::Iterator j = data.End ();
       j.Prev (data.GetSize () - (offset + item->size));
-      printer.PrintChunk (uid, j, os, extraItem.packetUid, item->size);
+      printer.PrintChunk (uid, j, os, extraItem->packetUid, item->size);
     }
   else 
     {
       NS_ASSERT (false);
     }
-  return extraItem.fragmentEnd - extraItem.fragmentStart;
+  return extraItem->fragmentEnd - extraItem->fragmentStart;
 }
 
 uint32_t
@@ -1041,18 +1040,18 @@
     }
   NS_ASSERT (m_data != 0);
   NS_ASSERT (GetTotalSize () == data.GetSize ());
+  struct PacketMetadata::SmallItem item;
+  struct PacketMetadata::ExtraItem extraItem;
   if (printer.m_forward)
     {
-      uint32_t tail = m_tail;
-      uint32_t head = m_head;
-      uint32_t current = head;
+      uint32_t current = m_head;
       uint32_t offset = 0;
       while (current != 0xffff)
         {
-          struct PacketMetadata::SmallItem item;
-          uint32_t realSize = DoPrint (&item, current, data, offset, printer, os);
+          ReadItems (current, &item, &extraItem);
+          uint32_t realSize = DoPrint (&item, &extraItem, data, offset, printer, os);
           offset += realSize;
-          if (current == tail)
+          if (current == m_tail)
             {
               break;
             }
@@ -1066,16 +1065,14 @@
     }
   else
     {
-      uint32_t head = m_head;
-      uint32_t tail = m_tail;
-      uint32_t current = head;
-      uint32_t offset = 0;
+      uint32_t current = m_tail;
+      uint32_t offset = data.GetSize ();
       while (current != 0xffff)
         {
-          struct PacketMetadata::SmallItem item;
-          uint32_t realSize = DoPrint (&item, current, data, offset, printer, os);
+          ReadItems (current, &item, &extraItem);
+          uint32_t realSize = DoPrint (&item, &extraItem, data, offset - item.size, printer, os);
           offset -= realSize;
-          if (current == tail)
+          if (current == m_head)
             {
               break;
             }
@@ -1248,7 +1245,7 @@
 public:
   PacketMetadataTest ();
   virtual ~PacketMetadataTest ();
-  bool CheckHistory (Packet p, char *file, int line, uint32_t n, ...);
+  bool CheckHistory (Packet p, const char *file, int line, uint32_t n, ...);
   virtual bool RunTests (void);
 private:
   template <int N>
@@ -1269,6 +1266,7 @@
   template <int N>
   void RegisterTrailer (void);
   void CleanupPrints (void);
+  bool Check (const char *file, int line, std::list<int> expected);
 
 
   bool m_headerError;
@@ -1366,14 +1364,9 @@
   m_prints.clear ();
 }
 
-bool 
-PacketMetadataTest::CheckHistory (Packet p, char *file, int line, uint32_t n, ...)
+bool
+PacketMetadataTest::Check (const char *file, int line, std::list<int> expected)
 {
-  m_headerError = false;
-  m_trailerError = false;
-  va_list ap;
-  p.Print (std::cerr, m_printer);
-  va_start (ap, n);
   if (m_headerError)
     {
       std::cout << "PacketMetadata header error. file=" << file 
@@ -1386,21 +1379,20 @@
                 << ", line=" << line << std::endl;
       return false;
     }
-  if (n != m_prints.size ())
+  if (expected.size () != m_prints.size ())
     {
       goto error;
     }
-  for (std::list<int>::iterator i = m_prints.begin (); 
-       i != m_prints.end (); i++)
+  for (std::list<int>::iterator i = m_prints.begin (),
+         j = expected.begin (); 
+       i != m_prints.end (); i++, j++)
     {
-      int v = va_arg (ap, int);
-      if (v != *i)
+      NS_ASSERT (j != expected.end ());
+      if (*j != *i)
         {
-          va_end (ap);
           goto error;
         }
     }
-  va_end (ap);
   return true;
  error:
   std::cout << "PacketMetadata error. file="<< file 
@@ -1411,15 +1403,45 @@
       std::cout << *i << ", ";
     }
   std::cout << "\", expected: \"";
+  for (std::list<int>::iterator j = expected.begin ();
+       j != expected.end (); j++)
+    {
+      std::cout << *j << ", ";
+    }
+  std::cout << "\"" << std::endl;
+  return false;
+}
+
+bool 
+PacketMetadataTest::CheckHistory (Packet p, const char *file, int line, uint32_t n, ...)
+{
+  m_headerError = false;
+  m_trailerError = false;
+  std::list<int> expected;
+  va_list ap;
   va_start (ap, n);
   for (uint32_t j = 0; j < n; j++)
     {
       int v = va_arg (ap, int);
-      std::cout << v << ", ";
+      expected.push_back (v);
     }
   va_end (ap);
-  std::cout << "\"" << std::endl;
-  return false;
+
+  m_printer.PrintForward ();
+  p.Print (std::cerr, m_printer);
+  bool ok = Check (file, line, expected);
+  CleanupPrints ();
+  if (!ok)
+    {
+      return false;
+    }
+
+  m_printer.PrintBackward ();
+  p.Print (std::cerr, m_printer);
+  expected.reverse ();
+  ok = Check (file, line, expected);
+  CleanupPrints ();
+  return ok;
 }
 
 #define ADD_HEADER(p, n)                        \
@@ -1453,7 +1475,6 @@
       {                                         \
         ok = false;                             \
       }                                         \
-    CleanupPrints ();                           \
   }
 
 bool
--- a/src/common/packet-metadata.h	Thu Jun 28 13:01:40 2007 +0200
+++ b/src/common/packet-metadata.h	Thu Jun 28 13:43:27 2007 +0200
@@ -162,7 +162,8 @@
   void AppendValueExtra (uint32_t value, uint8_t *buffer);
   inline void Reserve (uint32_t n);
   void ReserveCopy (uint32_t n);
-  uint32_t DoPrint (struct PacketMetadata::SmallItem *item, uint32_t current,
+  uint32_t DoPrint (const struct PacketMetadata::SmallItem *item,
+                    const struct PacketMetadata::ExtraItem *extraItem,
                     Buffer data, uint32_t offset, const PacketPrinter &printer,
                     std::ostream &os) const;
   uint32_t GetTotalSize (void) const;