added data plane test conditions to lte-x2-handover test
authorNicola Baldo <nbaldo@cttc.es>
Mon, 26 Nov 2012 16:25:28 +0100
changeset 9426 2bee1e9f3340
parent 9425 b7eddbdb3a5a
child 9429 5696cb87fb88
child 9430 e8b87593ee5b
added data plane test conditions to lte-x2-handover test
src/lte/test/test-lte-x2-handover.cc
--- a/src/lte/test/test-lte-x2-handover.cc	Fri Nov 23 17:24:02 2012 +0100
+++ b/src/lte/test/test-lte-x2-handover.cc	Mon Nov 26 16:25:28 2012 +0100
@@ -62,7 +62,6 @@
   virtual void DoRun (void);
   void CheckConnected (Ptr<NetDevice> ueDevice, Ptr<NetDevice> enbDevice);
 
-
   uint32_t m_nUes; // number of UEs in the test
   uint32_t m_nDedicatedBearers; // number of UEs in the test
   std::list<HandoverEvent> m_handoverEventList;
@@ -72,6 +71,29 @@
   std::string m_schedulerType;
   Ptr<LteHelper> m_lteHelper;
   Ptr<EpcHelper> m_epcHelper;
+  
+  struct BearerData
+  {
+    uint32_t bid;
+    Ptr<PacketSink> dlSink;
+    Ptr<PacketSink> ulSink;
+    uint32_t dlOldTotalRx;
+    uint32_t ulOldTotalRx;
+  };
+
+  struct UeData
+  {
+    uint32_t id;
+    std::list<BearerData> bearerDataList;
+  };
+
+  void SaveStatsAfterHandover (uint32_t ueIndex);
+  void CheckStatsAWhileAfterHandover (uint32_t ueIndex);
+
+  std::vector<UeData> m_ueDataVector;
+
+  const Time m_maxHoDuration; 
+  const Time m_statsDuration; 
 };
 
 
@@ -94,7 +116,9 @@
     m_handoverEventListName (handoverEventListName),
     m_epc (true),
     m_useUdp (useUdp),
-    m_schedulerType (schedulerType)
+    m_schedulerType (schedulerType),
+    m_maxHoDuration (Seconds (0.1)),
+    m_statsDuration (Seconds (0.5))
 {
 }
 
@@ -102,6 +126,10 @@
 LteX2HandoverTestCase::DoRun ()
 {
   NS_LOG_FUNCTION (this << BuildNameString (m_nUes, m_nDedicatedBearers, m_handoverEventListName, m_useUdp, m_schedulerType));
+
+  Config::SetDefault ("ns3::UdpClient::Interval", TimeValue (MilliSeconds(100)));
+  Config::SetDefault ("ns3::UdpClient::MaxPackets", UintegerValue(1000000));  
+  Config::SetDefault ("ns3::UdpClient::PacketSize", UintegerValue(100));  
   
   m_lteHelper = CreateObject<LteHelper> ();
   m_lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::FriisSpectrumPropagationLossModel"));
@@ -195,7 +223,7 @@
       Ptr<UniformRandomVariable> startTimeSeconds = CreateObject<UniformRandomVariable> ();
       startTimeSeconds->SetAttribute ("Min", DoubleValue (0));
       startTimeSeconds->SetAttribute ("Max", DoubleValue (0.010));
-     
+
       for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
         {
           Ptr<Node> ue = ueNodes.Get (u);
@@ -203,6 +231,8 @@
           Ptr<Ipv4StaticRouting> ueStaticRouting = ipv4RoutingHelper.GetStaticRouting (ue->GetObject<Ipv4> ());
           ueStaticRouting->SetDefaultRoute (m_epcHelper->GetUeDefaultGatewayAddress (), 1);
 
+          UeData ueData;
+     
           for (uint32_t b = 0; b < m_nDedicatedBearers; ++b)
             {
               ++dlPort;
@@ -210,6 +240,7 @@
 
               ApplicationContainer clientApps;
               ApplicationContainer serverApps;
+              BearerData bearerData;
 
               if (m_useUdp)
                 {              
@@ -219,7 +250,10 @@
                       clientApps.Add (dlClientHelper.Install (remoteHost));
                       PacketSinkHelper dlPacketSinkHelper ("ns3::UdpSocketFactory", 
                                                            InetSocketAddress (Ipv4Address::GetAny (), dlPort));
-                      serverApps.Add (dlPacketSinkHelper.Install (ue));
+                      ApplicationContainer sinkContainer = dlPacketSinkHelper.Install (ue);
+                      bearerData.dlSink = sinkContainer.Get (0)->GetObject<PacketSink> ();
+                      serverApps.Add (sinkContainer);
+                      
                     }
                   if (epcUl)
                     {      
@@ -227,7 +261,9 @@
                       clientApps.Add (ulClientHelper.Install (ue));
                       PacketSinkHelper ulPacketSinkHelper ("ns3::UdpSocketFactory", 
                                                            InetSocketAddress (Ipv4Address::GetAny (), ulPort));
-                      serverApps.Add (ulPacketSinkHelper.Install (remoteHost));  
+                      ApplicationContainer sinkContainer = ulPacketSinkHelper.Install (remoteHost);
+                      bearerData.ulSink = sinkContainer.Get (0)->GetObject<PacketSink> ();
+                      serverApps.Add (sinkContainer);  
                     }            
                 }                    
               else // use TCP
@@ -240,7 +276,9 @@
                       clientApps.Add (dlClientHelper.Install (remoteHost));
                       PacketSinkHelper dlPacketSinkHelper ("ns3::TcpSocketFactory", 
                                                            InetSocketAddress (Ipv4Address::GetAny (), dlPort));
-                      serverApps.Add (dlPacketSinkHelper.Install (ue));
+                      ApplicationContainer sinkContainer = dlPacketSinkHelper.Install (ue);
+                      bearerData.dlSink = sinkContainer.Get (0)->GetObject<PacketSink> ();
+                      serverApps.Add (sinkContainer);
                     }
                   if (epcUl)
                     {     
@@ -250,7 +288,9 @@
                       clientApps.Add (ulClientHelper.Install (ue));
                       PacketSinkHelper ulPacketSinkHelper ("ns3::TcpSocketFactory", 
                                                            InetSocketAddress (Ipv4Address::GetAny (), ulPort));
-                      serverApps.Add (ulPacketSinkHelper.Install (remoteHost));
+                      ApplicationContainer sinkContainer = ulPacketSinkHelper.Install (remoteHost);
+                      bearerData.ulSink = sinkContainer.Get (0)->GetObject<PacketSink> ();
+                      serverApps.Add (sinkContainer);  
                     }
                 } // end if (useUdp)
 
@@ -279,7 +319,11 @@
               serverApps.Start (startTime);
               clientApps.Start (startTime);
 
+              ueData.bearerDataList.push_back (bearerData);
+
             } // end for b
+
+          m_ueDataVector.push_back (ueData);
         }
 
     } 
@@ -311,7 +355,7 @@
     }
   
   // schedule handover events and corresponding checks
-  const Time maxHoDuration = Seconds (0.100);
+
   Time stopTime = Seconds (0);  
   for (std::list<HandoverEvent>::iterator hoEventIt = m_handoverEventList.begin ();
        hoEventIt != m_handoverEventList.end ();
@@ -321,12 +365,17 @@
                                     ueDevices.Get (hoEventIt->ueDeviceIndex),
                                     enbDevices.Get (hoEventIt->sourceEnbDeviceIndex),
                                     enbDevices.Get (hoEventIt->targetEnbDeviceIndex));
-      Time hoEndTime = hoEventIt->startTime + maxHoDuration;
+      Time hoEndTime = hoEventIt->startTime + m_maxHoDuration;
       Simulator::Schedule (hoEndTime, 
                            &LteX2HandoverTestCase::CheckConnected, 
                            this, 
                            ueDevices.Get (hoEventIt->ueDeviceIndex), 
                            enbDevices.Get (hoEventIt->targetEnbDeviceIndex));
+      Simulator::Schedule (hoEndTime, &LteX2HandoverTestCase::SaveStatsAfterHandover,
+                           this, hoEventIt->ueDeviceIndex);
+      Time checkStatsAfterHoTime = hoEndTime + m_statsDuration;
+      Simulator::Schedule (checkStatsAfterHoTime, &LteX2HandoverTestCase::CheckStatsAWhileAfterHandover, 
+                           this, hoEventIt->ueDeviceIndex);      
       if (stopTime <= hoEndTime)
         {
           stopTime = hoEndTime + MilliSeconds (1);
@@ -405,6 +454,36 @@
   NS_ASSERT_MSG (ueBearerIt == ueDataRadioBearerMapValue.End (), "too many bearers at UE");  
 }
 
+void 
+LteX2HandoverTestCase::SaveStatsAfterHandover (uint32_t ueIndex)
+{
+  for (std::list<BearerData>::iterator it = m_ueDataVector.at (ueIndex).bearerDataList.begin ();
+       it != m_ueDataVector.at (ueIndex).bearerDataList.end ();
+       ++it)
+    {
+      it->dlOldTotalRx = it->dlSink->GetTotalRx ();
+      it->ulOldTotalRx = it->ulSink->GetTotalRx ();
+    }
+}
+
+void 
+LteX2HandoverTestCase::CheckStatsAWhileAfterHandover (uint32_t ueIndex)
+{        
+  uint32_t b = 1;
+  for (std::list<BearerData>::iterator it = m_ueDataVector.at (ueIndex).bearerDataList.begin ();
+       it != m_ueDataVector.at (ueIndex).bearerDataList.end ();
+       ++it)
+    {
+      uint32_t dlRx = it->dlSink->GetTotalRx () - it->dlOldTotalRx;
+      uint32_t ulRx = it->ulSink->GetTotalRx () - it->ulOldTotalRx;
+      //             udpclient pktsize interval 
+      uint32_t expectedBytes = 100.0 * (0.100 / m_statsDuration.GetSeconds ());
+      //                           tolerance
+      NS_TEST_ASSERT_MSG_GT (dlRx,   0.500 * expectedBytes, "too few RX bytes in DL, ue=" << ueIndex << ", b=" << b);
+      NS_TEST_ASSERT_MSG_GT (ulRx,   0.500 * expectedBytes, "too few RX bytes in UL, ue=" << ueIndex << ", b=" << b);
+      ++b;
+    }
+}
 
 
 class LteX2HandoverTestSuite : public TestSuite