Bug 1941 - [aodv] Remove unnecessary dependency on Application module
authorTommaso Pecorella <tommaso.pecorella@unifi.it>
Fri, 03 Jul 2015 18:12:25 +0200
changeset 11484 a7698ae651ec
parent 11483 36003018211b
child 11485 df37afec1b0f
Bug 1941 - [aodv] Remove unnecessary dependency on Application module
src/aodv/test/aodv-id-cache-test-suite.cc
src/aodv/test/aodv-regression.cc
src/aodv/test/aodv-regression.h
src/aodv/test/bug-772.cc
src/aodv/test/bug-772.h
src/aodv/test/loopback.cc
src/aodv/test/loopback.h
src/aodv/test/tcp-chain-test-0-0.pcap
src/aodv/test/tcp-chain-test-9-0.pcap
src/aodv/test/udp-chain-test-0-0.pcap
src/aodv/test/udp-chain-test-9-0.pcap
src/aodv/wscript
--- a/src/aodv/test/aodv-id-cache-test-suite.cc	Fri Jul 03 18:11:59 2015 +0200
+++ b/src/aodv/test/aodv-id-cache-test-suite.cc	Fri Jul 03 18:12:25 2015 +0200
@@ -37,11 +37,14 @@
 // Tests
 //-----------------------------------------------------------------------------
 /// Unit test for id cache
-struct IdCacheTest : public TestCase
+class IdCacheTest : public TestCase
 {
+public:
   IdCacheTest () : TestCase ("Id Cache"), cache (Seconds (10))
   {}
   virtual void DoRun ();
+
+private:
   void CheckTimeout1 ();
   void CheckTimeout2 ();
   void CheckTimeout3 ();
@@ -93,7 +96,7 @@
 class IdCacheTestSuite : public TestSuite
 {
 public:
-  IdCacheTestSuite () : TestSuite ("routing-id-cache", UNIT)
+  IdCacheTestSuite () : TestSuite ("aodv-routing-id-cache", UNIT)
   {
     AddTestCase (new IdCacheTest, TestCase::QUICK);
   }
--- a/src/aodv/test/aodv-regression.cc	Fri Jul 03 18:11:59 2015 +0200
+++ b/src/aodv/test/aodv-regression.cc	Fri Jul 03 18:12:25 2015 +0200
@@ -20,7 +20,6 @@
 
 #include "aodv-regression.h"
 #include "bug-772.h"
-#include "loopback.h"
 
 #include "ns3/simulator.h"
 #include "ns3/mobility-helper.h"
@@ -32,19 +31,18 @@
 #include "ns3/internet-stack-helper.h"
 #include "ns3/ipv4-address-helper.h"
 #include "ns3/abort.h"
-#include "ns3/udp-echo-helper.h"
 #include "ns3/mobility-model.h"
 #include "ns3/pcap-file.h"
 #include "ns3/aodv-helper.h"
-#include "ns3/v4ping-helper.h"
 #include "ns3/nqos-wifi-mac-helper.h"
 #include "ns3/config.h"
 #include "ns3/pcap-test.h"
 #include "ns3/rng-seed-manager.h"
+#include "ns3/icmpv4.h"
 #include <sstream>
 
 using namespace ns3;
-using namespace aodv;
+
 //-----------------------------------------------------------------------------
 // Test suite
 //-----------------------------------------------------------------------------
@@ -56,17 +54,12 @@
     SetDataDir (NS_TEST_SOURCEDIR);
     // General RREQ-RREP-RRER test case
     AddTestCase (new ChainRegressionTest ("aodv-chain-regression-test"), TestCase::QUICK);
-    /// \internal
-    /// \bugid{606} test case, should crash if bug is not fixed
+    // \bugid{606} test case, should crash if bug is not fixed
     AddTestCase (new ChainRegressionTest ("bug-606-test", Seconds (10), 3, Seconds (1)), TestCase::QUICK);
-    /// \internal
-    /// \bugid{772} UDP test case
+    // \bugid{772} UDP test case
     AddTestCase (new Bug772ChainTest ("udp-chain-test", "ns3::UdpSocketFactory", Seconds (3), 10), TestCase::QUICK);
-    /// \internal
-    /// \bugid{772} TCP test case
+    // \bugid{772} TCP test case
     AddTestCase (new Bug772ChainTest ("tcp-chain-test", "ns3::TcpSocketFactory", Seconds (3), 10), TestCase::QUICK);
-    // Ping loopback test case
-    AddTestCase (new LoopbackTestCase (), TestCase::QUICK);
   }
 } g_aodvRegressionTestSuite;
  
@@ -81,7 +74,8 @@
   m_time (t),
   m_size (size),
   m_step (120),
-  m_arpAliveTimeout (arpAliveTimeout)
+  m_arpAliveTimeout (arpAliveTimeout),
+  m_seq (0)
 {
 }
 
@@ -91,6 +85,35 @@
 }
 
 void
+ChainRegressionTest::SendPing ()
+{
+  if (Simulator::Now () >= m_time)
+    {
+      return;
+    }
+
+  Ptr<Packet> p = Create<Packet> ();
+  Icmpv4Echo echo;
+  echo.SetSequenceNumber (m_seq);
+  m_seq++;
+  echo.SetIdentifier (0);
+
+  Ptr<Packet> dataPacket = Create<Packet> (56);
+  echo.SetData (dataPacket);
+  p->AddHeader (echo);
+  Icmpv4Header header;
+  header.SetType (Icmpv4Header::ECHO);
+  header.SetCode (0);
+  if (Node::ChecksumEnabled ())
+    {
+      header.EnableChecksum ();
+    }
+  p->AddHeader (header);
+  m_socket->Send (p, 0);
+  Simulator::Schedule (Seconds (1), &ChainRegressionTest::SendPing, this);
+}
+
+void
 ChainRegressionTest::DoRun ()
 {
   RngSeedManager::SetSeed (12345);
@@ -173,11 +196,14 @@
   Ipv4InterfaceContainer interfaces = address.Assign (devices);
 
   // 3. Setup ping
-  V4PingHelper ping (interfaces.GetAddress (m_size - 1));
-  ping.SetAttribute ("Verbose", BooleanValue (false)); // don't need verbose ping in regression test
-  ApplicationContainer p = ping.Install (m_nodes->Get (0));
-  p.Start (Seconds (0));
-  p.Stop (m_time);
+  m_socket = Socket::CreateSocket (m_nodes->Get (0), TypeId::LookupByName ("ns3::Ipv4RawSocketFactory"));
+  m_socket->SetAttribute ("Protocol", UintegerValue (1)); // icmp
+  InetSocketAddress src = InetSocketAddress (Ipv4Address::GetAny (), 0);
+  m_socket->Bind (src);
+  InetSocketAddress dst = InetSocketAddress (interfaces.GetAddress (m_size - 1), 0);
+  m_socket->Connect (dst);
+
+  SendPing ();
 
   // 4. write PCAP
   wifiPhy.EnablePcapAll (CreateTempDirFilename (m_prefix));
--- a/src/aodv/test/aodv-regression.h	Fri Jul 03 18:11:59 2015 +0200
+++ b/src/aodv/test/aodv-regression.h	Fri Jul 03 18:12:25 2015 +0200
@@ -23,6 +23,7 @@
 
 #include "ns3/test.h"
 #include "ns3/nstime.h"
+#include "ns3/socket.h"
 #include "ns3/node-container.h"
 
 using namespace ns3;
@@ -177,6 +178,10 @@
   const double m_step;
   /// ARP alive timeout
   const Time m_arpAliveTimeout;
+  /// Socket
+  Ptr<Socket> m_socket;
+  /// Sequence number
+  uint16_t m_seq;
 
   /// Create test topology
   void CreateNodes ();
@@ -186,6 +191,8 @@
   void CheckResults ();
   /// Go
   void DoRun ();
+  /// Send one ping
+  void SendPing ();
 };
 
 #endif /* AODV_REGRESSION_H */
--- a/src/aodv/test/bug-772.cc	Fri Jul 03 18:11:59 2015 +0200
+++ b/src/aodv/test/bug-772.cc	Fri Jul 03 18:12:25 2015 +0200
@@ -33,17 +33,14 @@
 #include "ns3/internet-stack-helper.h"
 #include "ns3/ipv4-address-helper.h"
 #include "ns3/abort.h"
-#include "ns3/udp-echo-helper.h"
 #include "ns3/mobility-model.h"
 #include "ns3/pcap-file.h"
 #include "ns3/aodv-helper.h"
 #include "ns3/v4ping-helper.h"
 #include "ns3/nqos-wifi-mac-helper.h"
 #include "ns3/config.h"
-#include "ns3/on-off-helper.h"
 #include "ns3/inet-socket-address.h"
 #include "ns3/data-rate.h"
-#include "ns3/packet-sink-helper.h"
 #include "ns3/pcap-test.h"
 #include <sstream>
 
@@ -59,8 +56,8 @@
   m_proto (proto),
   m_time (t),
   m_size (size),
-  m_step (120)
-{
+  m_step (120),
+  m_port (9){
 }
 
 Bug772ChainTest::~Bug772ChainTest ()
@@ -69,6 +66,17 @@
 }
 
 void
+Bug772ChainTest::SendData (Ptr<Socket> socket)
+{
+  if (Simulator::Now () < m_time)
+    {
+      socket->Send (Create<Packet> (1000));
+      Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0.125),
+                                      &Bug772ChainTest::SendData, this, socket);
+    }
+}
+
+void
 Bug772ChainTest::DoRun ()
 {
   RngSeedManager::SetSeed (12345);
@@ -144,16 +152,17 @@
   Ipv4InterfaceContainer interfaces = address.Assign (devices);
 
   // 3. Setup UDP source and sink
-  uint16_t port = 9; // Discard port (RFC 863)
-  OnOffHelper onoff (m_proto, Address (InetSocketAddress (interfaces.GetAddress (m_size-1), port)));
-  onoff.SetConstantRate (DataRate (64000));
-  onoff.SetAttribute ("PacketSize", UintegerValue (1000));
-  ApplicationContainer app = onoff.Install (m_nodes->Get (0));
-  app.Start (Seconds (1.0));
-  app.Stop (m_time);
-  PacketSinkHelper sink (m_proto, Address (InetSocketAddress (Ipv4Address::GetAny (), port)));
-  app = sink.Install (m_nodes->Get (m_size - 1));
-  app.Start (Seconds (0.0));
+  m_sendSocket = Socket::CreateSocket (m_nodes->Get (0), TypeId::LookupByName (m_proto));
+  m_sendSocket->Bind ();
+  m_sendSocket->Connect (InetSocketAddress (interfaces.GetAddress (m_size-1), m_port));
+  m_sendSocket->SetAllowBroadcast (true);
+  Simulator::ScheduleWithContext (m_sendSocket->GetNode ()->GetId (), Seconds (1.0),
+                                  &Bug772ChainTest::SendData, this, m_sendSocket);
+
+  m_recvSocket = Socket::CreateSocket (m_nodes->Get (m_size - 1), TypeId::LookupByName (m_proto));
+  m_recvSocket->Bind (InetSocketAddress (Ipv4Address::GetAny (), m_port));
+  m_recvSocket->Listen ();
+  m_recvSocket->ShutdownSend ();
 
   // 4. write PCAP on the first and last nodes only
   wifiPhy.EnablePcap (CreateTempDirFilename (m_prefix), devices.Get (0));
--- a/src/aodv/test/bug-772.h	Fri Jul 03 18:11:59 2015 +0200
+++ b/src/aodv/test/bug-772.h	Fri Jul 03 18:12:25 2015 +0200
@@ -24,6 +24,7 @@
 #include "ns3/test.h"
 #include "ns3/nstime.h"
 #include "ns3/node-container.h"
+#include "ns3/socket.h"
 
 using namespace ns3;
 
@@ -62,6 +63,8 @@
   const uint32_t m_size;
   /// Chain step, meters
   const double m_step;
+  /// port number
+  const uint16_t m_port;
 
   /// Create test topology
   void CreateNodes ();
@@ -71,6 +74,17 @@
   void CheckResults ();
   /// Go
   void DoRun ();
+
+  /// Receiving socket
+  Ptr<Socket> m_recvSocket;
+  /// Transmitting socket
+  Ptr<Socket> m_sendSocket;
+
+  /**
+   * Send data
+   * \param socket the sending socket
+   */
+  void SendData (Ptr<Socket> socket);
 };
 
 #endif /* BUG_772_H */
--- a/src/aodv/test/loopback.cc	Fri Jul 03 18:11:59 2015 +0200
+++ b/src/aodv/test/loopback.cc	Fri Jul 03 18:12:25 2015 +0200
@@ -18,8 +18,10 @@
  * Authors: Pavel Boyko <boyko@iitp.ru>
  */
 
-#include "loopback.h"
+#include "ns3/test.h"
 #include "ns3/simulator.h"
+#include "ns3/socket-factory.h"
+#include "ns3/udp-socket-factory.h"
 #include "ns3/mobility-helper.h"
 #include "ns3/double.h"
 #include "ns3/uinteger.h"
@@ -45,12 +47,66 @@
 namespace aodv
 {
 
-static uint32_t g_count (0);
+/**
+ * \ingroup aodv
+ *
+ * \brief AODV loopback UDP echo test case
+ */
+class LoopbackTestCase : public TestCase
+{
+  uint32_t m_count; //!< number of packet received;
+  Ptr<Socket> m_txSocket;
+  Ptr<Socket> m_echoSocket;
+  Ptr<Socket> m_rxSocket;
+  uint16_t m_echoSendPort;
+  uint16_t m_echoReplyPort;
+
+  void SendData (Ptr<Socket> socket);
+  void ReceivePkt (Ptr<Socket> socket);
+  void EchoData (Ptr<Socket> socket);
+
+public:
+  LoopbackTestCase ();
+  void DoRun ();
+};
+
+LoopbackTestCase::LoopbackTestCase () :
+    TestCase ("UDP Echo 127.0.0.1 test"), m_count (0)
+{
+  m_echoSendPort = 1233;
+  m_echoReplyPort = 1234;
+}
 
-static void 
-PingRtt (std::string context, Time rtt)
+void LoopbackTestCase::ReceivePkt (Ptr<Socket> socket)
+{
+  Ptr<Packet> receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
+
+  m_count ++;
+}
+
+void
+LoopbackTestCase::EchoData (Ptr<Socket> socket)
 {
-  g_count++;
+  Address from;
+  Ptr<Packet> receivedPacket = socket->RecvFrom (std::numeric_limits<uint32_t>::max (), 0, from);
+
+  Ipv4Address src = InetSocketAddress::ConvertFrom (from).GetIpv4 ();
+  Address to = InetSocketAddress (src, m_echoReplyPort);
+
+  receivedPacket->RemoveAllPacketTags ();
+  receivedPacket->RemoveAllByteTags ();
+
+  socket->SendTo (receivedPacket, 0, to);
+}
+
+void
+LoopbackTestCase::SendData (Ptr<Socket> socket)
+{
+  Address realTo = InetSocketAddress (Ipv4Address::GetLoopback (), m_echoSendPort);
+  socket->SendTo (Create<Packet> (123), 0, realTo);
+
+  Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (1.0),
+                                  &LoopbackTestCase::SendData, this, socket);
 }
 
 void
@@ -80,23 +136,49 @@
   address.SetBase ("10.1.1.0", "255.255.255.0");
   Ipv4InterfaceContainer interfaces = address.Assign (devices);
 
-  // Setup ping
-  Ptr<V4Ping> ping = CreateObject<V4Ping> ();
-  ping->SetAttribute ("Remote", Ipv4AddressValue (Ipv4Address::GetLoopback ()));
-  nodes.Get (0)->AddApplication (ping);
-  ping->SetStartTime (Seconds (0));
-  ping->SetStopTime (Seconds (4));
-  Names::Add ("ping", ping);
-  Config::Connect ("/Names/ping/Rtt", MakeCallback (&PingRtt));
+  // Setup echos
+  Ptr<SocketFactory> socketFactory = nodes.Get (0)->GetObject<UdpSocketFactory> ();
+  m_rxSocket = socketFactory->CreateSocket ();
+  m_rxSocket->Bind (InetSocketAddress (Ipv4Address::GetLoopback (), m_echoReplyPort));
+  m_rxSocket->SetRecvCallback (MakeCallback (&LoopbackTestCase::ReceivePkt, this));
+
+  m_echoSocket = socketFactory->CreateSocket ();
+  m_echoSocket->Bind (InetSocketAddress (Ipv4Address::GetLoopback (), m_echoSendPort));
+  m_echoSocket->SetRecvCallback (MakeCallback (&LoopbackTestCase::EchoData, this));
+
+  m_txSocket = socketFactory->CreateSocket ();
+
+  Simulator::ScheduleWithContext (m_txSocket->GetNode ()->GetId (), Seconds (1.0),
+                                  &LoopbackTestCase::SendData, this, m_txSocket);
 
   // Run 
   Simulator::Stop (Seconds (5));
   Simulator::Run ();
+
+  m_txSocket->Close ();
+  m_echoSocket->Close ();
+  m_rxSocket->Close ();
+
   Simulator::Destroy ();
 
   // Check that 4 packets delivered
-  NS_TEST_ASSERT_MSG_EQ (g_count, 4, "Exactly 4 ping replies must be delivered.");
+  NS_TEST_ASSERT_MSG_EQ (m_count, 4, "Exactly 4 echo replies must be delivered.");
 }
 
+//-----------------------------------------------------------------------------
+// Test suite
+//-----------------------------------------------------------------------------
+class AodvLoopbackTestSuite : public TestSuite
+{
+public:
+  AodvLoopbackTestSuite () : TestSuite ("routing-aodv-loopback", SYSTEM)
+  {
+    SetDataDir (NS_TEST_SOURCEDIR);
+    // UDP Echo loopback test case
+    AddTestCase (new LoopbackTestCase (), TestCase::QUICK);
+  }
+} g_aodvLoopbackTestSuite;
+
+
 }
 }
--- a/src/aodv/test/loopback.h	Fri Jul 03 18:11:59 2015 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2010 IITP RAS
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Authors: Pavel Boyko <boyko@iitp.ru>
- */
-
-#ifndef AODV_LOOPBACK_H
-#define AODV_LOOPBACK_H
-#include "ns3/test.h"
-#include <string>
-
-namespace ns3
-{
-namespace aodv
-{
-/**
- * \ingroup aodv
- * 
- * \brief AODV ping 127.0.0.1 test case
- */
-struct LoopbackTestCase : public TestCase
-{
-  LoopbackTestCase () : TestCase ("Ping 127.0.0.1 test") {}
-  /// Run test
-  void DoRun ();
-};
-
-}
-}
-
-#endif /* AODV_LOOPBACK_H */
Binary file src/aodv/test/tcp-chain-test-0-0.pcap has changed
Binary file src/aodv/test/tcp-chain-test-9-0.pcap has changed
Binary file src/aodv/test/udp-chain-test-0-0.pcap has changed
Binary file src/aodv/test/udp-chain-test-9-0.pcap has changed
--- a/src/aodv/wscript	Fri Jul 03 18:11:59 2015 +0200
+++ b/src/aodv/wscript	Fri Jul 03 18:12:25 2015 +0200
@@ -1,7 +1,7 @@
 ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
 
 def build(bld):
-    module = bld.create_ns3_module('aodv', ['internet', 'wifi', 'applications'])
+    module = bld.create_ns3_module('aodv', ['internet', 'wifi'])
     module.includes = '.'
     module.source = [
         'model/aodv-id-cache.cc',