From 4f41cb04af73f535a7896c34e885754d2ad28106 Mon Sep 17 00:00:00 2001
From: Tim Schubert <tim.schubert@tu-bs.de>
Date: Fri, 7 Aug 2020 20:30:18 +0200
Subject: [PATCH] Fix address generation in tests

---
 model/isl-mock-channel.cc           |   5 +
 model/leo-mock-channel.cc           |   6 +
 model/mock-channel.cc               | 238 ++++++++++++++--------------
 test/isl-mock-channel-test-suite.cc |  11 +-
 test/leo-mock-channel-test-suite.cc |  72 +--------
 5 files changed, 143 insertions(+), 189 deletions(-)

diff --git a/model/isl-mock-channel.cc b/model/isl-mock-channel.cc
index a7e438c..46c4f6f 100644
--- a/model/isl-mock-channel.cc
+++ b/model/isl-mock-channel.cc
@@ -62,6 +62,11 @@ IslMockChannel::TransmitStart (
   NS_LOG_FUNCTION (this << p << srcId << destAddr << txTime);
   NS_LOG_LOGIC ("UID is " << p->GetUid () << ")");
 
+  if (srcId >= GetNDevices ())
+    {
+      NS_LOG_ERROR ("Source device unknown");
+      return false;
+    }
   Ptr<MockNetDevice> src = DynamicCast<MockNetDevice> (GetDevice (srcId));
   Ptr<MockNetDevice> dst = DynamicCast<MockNetDevice> (GetDevice (destAddr));
 
diff --git a/model/leo-mock-channel.cc b/model/leo-mock-channel.cc
index 46ec5bb..cee2ba5 100644
--- a/model/leo-mock-channel.cc
+++ b/model/leo-mock-channel.cc
@@ -44,6 +44,12 @@ LeoMockChannel::TransmitStart (Ptr<const Packet> p,
   NS_LOG_FUNCTION (this << p << devId << dst << txTime);
 
   // Find devices joined to channel
+  if (devId >= GetNDevices ())
+    {
+      NS_LOG_ERROR ("Source device unknown");
+      return false;
+    }
+
   Ptr<MockNetDevice> srcDev = DynamicCast<MockNetDevice> (GetDevice (devId));
   if (srcDev == 0)
     {
diff --git a/model/mock-channel.cc b/model/mock-channel.cc
index 736aded..4e44332 100644
--- a/model/mock-channel.cc
+++ b/model/mock-channel.cc
@@ -31,30 +31,30 @@ NS_LOG_COMPONENT_DEFINE ("MockChannel");
 NS_OBJECT_ENSURE_REGISTERED (MockChannel);
 
 TypeId
-  MockChannel::GetTypeId (void)
-    {
-      static TypeId tid = TypeId ("ns3::MockChannel")
-    	.SetParent<Channel> ()
-    	.SetGroupName ("Leo")
-    	.AddAttribute ("PropagationDelay",
-                       "A propagation delay model for the channel.",
-                       PointerValue (),
-                       MakePointerAccessor (&MockChannel::m_propagationDelay),
-                       MakePointerChecker<PropagationDelayModel> ())
-    	.AddAttribute ("PropagationLoss",
-                       "A propagation loss model for the channel.",
-                       PointerValue (),
-                       MakePointerAccessor (&MockChannel::m_propagationLoss),
-                       MakePointerChecker<PropagationLossModel> ())
-    	.AddTraceSource ("TxRxMockChannel",
-                     	 "Trace source indicating transmission of packet "
-                     	 "from the MockChannel, used by the Animation "
-                     	 "interface.",
-                     	 MakeTraceSourceAccessor (&MockChannel::m_txrxMock),
-                     	 "ns3::MockChannel::TxRxAnimationCallback")
-  	;
-      return tid;
-    }
+MockChannel::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::MockChannel")
+    .SetParent<Channel> ()
+    .SetGroupName ("Leo")
+    .AddAttribute ("PropagationDelay",
+                   "A propagation delay model for the channel.",
+                   PointerValue (),
+                   MakePointerAccessor (&MockChannel::m_propagationDelay),
+                   MakePointerChecker<PropagationDelayModel> ())
+    .AddAttribute ("PropagationLoss",
+                   "A propagation loss model for the channel.",
+                   PointerValue (),
+                   MakePointerAccessor (&MockChannel::m_propagationLoss),
+                   MakePointerChecker<PropagationLossModel> ())
+    .AddTraceSource ("TxRxMockChannel",
+                     "Trace source indicating transmission of packet "
+                     "from the MockChannel, used by the Animation "
+                     "interface.",
+                     MakeTraceSourceAccessor (&MockChannel::m_txrxMock),
+                     "ns3::MockChannel::TxRxAnimationCallback")
+    ;
+  return tid;
+}
 
 //
 // By default, you get a channel that
@@ -65,132 +65,132 @@ MockChannel::MockChannel() : Channel (), m_link (0)
 }
 
 MockChannel::~MockChannel()
-  {
-  }
+{
+}
 
 bool
-  MockChannel::Detach (uint32_t deviceId)
+MockChannel::Detach (uint32_t deviceId)
+{
+  NS_LOG_FUNCTION (this << deviceId);
+  if (deviceId < m_link.size ())
     {
-      NS_LOG_FUNCTION (this << deviceId);
-      if (deviceId < m_link.size ())
-  	{
-    	  if (!m_link[deviceId]->IsLinkUp ())
-    	    {
-      	      NS_LOG_WARN ("MockChannel::Detach(): Device is already detached (" << deviceId << ")");
-      	      return false;
-    	    }
+      if (!m_link[deviceId]->IsLinkUp ())
+    	{
+      	  NS_LOG_WARN ("MockChannel::Detach(): Device is already detached (" << deviceId << ")");
+      	  return false;
+    	}
 
-    	  m_link[deviceId]->NotifyLinkDown ();
-  	}
-      else
-  	{
-    	  return false;
-  	}
-      return true;
+      m_link[deviceId]->NotifyLinkDown ();
     }
+  else
+    {
+      return false;
+    }
+  return true;
+}
 
 int32_t
-  MockChannel::Attach (Ptr<MockNetDevice> device)
-    {
-      NS_LOG_FUNCTION (this << device);
-      NS_ASSERT (device != 0);
-      m_link.push_back(device);
-      return  m_link.size() - 1;
-    }
+MockChannel::Attach (Ptr<MockNetDevice> device)
+{
+  NS_LOG_FUNCTION (this << device);
+  NS_ASSERT (device != 0);
+  m_link.push_back(device);
+  return  m_link.size() - 1;
+}
 
 std::size_t
-  MockChannel::GetNDevices (void) const
-    {
-      NS_LOG_FUNCTION_NOARGS ();
-      return m_link.size ();
-    }
+MockChannel::GetNDevices (void) const
+{
+  NS_LOG_FUNCTION_NOARGS ();
+  return m_link.size ();
+}
 
 Ptr<NetDevice>
-  MockChannel::GetDevice (std::size_t i) const
-    {
-      NS_LOG_FUNCTION_NOARGS ();
-      return m_link[i];
-    }
+MockChannel::GetDevice (std::size_t i) const
+{
+  NS_LOG_FUNCTION_NOARGS ();
+  return m_link[i];
+}
 
 Time
-  MockChannel::GetPropagationDelay (Ptr<MobilityModel> srcMob, Ptr<MobilityModel> dstMob, Time txTime) const
-    {
-      NS_LOG_FUNCTION (this << srcMob << dstMob << txTime);
+MockChannel::GetPropagationDelay (Ptr<MobilityModel> srcMob, Ptr<MobilityModel> dstMob, Time txTime) const
+{
+  NS_LOG_FUNCTION (this << srcMob << dstMob << txTime);
 
-      if (GetPropagationDelay ())
-    	{
-      	  Time propagationDelay = m_propagationDelay->GetDelay (srcMob, dstMob);
-      	  return propagationDelay;
-    	}
-      else
-    	{
-      	  return Time (0);
-    	}
+  if (GetPropagationDelay ())
+    {
+      Time propagationDelay = m_propagationDelay->GetDelay (srcMob, dstMob);
+      return propagationDelay;
     }
+  else
+    {
+      return Time (0);
+    }
+}
 
 // TODO optimize
 Ptr<MockNetDevice>
-  MockChannel::GetDevice (Address &addr) const
+MockChannel::GetDevice (Address &addr) const
+{
+  for (Ptr<MockNetDevice> dev : m_link)
     {
-      for (Ptr<MockNetDevice> dev : m_link)
-  	{
-    	  if (dev->GetAddress () == addr)
-    	    {
-      	      return dev;
-    	    }
-  	}
-
-      return 0;
+      if (dev->GetAddress () == addr)
+    	{
+      	  return dev;
+    	}
     }
 
+  return 0;
+}
+
 Ptr<PropagationDelayModel>
-  MockChannel::GetPropagationDelay () const
-    {
-      return m_propagationDelay;
-    }
+MockChannel::GetPropagationDelay () const
+{
+  return m_propagationDelay;
+}
 
 Ptr<PropagationLossModel>
-  MockChannel::GetPropagationLoss () const
-    {
-      return m_propagationLoss;
-    }
+MockChannel::GetPropagationLoss () const
+{
+  return m_propagationLoss;
+}
 
 bool
-  MockChannel::Deliver (
-    			Ptr<const Packet> p,
-    			Ptr<MockNetDevice> src,
-    			Ptr<MockNetDevice> dst,
-    			Time txTime)
+MockChannel::Deliver (
+    		    Ptr<const Packet> p,
+    		    Ptr<MockNetDevice> src,
+    		    Ptr<MockNetDevice> dst,
+    		    Time txTime)
+{
+  NS_LOG_FUNCTION (this << p << src->GetAddress () << dst->GetAddress () << txTime);
+  Time delay = txTime;
+
+  Ptr<MobilityModel> srcMob = src->GetObject<MobilityModel> ();
+  Ptr<MobilityModel> dstMob = dst->GetObject<MobilityModel> ();
+
+  if (srcMob != 0 && dstMob != 0)
     {
-      NS_LOG_FUNCTION (this << p << src->GetAddress () << dst->GetAddress () << txTime);
-      Time delay = txTime;
-
-      Ptr<MobilityModel> srcMob = src->GetObject<MobilityModel> ();
-      Ptr<MobilityModel> dstMob = dst->GetObject<MobilityModel> ();
-
-      if (srcMob != 0 && dstMob != 0)
+      Ptr<PropagationLossModel> pLoss = GetPropagationLoss ();
+      if (pLoss != 0)
     	{
-      	  Ptr<PropagationLossModel> pLoss = GetPropagationLoss ();
-      	  if (pLoss != 0)
+      	  if (pLoss->CalcRxPower (1.0, srcMob, dstMob) == 0.0)
     	    {
-      	      if (pLoss->CalcRxPower (1.0, srcMob, dstMob) == 0.0)
-    	    	{
-      	      	  return false;
-    	    	}
+      	      return false;
     	    }
-      	  delay += GetPropagationDelay (srcMob, dstMob, txTime);
     	}
-
-      Simulator::ScheduleWithContext (dst->GetNode ()->GetId (),
-        			      delay,
-        			      &MockNetDevice::Receive,
-        			      dst,
-        			      p->Copy (),
-        			      src);
-
-      // Call the tx anim callback on the net device
-      m_txrxMock (p, src, dst, txTime, delay);
-      return true;
+      delay += GetPropagationDelay (srcMob, dstMob, txTime);
     }
 
+  Simulator::ScheduleWithContext (dst->GetNode ()->GetId (),
+        			  delay,
+        			  &MockNetDevice::Receive,
+        			  dst,
+        			  p->Copy (),
+        			  src);
+
+  // Call the tx anim callback on the net device
+  m_txrxMock (p, src, dst, txTime, delay);
+  return true;
+}
+
 } // namespace ns3
diff --git a/test/isl-mock-channel-test-suite.cc b/test/isl-mock-channel-test-suite.cc
index 552ea3a..21b2ba6 100644
--- a/test/isl-mock-channel-test-suite.cc
+++ b/test/isl-mock-channel-test-suite.cc
@@ -22,7 +22,7 @@ private:
 };
 
 IslMockChannelTransmitUnknownTestCase::IslMockChannelTransmitUnknownTestCase ()
-  : TestCase ("Test transmission to unkown destination")
+  : TestCase ("Test transmission to broadcast address")
 {
 }
 
@@ -37,14 +37,13 @@ IslMockChannelTransmitUnknownTestCase::DoRun (void)
   Packet *packet = new Packet ();
   Ptr<Packet> p = Ptr<Packet>(packet);
   Ptr<MockNetDevice> dev = CreateObject<MockNetDevice> ();
+  dev->SetAddress (Mac48Address::Allocate ());
   int32_t srcId = channel->Attach (dev);
-  Address destAddr;
+  Address destAddr = Mac48Address::GetBroadcast ();
   Time txTime;
-  channel->SetAttribute ("PropagationDelay", StringValue ("ns3::ConstantSpeedPropagationDelayModel"));
-  channel->SetAttribute ("PropagationLoss", StringValue ("ns3::IslPropagationLossModel"));
   bool result = channel->TransmitStart (p, srcId, destAddr, txTime);
 
-  NS_TEST_ASSERT_MSG_EQ (result, false, "Unknown destination fails to deliver");
+  NS_TEST_ASSERT_MSG_EQ (result, true, "Broadcast address delivers to all");
 }
 
 class IslMockChannelTransmitKnownTestCase : public TestCase
@@ -81,6 +80,7 @@ IslMockChannelTransmitKnownTestCase::DoRun (void)
   srcNode->AggregateObject (loc);
   Ptr<MockNetDevice> srcDev = CreateObject<MockNetDevice> ();
   srcDev->SetNode (srcNode);
+  srcDev->SetAddress (Mac48Address::Allocate ());
   int32_t srcId = channel->Attach (srcDev);
 
   Ptr<Node> dstNode = CreateObject<Node> ();
@@ -88,6 +88,7 @@ IslMockChannelTransmitKnownTestCase::DoRun (void)
   dstNode->AggregateObject (loc);
   Ptr<MockNetDevice> dstDev = CreateObject<MockNetDevice> ();
   dstDev->SetNode (dstNode);
+  dstDev->SetAddress (Mac48Address::Allocate ());
   channel->Attach (dstDev);
 
   Address destAddr = dstDev->GetAddress ();
diff --git a/test/leo-mock-channel-test-suite.cc b/test/leo-mock-channel-test-suite.cc
index 5a88601..70000b0 100644
--- a/test/leo-mock-channel-test-suite.cc
+++ b/test/leo-mock-channel-test-suite.cc
@@ -36,16 +36,13 @@ LeoMockChannelTransmitUnknownTestCase::DoRun (void)
   Ptr<LeoMockChannel> channel = CreateObject<LeoMockChannel> ();
   Packet *packet = new Packet ();
   Ptr<Packet> p = Ptr<Packet>(packet);
-  Ptr<LeoMockNetDevice> dev = CreateObject<LeoMockNetDevice> ();
-  dev->SetDeviceType (LeoMockNetDevice::GND);
-  int32_t srcId = channel->Attach (dev);
   Address destAddr;
   Time txTime;
   channel->SetAttribute ("PropagationDelay", StringValue ("ns3::ConstantSpeedPropagationDelayModel"));
   channel->SetAttribute ("PropagationLoss", StringValue ("ns3::LeoPropagationLossModel"));
-  bool result = channel->TransmitStart (p, srcId, destAddr, txTime);
+  bool result = channel->TransmitStart (p, 10000, destAddr, txTime);
 
-  NS_TEST_ASSERT_MSG_EQ (result, false, "Unknown destination fails to deliver");
+  NS_TEST_ASSERT_MSG_EQ (result, false, "Unknown source fails to deliver");
 }
 
 class LeoMockChannelTransmitKnownTestCase : public TestCase
@@ -78,28 +75,24 @@ LeoMockChannelTransmitKnownTestCase::DoRun (void)
   Ptr<Packet> p = Ptr<Packet>(packet);
 
   Ptr<Node> srcNode = CreateObject<Node> ();
-  Ptr<ConstantPositionMobilityModel> loc = CreateObject<ConstantPositionMobilityModel> ();
-  srcNode->AggregateObject (loc);
   Ptr<LeoMockNetDevice> srcDev = CreateObject<LeoMockNetDevice> ();
   srcDev->SetNode (srcNode);
-  srcDev->SetAttribute ("MobilityModel", StringValue ("ns3::ConstantPositionMobilityModel"));
   srcDev->SetDeviceType (LeoMockNetDevice::GND);
+  srcDev->SetAddress (Mac48Address::Allocate ());
   int32_t srcId = channel->Attach (srcDev);
 
   Ptr<Node> dstNode = CreateObject<Node> ();
-  loc = CreateObject<ConstantPositionMobilityModel> ();
-  dstNode->AggregateObject (loc);
   Ptr<LeoMockNetDevice> dstDev = CreateObject<LeoMockNetDevice> ();
   dstDev->SetNode (dstNode);
-  dstDev->SetAttribute ("MobilityModel", StringValue ("ns3::WaypointMobilityModel"));
   dstDev->SetDeviceType (LeoMockNetDevice::SAT);
+  dstDev->SetAddress (Mac48Address::Allocate ());
   channel->Attach (dstDev);
 
   Address destAddr = dstDev->GetAddress ();
   Time txTime;
   bool result = channel->TransmitStart (p, srcId, destAddr, txTime);
 
-  NS_TEST_ASSERT_MSG_EQ (result, true, "Known destination delivers");
+  NS_TEST_ASSERT_MSG_EQ (result, true, "Known source delivers");
 }
 
 class LeoMockChannelTransmitSpaceGroundTestCase : public TestCase
@@ -134,15 +127,15 @@ LeoMockChannelTransmitSpaceGroundTestCase::DoRun (void)
   Ptr<Node> srcNode = CreateObject<Node> ();
   Ptr<LeoMockNetDevice> srcDev = CreateObject<LeoMockNetDevice> ();
   srcDev->SetNode (srcNode);
-  srcDev->SetAttribute ("MobilityModel", StringValue ("ns3::WaypointMobilityModel"));
   srcDev->SetDeviceType (LeoMockNetDevice::SAT);
+  srcDev->SetAddress (Mac48Address::Allocate ());
   int32_t srcId = channel->Attach (srcDev);
 
   Ptr<Node> dstNode = CreateObject<Node> ();
   Ptr<LeoMockNetDevice> dstDev = CreateObject<LeoMockNetDevice> ();
   dstDev->SetNode (dstNode);
-  dstDev->SetAttribute ("MobilityModel", StringValue ("ns3::ConstantPositionMobilityModel"));
   dstDev->SetDeviceType (LeoMockNetDevice::GND);
+  dstDev->SetAddress (Mac48Address::Allocate ());
   channel->Attach (dstDev);
 
   Address destAddr = dstDev->GetAddress ();
@@ -152,56 +145,6 @@ LeoMockChannelTransmitSpaceGroundTestCase::DoRun (void)
   NS_TEST_ASSERT_MSG_EQ (result, true, "Space to ground destination delivers");
 }
 
-class LeoMockChannelTransmitSpaceSpaceTestCase : public TestCase
-{
-public:
-  LeoMockChannelTransmitSpaceSpaceTestCase ();
-  virtual ~LeoMockChannelTransmitSpaceSpaceTestCase ();
-
-private:
-  virtual void DoRun (void);
-};
-
-LeoMockChannelTransmitSpaceSpaceTestCase::LeoMockChannelTransmitSpaceSpaceTestCase ()
-  : TestCase ("Test transmission to known destination")
-{
-}
-
-LeoMockChannelTransmitSpaceSpaceTestCase::~LeoMockChannelTransmitSpaceSpaceTestCase ()
-{
-}
-
-void
-LeoMockChannelTransmitSpaceSpaceTestCase::DoRun (void)
-{
-  Ptr<LeoMockChannel> channel = CreateObject<LeoMockChannel> ();
-  channel->SetAttribute ("PropagationDelay", StringValue ("ns3::ConstantSpeedPropagationDelayModel"));
-  channel->SetAttribute ("PropagationLoss", StringValue ("ns3::LeoPropagationLossModel"));
-
-  Packet *packet = new Packet ();
-  Ptr<Packet> p = Ptr<Packet>(packet);
-
-  Ptr<Node> srcNode = CreateObject<Node> ();
-  Ptr<LeoMockNetDevice> srcDev = CreateObject<LeoMockNetDevice> ();
-  srcDev->SetNode (srcNode);
-  srcDev->SetAttribute ("MobilityModel", StringValue ("ns3::WaypointMobilityModel"));
-  srcDev->SetDeviceType (LeoMockNetDevice::SAT);
-  int32_t srcId = channel->Attach (srcDev);
-
-  Ptr<Node> dstNode = CreateObject<Node> ();
-  Ptr<LeoMockNetDevice> dstDev = CreateObject<LeoMockNetDevice> ();
-  dstDev->SetNode (dstNode);
-  dstDev->SetAttribute ("MobilityModel", StringValue ("ns3::WaypointMobilityModel"));
-  dstDev->SetDeviceType (LeoMockNetDevice::SAT);
-  channel->Attach (dstDev);
-
-  Address destAddr = dstDev->GetAddress ();
-  Time txTime;
-  bool result = channel->TransmitStart (p, srcId, destAddr, txTime);
-
-  NS_TEST_ASSERT_MSG_EQ (result, false, "Space to space gets dropped");
-}
-
 class LeoMockChannelTestSuite : public TestSuite
 {
 public:
@@ -215,7 +158,6 @@ LeoMockChannelTestSuite::LeoMockChannelTestSuite ()
   AddTestCase (new LeoMockChannelTransmitUnknownTestCase, TestCase::QUICK);
   AddTestCase (new LeoMockChannelTransmitKnownTestCase, TestCase::QUICK);
   AddTestCase (new LeoMockChannelTransmitSpaceGroundTestCase, TestCase::QUICK);
-  AddTestCase (new LeoMockChannelTransmitSpaceSpaceTestCase, TestCase::QUICK);
 }
 
 // Do not forget to allocate an instance of this TestSuite