A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
flame-regression.cc
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: Kirill Andreev <andreev@iitp.ru>
19  */
20 #include "ns3/mesh-helper.h"
21 #include "ns3/simulator.h"
22 #include "ns3/random-variable-stream.h"
23 #include "ns3/rng-seed-manager.h"
24 #include "ns3/mobility-helper.h"
25 #include "ns3/double.h"
26 #include "ns3/uinteger.h"
27 #include "ns3/string.h"
28 #include "ns3/yans-wifi-helper.h"
29 #include "ns3/internet-stack-helper.h"
30 #include "ns3/ipv4-address-helper.h"
31 #include "ns3/abort.h"
32 #include "ns3/pcap-test.h"
33 #include "ns3/udp-echo-helper.h"
34 #include "ns3/mobility-model.h"
35 #include <sstream>
36 
37 #include "flame-regression.h"
38 
39 using namespace ns3;
40 
42 const char * const PREFIX = "flame-regression-test";
43 
44 
45 FlameRegressionTest::FlameRegressionTest () : TestCase ("FLAME regression test"),
46  m_nodes (0),
47  m_time (Seconds (10))
48 {
49 }
50 
51 FlameRegressionTest::~FlameRegressionTest ()
52 {
53  delete m_nodes;
54 }
55 
56 void
58 {
59  RngSeedManager::SetSeed (12345);
60  RngSeedManager::SetRun (7);
61  CreateNodes ();
62  CreateDevices ();
63  InstallApplications ();
64 
65  Simulator::Stop (m_time);
66  Simulator::Run ();
67  Simulator::Destroy ();
68 
69  CheckResults ();
70 
71  delete m_nodes, m_nodes = 0;
72 }
73 
74 void
75 FlameRegressionTest::CreateNodes ()
76 {
77  m_nodes = new NodeContainer;
78  m_nodes->Create (3);
79  MobilityHelper mobility;
80  mobility.SetPositionAllocator ("ns3::GridPositionAllocator",
81  "MinX", DoubleValue (0.0),
82  "MinY", DoubleValue (0.0),
83  "DeltaX", DoubleValue (150),
84  "DeltaY", DoubleValue (0),
85  "GridWidth", UintegerValue (3),
86  "LayoutType", StringValue ("RowFirst"));
87  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
88  mobility.Install (*m_nodes);
89 }
90 
91 void
92 FlameRegressionTest::CreateDevices ()
93 {
94  int64_t streamsUsed = 0;
95  // 1. setup WiFi
96  YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();
97  // This test suite output was originally based on YansErrorRateModel
98  wifiPhy.SetErrorRateModel ("ns3::YansErrorRateModel");
99  YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
100  Ptr<YansWifiChannel> chan = wifiChannel.Create ();
101  wifiPhy.SetChannel (chan);
102  // 2. setup mesh
103  MeshHelper mesh = MeshHelper::Default ();
104  mesh.SetStackInstaller ("ns3::FlameStack");
105  mesh.SetMacType ("RandomStart", TimeValue (Seconds (0.1)));
106  mesh.SetNumberOfInterfaces (1);
107  NetDeviceContainer meshDevices = mesh.Install (wifiPhy, *m_nodes);
108  // Three devices, two streams per device
109  streamsUsed += mesh.AssignStreams (meshDevices, streamsUsed);
110  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (meshDevices.GetN () * 2), "Stream assignment unexpected value");
111  streamsUsed += wifiChannel.AssignStreams (chan, streamsUsed);
112  NS_TEST_ASSERT_MSG_EQ (streamsUsed, (meshDevices.GetN () * 2), "Stream assignment unexpected value");
113  // 3. setup TCP/IP
114  InternetStackHelper internetStack;
115  internetStack.Install (*m_nodes);
116  Ipv4AddressHelper address;
117  address.SetBase ("10.1.1.0", "255.255.255.0");
118  m_interfaces = address.Assign (meshDevices);
119  // 4. write PCAP if needed
120  wifiPhy.EnablePcapAll (CreateTempDirFilename (PREFIX));
121 
122 }
123 void
124 FlameRegressionTest::InstallApplications ()
125 {
126  UdpEchoServerHelper echoServer (9);
127  ApplicationContainer serverApps = echoServer.Install (m_nodes->Get (0));
128  serverApps.Start (Seconds (0.0));
129  serverApps.Stop (m_time);
130  UdpEchoClientHelper echoClient (m_interfaces.GetAddress (0), 9);
131  echoClient.SetAttribute ("MaxPackets", UintegerValue (300));
132  echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.1)));
133  echoClient.SetAttribute ("PacketSize", UintegerValue (20));
134  ApplicationContainer clientApps = echoClient.Install (m_nodes->Get (2));
135  clientApps.Start (Seconds (1.0));
136  clientApps.Stop (m_time);
137 }
138 
139 void
140 FlameRegressionTest::CheckResults ()
141 {
142  for (int i = 0; i < 3; ++i)
143  {
144  NS_PCAP_TEST_EXPECT_EQ (PREFIX << "-" << i << "-1.pcap");
145  }
146 }
147 
holds a vector of ns3::Application pointers.
smart pointer class similar to boost::intrusive_ptr
Definition: ptr.h:59
void SetErrorRateModel(std::string name, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue())
Ptr< YansWifiChannel > Create(void) const
hold variables of type string
Definition: string.h:19
Make it easy to create and manage PHY objects for the yans model.
create an application which sends a udp packet and waits for an echo of this packet ...
aggregate IP/TCP/UDP functionality to existing Nodes.
Time m_time
Simulation time.
encapsulates test code
Definition: test.h:834
void SetNumberOfInterfaces(uint32_t nInterfaces)
Set a number of interfaces in a mesh network.
Definition: mesh-helper.cc:74
uint32_t GetN(void) const
Get the number of Ptr<NetDevice> stored in this container.
void SetChannel(Ptr< YansWifiChannel > channel)
virtual void DoRun()
Implementation to actually run this test case.
Create a server application which waits for input udp packets and sends them back to the original sen...
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
void EnablePcapAll(std::string prefix, bool promiscuous=false)
Enable pcap output on each device (which is of the appropriate type) in the set of all nodes created ...
hold objects of type ns3::Time
Definition: nstime.h:700
Hold an unsigned integer type.
Definition: uinteger.h:46
holds a vector of ns3::NetDevice pointers
Ipv4InterfaceContainer m_interfaces
Needed to install applications.
void Start(Time start)
Arrange for all of the Applications in this container to Start() at the Time given as a parameter...
void SetMacType(std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue())
Definition: mesh-helper.cc:123
keep track of a set of node pointers.
void SetMobilityModel(std::string type, std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue(), std::string n8="", const AttributeValue &v8=EmptyAttributeValue(), std::string n9="", const AttributeValue &v9=EmptyAttributeValue())
void Install(std::string nodeName) const
manage and create wifi channel objects for the yans model.
int64_t AssignStreams(NetDeviceContainer c, int64_t stream)
Definition: mesh-helper.cc:212
void SetStackInstaller(std::string type, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue())
Definition: mesh-helper.cc:46
NodeContainer * m_nodes
XXX It is important to have pointers here.
Helper class used to assign positions and mobility models to nodes.
void Stop(Time stop)
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter...
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
Time Seconds(double seconds)
create ns3::Time instances in units of seconds.
Definition: nstime.h:586
NetDeviceContainer Install(const WifiPhyHelper &phyHelper, NodeContainer c) const
Install 802.11s mesh device & protocols on given node list.
Definition: mesh-helper.cc:79
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
void SetAttribute(std::string name, const AttributeValue &value)
Helper to create IEEE 802.11s mesh networks.
Definition: mesh-helper.h:38
void SetPositionAllocator(Ptr< PositionAllocator > allocator)
Hold an floating point type.
Definition: double.h:41
int64_t AssignStreams(Ptr< YansWifiChannel > c, int64_t stream)
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const