Unit testing for dot11s-IE
authorKirill Andreev <andreev@iitp.ru>
Wed, 08 Apr 2009 20:58:40 +0400
changeset 4951 acaf07eb8542
parent 4950 1163cfb03b9b
child 4952 c4a851ed591b
Unit testing for dot11s-IE
src/devices/mesh/dot11s/ie-dot11s-beacon-timing.cc
src/devices/mesh/dot11s/ie-dot11s-beacon-timing.h
src/devices/mesh/dot11s/ie-dot11s-configuration.cc
src/devices/mesh/dot11s/ie-dot11s-configuration.h
src/devices/mesh/dot11s/ie-dot11s-peer-management.cc
src/devices/mesh/dot11s/ie-dot11s-peer-management.h
src/devices/mesh/dot11s/ie-dot11s-perr.cc
src/devices/mesh/dot11s/ie-dot11s-perr.h
src/devices/mesh/dot11s/ie-dot11s-prep.cc
src/devices/mesh/dot11s/ie-dot11s-prep.h
--- a/src/devices/mesh/dot11s/ie-dot11s-beacon-timing.cc	Wed Apr 08 18:17:33 2009 +0400
+++ b/src/devices/mesh/dot11s/ie-dot11s-beacon-timing.cc	Wed Apr 08 20:58:40 2009 +0400
@@ -21,6 +21,8 @@
 
 #include "ie-dot11s-beacon-timing.h"
 #include "ns3/log.h"
+#include "ns3/test.h"
+#include "ns3/packet.h"
 namespace ns3 {
 namespace dot11s {
 /*******************************************
@@ -52,23 +54,22 @@
 }
 
 uint8_t
-IeBeaconTimingUnit::GetAid ()
+IeBeaconTimingUnit::GetAid () const
 {
   return m_aid;
 }
 
 uint16_t
-IeBeaconTimingUnit::GetLastBeacon ()
+IeBeaconTimingUnit::GetLastBeacon () const
 {
   return m_lastBeacon;
 }
 
 uint16_t
-IeBeaconTimingUnit::GetBeaconInterval ()
+IeBeaconTimingUnit::GetBeaconInterval () const
 {
   return m_beaconInterval;
 }
-
 /*******************************************
  * IeBeaconTiming
  *******************************************/
@@ -153,8 +154,9 @@
 void
 IeBeaconTiming::PrintInformation (std::ostream& os) const
 {
+  os <<"Number of units: " << (uint16_t)m_numOfUnits << "\n";
   for (NeighboursTimingUnitsList::const_iterator j = m_neighbours.begin (); j != m_neighbours.end(); j++)
-    os << "AID=" << (*j)->GetAid () << ", Last beacon was at "
+    os<< "AID=" << (uint16_t)(*j)->GetAid () << ", Last beacon was at "
       << (*j)->GetLastBeacon ()<<", with beacon interval " << (*j)->GetBeaconInterval () << "\n";
 }
 
@@ -201,7 +203,58 @@
 {
   return (uint8_t) (x&0xff);
 };
-  
+
+bool operator== (const IeBeaconTimingUnit & a, const IeBeaconTimingUnit & b)
+{
+  return (
+      (a.GetAid () == b.GetAid ()) &&
+      (a.GetLastBeacon () == b.GetLastBeacon()) &&
+      (a.GetBeaconInterval () == b.GetBeaconInterval ())
+      );
+}
+bool operator== (const IeBeaconTiming & a, const IeBeaconTiming& b)
+{
+  if(a.m_numOfUnits != b.m_numOfUnits)
+    return false;
+  for(unsigned int i = 0; i < a.m_neighbours.size (); i ++)
+    if(!(*PeekPointer(a.m_neighbours[i]) == *PeekPointer(b.m_neighbours[i])))
+      return false;
+  return true;
+}
+
+#ifdef RUN_SELF_TESTS  
+struct IeBeaconTimingBist : public Test 
+{
+  IeBeaconTimingBist () : Test ("Mesh/802.11s/IE/BeaconTiming") {}
+  virtual bool RunTests(); 
+};
+
+/// Test instance
+static IeBeaconTimingBist g_IePerrBist;
+
+bool IeBeaconTimingBist::RunTests ()
+{
+  bool result(true);
+  // create test information element
+  IeBeaconTiming a;
+  a.IeBeaconTiming::AddNeighboursTimingElementUnit (1,Seconds(1.0), Seconds(4.0));
+  a.IeBeaconTiming::AddNeighboursTimingElementUnit (2,Seconds(2.0), Seconds(3.0));
+  a.IeBeaconTiming::AddNeighboursTimingElementUnit (3,Seconds(3.0), Seconds(2.0));
+  a.IeBeaconTiming::AddNeighboursTimingElementUnit (4,Seconds(4.0), Seconds(1.0));
+  Ptr<Packet> packet = Create<Packet> ();
+  packet->AddHeader(a);
+  IeBeaconTiming b;
+  packet->RemoveHeader(b);
+  NS_TEST_ASSERT_EQUAL (a, b);
+  //Test Find First
+  packet->AddHeader (a);
+  IeBeaconTiming c;
+  bool ok = c.FindFirst(packet);
+  NS_TEST_ASSERT (ok);
+  NS_TEST_ASSERT_EQUAL (a, c);
+  return result;
+}
+#endif
 } // namespace dot11s
 } //namespace ns3
 
--- a/src/devices/mesh/dot11s/ie-dot11s-beacon-timing.h	Wed Apr 08 18:17:33 2009 +0400
+++ b/src/devices/mesh/dot11s/ie-dot11s-beacon-timing.h	Wed Apr 08 20:58:40 2009 +0400
@@ -22,7 +22,7 @@
 #ifndef WIFI_TIMING_ELEMENT_H
 #define WIFI_TIMING_ELEMENT_H
 
-#include <list>
+#include <vector>
 #include "ns3/nstime.h"
 #include "ns3/wifi-information-element.h"
 
@@ -40,9 +40,9 @@
   void SetLastBeacon (uint16_t last_beacon);
   void SetBeaconInterval (uint16_t beacon_interval);
 
-  uint8_t GetAid ();
-  uint16_t GetLastBeacon ();
-  uint16_t GetBeaconInterval ();
+  uint8_t GetAid () const;
+  uint16_t GetLastBeacon () const;
+  uint16_t GetBeaconInterval () const;
   /**
    * \brief Least significant octet of AID:
    */
@@ -56,6 +56,7 @@
    * \brief Beacon interval of remote mesh point:
    */
   uint16_t m_beaconInterval;
+  friend bool operator== (const IeBeaconTimingUnit & a, const IeBeaconTimingUnit & b);
 };
 
 /**
@@ -69,7 +70,7 @@
    * \ingroup dot11s
    * This type is a list of timing elements obtained from neigbours with their beacons:
    */
-  typedef std::list< Ptr<IeBeaconTimingUnit> > NeighboursTimingUnitsList;
+  typedef std::vector< Ptr<IeBeaconTimingUnit> > NeighboursTimingUnitsList;
 
   IeBeaconTiming ();
   /**
@@ -108,8 +109,10 @@
    * Timing element parameters:
    */
   uint16_t  m_numOfUnits;
+  friend bool operator== (const IeBeaconTiming & a, const IeBeaconTiming & b);
 };
-  
+bool operator== (const IeBeaconTiming & a, const IeBeaconTiming & b);
+bool operator== (const IeBeaconTimingUnit & a, const IeBeaconTimingUnit & b);
 } // namespace dot11s
 } //namespace ns3
 #endif
--- a/src/devices/mesh/dot11s/ie-dot11s-configuration.cc	Wed Apr 08 18:17:33 2009 +0400
+++ b/src/devices/mesh/dot11s/ie-dot11s-configuration.cc	Wed Apr 08 20:58:40 2009 +0400
@@ -21,7 +21,8 @@
 
 
 #include "ie-dot11s-configuration.h"
-
+#include "ns3/test.h"
+#include "ns3/packet.h"
 namespace ns3 {
 namespace dot11s {
 
@@ -29,8 +30,8 @@
     acceptPeerLinks (true),
     MDAEnabled (false),
     forwarding (true),
-    beaconTimingReport (false),
-    TBTTAdjustment (false),
+    beaconTimingReport (true),
+    TBTTAdjustment (true),
     powerSaveLevel (false)
 {}
 
@@ -172,7 +173,58 @@
 {
   return m_meshCap;
 }
-  
+bool operator== (const dot11sMeshCapability & a, const dot11sMeshCapability & b)
+{
+  return (
+      (a.acceptPeerLinks == b.acceptPeerLinks) &&
+      (a.MDAEnabled == b.MDAEnabled) &&
+      (a.forwarding == b.forwarding) &&
+      (a.beaconTimingReport == b.beaconTimingReport) &&
+      (a.TBTTAdjustment == b.TBTTAdjustment) &&
+      (a.powerSaveLevel == b.powerSaveLevel)
+      );
+}
+bool operator== (const IeConfiguration & a, const IeConfiguration & b)
+{
+  return (
+      (a.m_APSId == b.m_APSId) &&
+      (a.m_APSMId == b.m_APSMId) &&
+      (a.m_CCMId == b.m_CCMId) &&
+      (a.m_CP == b.m_CP) &&
+      (a.m_meshCap == b.m_meshCap)
+      );
+}
+#ifdef RUN_SELF_TESTS
+
+/// Built-in self test for IePreq
+struct IeConfigurationBist : public Test 
+{
+  IeConfigurationBist () : Test ("Mesh/802.11s/IE/Configuration") {}
+  virtual bool RunTests(); 
+};
+
+/// Test instance
+static IeConfigurationBist g_IeConfigurationBist;
+
+bool IeConfigurationBist::RunTests ()
+{
+  bool result(true);
+  IeConfiguration a;
+  Ptr<Packet> packet = Create<Packet> ();
+  packet->AddHeader (a);
+  IeConfiguration b;
+  packet->RemoveHeader (b);
+  NS_TEST_ASSERT_EQUAL (a, b);
+  // test FindFirst()
+  packet->AddHeader (a);
+  IeConfiguration c;
+  bool ok = c.FindFirst(packet);
+  NS_TEST_ASSERT (ok);
+  NS_TEST_ASSERT_EQUAL (a, c);
+
+  return result;
+}
+#endif
 } // namespace dot11s
 } //namespace ns3
 
--- a/src/devices/mesh/dot11s/ie-dot11s-configuration.h	Wed Apr 08 18:17:33 2009 +0400
+++ b/src/devices/mesh/dot11s/ie-dot11s-configuration.h	Wed Apr 08 20:58:40 2009 +0400
@@ -80,8 +80,8 @@
   bool beaconTimingReport;
   bool TBTTAdjustment;
   bool powerSaveLevel;
-
   bool Is (uint16_t cap,uint8_t n) const;
+  friend bool operator== (const dot11sMeshCapability & a, const dot11sMeshCapability & b);
 };
 
 /**
@@ -111,6 +111,7 @@
   void SerializeInformation (Buffer::Iterator i) const;
   uint8_t DeserializeInformation (Buffer::Iterator i, uint8_t length);
   void PrintInformation (std::ostream& os) const;
+private:
   /** Active Path Selection Protocol ID */
   dot11sPathSelectionProtocol m_APSId;
   /** Active Path Metric ID */
@@ -120,8 +121,10 @@
   /* Channel Precedence */
   dot11sChannelPrecedence m_CP;
   dot11sMeshCapability m_meshCap;
+  friend bool operator== (const IeConfiguration & a, const IeConfiguration & b);
 };
-  
+bool operator== (const IeConfiguration & a, const IeConfiguration & b);
+bool operator== (const dot11sMeshCapability & a, const dot11sMeshCapability & b);
 } // namespace dot11s
 } //namespace ns3
 #endif
--- a/src/devices/mesh/dot11s/ie-dot11s-peer-management.cc	Wed Apr 08 18:17:33 2009 +0400
+++ b/src/devices/mesh/dot11s/ie-dot11s-peer-management.cc	Wed Apr 08 20:58:40 2009 +0400
@@ -22,8 +22,8 @@
 
 #include "ie-dot11s-peer-management.h"
 #include "ns3/assert.h"
-
-
+#include "ns3/test.h"
+#include "ns3/packet.h"
 //NS_LOG_COMPONENT_DEFINE ("MeshPeerLinkManagementelement");
 
 namespace ns3 {
@@ -138,7 +138,74 @@
 {
   //TODO
 }
-  
+bool operator== (const IePeerManagement & a, const IePeerManagement & b)
+{
+  return (
+      (a.m_length == b.m_length) &&
+      (a.m_subtype == b.m_subtype) &&
+      (a.m_localLinkId == b.m_localLinkId) &&
+      (a.m_peerLinkId == b.m_peerLinkId) &&
+      (a.m_reasonCode == b.m_reasonCode)
+      );
+}
+#ifdef RUN_SELF_TESTS  
+struct IePeerManagementBist : public Test 
+{
+  IePeerManagementBist () : Test ("Mesh/802.11s/IE/PeerManagement") {}
+  virtual bool RunTests(); 
+};
+
+/// Test instance
+static IePeerManagementBist g_IePerrBist;
+
+bool IePeerManagementBist::RunTests ()
+{
+  bool result(true);
+  {
+    IePeerManagement a;
+    a.SetPeerOpen (1);
+    Ptr<Packet> packet = Create<Packet> ();
+    packet->AddHeader(a);
+    IePeerManagement b;
+    packet->RemoveHeader(b);
+    NS_TEST_ASSERT_EQUAL (a, b);
+    packet->AddHeader (a);
+    IePeerManagement c;
+    bool ok = c.FindFirst(packet);
+    NS_TEST_ASSERT (ok);
+    NS_TEST_ASSERT_EQUAL (a, c);
+  }
+  {
+    IePeerManagement a;
+    a.SetPeerConfirm (1,2);
+    Ptr<Packet> packet = Create<Packet> ();
+    packet->AddHeader(a);
+    IePeerManagement b;
+    packet->RemoveHeader(b);
+    NS_TEST_ASSERT_EQUAL (a, b);
+    packet->AddHeader (a);
+    IePeerManagement c;
+    bool ok = c.FindFirst(packet);
+    NS_TEST_ASSERT (ok);
+    NS_TEST_ASSERT_EQUAL (a, c);
+  }
+  {
+    IePeerManagement a;
+    a.SetPeerClose (1, 2, REASON11S_MESH_CONFIGURATION_POLICY_VIOLATION);
+    Ptr<Packet> packet = Create<Packet> ();
+    packet->AddHeader(a);
+    IePeerManagement b;
+    packet->RemoveHeader(b);
+    NS_TEST_ASSERT_EQUAL (a, b);
+    packet->AddHeader (a);
+    IePeerManagement c;
+    bool ok = c.FindFirst(packet);
+    NS_TEST_ASSERT (ok);
+    NS_TEST_ASSERT_EQUAL (a, c);
+  }
+  return result;
+}
+#endif
 } // namespace dot11s
 } //namespace ns3
 
--- a/src/devices/mesh/dot11s/ie-dot11s-peer-management.h	Wed Apr 08 18:17:33 2009 +0400
+++ b/src/devices/mesh/dot11s/ie-dot11s-peer-management.h	Wed Apr 08 20:58:40 2009 +0400
@@ -93,8 +93,9 @@
    * Present only within close frame
    */
   PmpReasonCode m_reasonCode;
+  friend bool operator== (const IePeerManagement & a, const IePeerManagement & b);
 };
-
+bool operator== (const IePeerManagement & a, const IePeerManagement & b);
 } // namespace dot11s
 } //namespace ns3
 #endif
--- a/src/devices/mesh/dot11s/ie-dot11s-perr.cc	Wed Apr 08 18:17:33 2009 +0400
+++ b/src/devices/mesh/dot11s/ie-dot11s-perr.cc	Wed Apr 08 20:58:40 2009 +0400
@@ -22,7 +22,8 @@
 #include "ie-dot11s-perr.h"
 #include "ns3/address-utils.h"
 #include "ns3/node.h"
-
+#include "ns3/packet.h"
+#include "ns3/test.h"
 namespace ns3 {
 namespace dot11s {
 IePerr::~IePerr ()
@@ -142,6 +143,63 @@
   m_numOfDest = 0;
   m_addressUnits.clear ();
 }
+bool operator== (const IePerr & a, const IePerr & b)
+{
+  if(a.m_numOfDest != b.m_numOfDest)
+    return false;
+  for(unsigned int i = 0; i < a.m_addressUnits.size(); i ++)
+  {
+    if(a.m_addressUnits[i].destination != b.m_addressUnits[i].destination)
+      return false;
+    if(a.m_addressUnits[i].seqnum != b.m_addressUnits[i].seqnum)
+      return false;
+  }
+  return true;
+}
+#ifdef RUN_SELF_TESTS
+
+/// Built-in self test for IePreq
+struct IePerrBist : public Test 
+{
+  IePerrBist () : Test ("Mesh/802.11s/IE/PERR") {}
+  virtual bool RunTests(); 
+};
+
+/// Test instance
+static IePerrBist g_IePerrBist;
+
+bool IePerrBist::RunTests ()
+{
+  bool result(true);
+  // create test information element
+  IePerr a;
+  IePerr::FailedDestination dest;
+  dest.destination = Mac48Address("11:22:33:44:55:66");
+  dest.seqnum = 1;
+  a.AddAddressUnit(dest);
+  dest.destination = Mac48Address("10:20:30:40:50:60");
+  dest.seqnum = 2;
+  a.AddAddressUnit(dest);
+  dest.destination = Mac48Address("01:02:03:04:05:06");
+  dest.seqnum = 3;
+  a.AddAddressUnit(dest);
+  Ptr<Packet> packet = Create<Packet> ();
+  packet->AddHeader (a);
+  IePerr b;
+  packet->RemoveHeader (b);
+  NS_TEST_ASSERT_EQUAL (a, b);
+  b.Merge(a);
+  NS_TEST_ASSERT_EQUAL (a, b);
+  // test FindFirst()
+  packet->AddHeader (a);
+  IePerr c;
+  bool ok = c.FindFirst(packet);
+  NS_TEST_ASSERT (ok);
+  NS_TEST_ASSERT_EQUAL (a, c);
+  return result;
+}
+
+#endif // RUN_SELF_TESTS
 
 } // namespace dot11s
 } //namespace ns3
--- a/src/devices/mesh/dot11s/ie-dot11s-perr.h	Wed Apr 08 18:17:33 2009 +0400
+++ b/src/devices/mesh/dot11s/ie-dot11s-perr.h	Wed Apr 08 20:58:40 2009 +0400
@@ -58,10 +58,12 @@
   uint8_t  DeserializeInformation (Buffer::Iterator start, uint8_t length);
   void PrintInformation (std::ostream& os) const;
   uint8_t  GetInformationSize () const;
+private:
   uint8_t   m_numOfDest;
   std::vector<FailedDestination> m_addressUnits;
+  friend bool operator== (const IePerr & a, const IePerr & b);
 };
-  
+  bool operator== (const IePerr & a, const IePerr & b);
 } // namespace dot11s
 } //namespace ns3
 #endif
--- a/src/devices/mesh/dot11s/ie-dot11s-prep.cc	Wed Apr 08 18:17:33 2009 +0400
+++ b/src/devices/mesh/dot11s/ie-dot11s-prep.cc	Wed Apr 08 20:58:40 2009 +0400
@@ -23,6 +23,8 @@
 #include "ns3/address-utils.h"
 #include "ns3/node.h"
 #include "ns3/assert.h"
+#include "ns3/test.h"
+#include "ns3/packet.h"
 namespace ns3 {
 namespace dot11s {
 /********************************
@@ -203,13 +205,70 @@
     +1; //destination count
   return retval;
 };
-
 void
 IePrep::PrintInformation (std::ostream& os) const
 {
   //TODO
 }
+bool operator== (const IePrep & a, const IePrep & b)
+{
+  return (
+      (a.m_flags == b.m_flags) &&
+      (a.m_hopcount == b.m_hopcount) &&
+      (a.m_ttl == b.m_ttl) &&
+      (a.m_destinationAddress == b.m_destinationAddress) &&
+      (a.m_destSeqNumber == b.m_destSeqNumber) && 
+      (a.m_lifetime == b.m_lifetime) &&
+      (a.m_metric == b.m_metric) &&
+      (a.m_originatorAddress == b.m_originatorAddress) &&
+      (a.m_originatorSeqNumber == b.m_originatorSeqNumber)
+      );
+}
+
+#ifdef RUN_SELF_TESTS
+
+/// Built-in self test for IePrep
+struct IePrepBist : public Test 
+{
+  IePrepBist () : Test ("Mesh/802.11s/IE/PREP") {};
+  virtual bool RunTests(); 
+};
+
+/// Test instance
+static IePrepBist g_IePrepBist;
+
+bool IePrepBist::RunTests ()
+{
+  bool result(true);
   
+  // create test information element
+  IePrep a;
+  a.SetFlags (12);
+  a.SetHopcount (11);
+  a.SetTtl (10);
+  a.SetDestinationAddress (Mac48Address("11:22:33:44:55:66"));
+  a.SetDestinationSeqNumber (123);
+  a.SetLifetime (5000);
+  a.SetMetric (4321);
+  a.SetOriginatorAddress (Mac48Address("33:00:22:00:11:00"));
+  a.SetOriginatorSeqNumber (666);
+  // test roundtrip serialization
+  Ptr<Packet> packet = Create<Packet> ();
+  packet->AddHeader (a);
+  IePrep b;
+  packet->RemoveHeader (b);
+  NS_TEST_ASSERT_EQUAL (a, b);
+  // test FindFirst()
+  packet->AddHeader (a);
+  IePrep c;
+  bool ok = c.FindFirst(packet);
+  NS_TEST_ASSERT (ok);
+  NS_TEST_ASSERT_EQUAL (a, c);
+  return result;
+}
+
+#endif // RUN_SELF_TESTS
+ 
 } // namespace dot11s
 } //namespace ns3
 
--- a/src/devices/mesh/dot11s/ie-dot11s-prep.h	Wed Apr 08 18:17:33 2009 +0400
+++ b/src/devices/mesh/dot11s/ie-dot11s-prep.h	Wed Apr 08 20:58:40 2009 +0400
@@ -47,7 +47,7 @@
   void SetLifetime (uint32_t lifetime);
   void SetMetric (uint32_t metric);
   void SetOriginatorAddress (Mac48Address originator_address);
-  void SetOriginatorSeqNumber (uint32_t originator_seg_number);
+  void SetOriginatorSeqNumber (uint32_t originator_seq_number);
  
   uint8_t GetFlags () const;
   uint8_t GetHopcount () const;
@@ -69,6 +69,7 @@
   uint8_t DeserializeInformation (Buffer::Iterator start, uint8_t length);
   uint8_t GetInformationSize () const;
   void PrintInformation (std::ostream& os) const;
+private:
   uint8_t  m_flags;
   uint8_t  m_hopcount;
   uint8_t  m_ttl;
@@ -78,8 +79,9 @@
   uint32_t m_metric;
   Mac48Address m_originatorAddress;
   uint32_t m_originatorSeqNumber;
+  friend bool operator== (const IePrep & a, const IePrep & b);
 };
-  
+bool operator== (const IePrep & a, const IePrep & b); 
 } // namespace dot11s
 } //namespace ns3
 #endif