A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
aodv-regression.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2009 IITP RAS
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Authors: Pavel Boyko <boyko@iitp.ru>
19  */
20 
21 #include "aodv-regression.h"
22 #include "bug-772.h"
23 #include "loopback.h"
24 
25 #include "ns3/mesh-helper.h"
26 #include "ns3/simulator.h"
27 #include "ns3/mobility-helper.h"
28 #include "ns3/double.h"
29 #include "ns3/uinteger.h"
30 #include "ns3/string.h"
31 #include "ns3/boolean.h"
32 #include "ns3/yans-wifi-helper.h"
33 #include "ns3/internet-stack-helper.h"
34 #include "ns3/ipv4-address-helper.h"
35 #include "ns3/abort.h"
36 #include "ns3/udp-echo-helper.h"
37 #include "ns3/mobility-model.h"
38 #include "ns3/pcap-file.h"
39 #include "ns3/aodv-helper.h"
40 #include "ns3/v4ping-helper.h"
41 #include "ns3/nqos-wifi-mac-helper.h"
42 #include "ns3/config.h"
43 #include "ns3/pcap-test.h"
44 #include "ns3/rng-seed-manager.h"
45 #include <sstream>
46 
47 namespace ns3 {
48 namespace aodv {
49 //-----------------------------------------------------------------------------
50 // Test suite
51 //-----------------------------------------------------------------------------
53 {
54 public:
55  AodvRegressionTestSuite () : TestSuite ("routing-aodv-regression", SYSTEM)
56  {
57  SetDataDir (NS_TEST_SOURCEDIR);
58  // General RREQ-RREP-RRER test case
59  AddTestCase (new ChainRegressionTest ("aodv-chain-regression-test"));
60  // Bug 606 test case, should crash if bug is not fixed
61  AddTestCase (new ChainRegressionTest ("bug-606-test", Seconds (10), 3, Seconds (1)));
62  // Bug 772 UDP test case
63  AddTestCase (new Bug772ChainTest ("udp-chain-test", "ns3::UdpSocketFactory", Seconds (3), 10));
64  // Bug 772 TCP test case
65  AddTestCase (new Bug772ChainTest ("tcp-chain-test", "ns3::TcpSocketFactory", Seconds (3), 10));
66  // Ping loopback test case
68  }
70 
71 
72 //-----------------------------------------------------------------------------
73 // ChainRegressionTest
74 //-----------------------------------------------------------------------------
75 ChainRegressionTest::ChainRegressionTest (const char * const prefix, Time t, uint32_t size, Time arpAliveTimeout) :
76  TestCase ("AODV chain regression test"),
77  m_nodes (0),
78  m_prefix (prefix),
79  m_time (t),
80  m_size (size),
81  m_step (120),
82  m_arpAliveTimeout (arpAliveTimeout)
83 {
84 }
85 
87 {
88  delete m_nodes;
89 }
90 
91 void
93 {
96  Config::SetDefault ("ns3::ArpCache::AliveTimeout", TimeValue (m_arpAliveTimeout));
97 
98  CreateNodes ();
99  CreateDevices ();
100 
101  // At m_time / 3 move central node away and see what will happen
102  Ptr<Node> node = m_nodes->Get (m_size / 2);
104  Simulator::Schedule (Time (m_time / 3), &MobilityModel::SetPosition, mob, Vector (1e5, 1e5, 1e5));
105 
107  Simulator::Run ();
109 
110  CheckResults ();
111 
112  delete m_nodes, m_nodes = 0;
113 }
114 
115 void
117 {
118  m_nodes = new NodeContainer;
119  m_nodes->Create (m_size);
120  MobilityHelper mobility;
121  mobility.SetPositionAllocator ("ns3::GridPositionAllocator",
122  "MinX", DoubleValue (0.0),
123  "MinY", DoubleValue (0.0),
124  "DeltaX", DoubleValue (m_step),
125  "DeltaY", DoubleValue (0),
126  "GridWidth", UintegerValue (m_size),
127  "LayoutType", StringValue ("RowFirst"));
128  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
129  mobility.Install (*m_nodes);
130 }
131 
132 void
134 {
135  // 1. Setup WiFi
136  int64_t streamsUsed = 0;
138  wifiMac.SetType ("ns3::AdhocWifiMac");
141  Ptr<YansWifiChannel> chan = wifiChannel.Create ();
142  wifiPhy.SetChannel (chan);
143  // This test suite output was originally based on YansErrorRateModel
144  wifiPhy.SetErrorRateModel ("ns3::YansErrorRateModel");
146  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("OfdmRate6Mbps"), "RtsCtsThreshold", StringValue ("2200"));
147  NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, *m_nodes);
148 
149  // Assign fixed stream numbers to wifi and channel random variables
150  streamsUsed += wifi.AssignStreams (devices, streamsUsed);
151  // Assign 6 streams per device
152  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (devices.GetN () * 6), "Stream assignment mismatch");
153  streamsUsed += wifiChannel.AssignStreams (chan, streamsUsed);
154  // Assign 0 streams per channel for this configuration
155  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (devices.GetN () * 6), "Stream assignment mismatch");
156 
157  // 2. Setup TCP/IP & AODV
158  AodvHelper aodv; // Use default parameters here
159  InternetStackHelper internetStack;
160  internetStack.SetRoutingHelper (aodv);
161  internetStack.Install (*m_nodes);
162  streamsUsed += internetStack.AssignStreams (*m_nodes, streamsUsed);
163  // InternetStack uses m_size more streams
164  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (devices.GetN () * 6) + m_size, "Stream assignment mismatch");
165  streamsUsed += aodv.AssignStreams (*m_nodes, streamsUsed);
166  // AODV uses m_size more streams
167  NS_TEST_ASSERT_MSG_EQ (streamsUsed, ((devices.GetN () * 6) + (2*m_size)), "Stream assignment mismatch");
168 
169  Ipv4AddressHelper address;
170  address.SetBase ("10.1.1.0", "255.255.255.0");
171  Ipv4InterfaceContainer interfaces = address.Assign (devices);
172 
173  // 3. Setup ping
174  V4PingHelper ping (interfaces.GetAddress (m_size - 1));
175  ping.SetAttribute ("Verbose", BooleanValue (false)); // don't need verbose ping in regression test
176  ApplicationContainer p = ping.Install (m_nodes->Get (0));
177  p.Start (Seconds (0));
178  p.Stop (m_time);
179 
180  // 4. write PCAP
182 }
183 
184 void
186 {
187  for (uint32_t i = 0; i < m_size; ++i)
188  {
189  NS_PCAP_TEST_EXPECT_EQ (m_prefix << "-" << i << "-0.pcap");
190  }
191 }
192 
193 }
194 }