A Discrete-Event Network Simulator
API
building-position-allocator-test.cc
Go to the documentation of this file.
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2011, 2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
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  * Author: Nicola Baldo <nbaldo@cttc.es>
19  */
20 
21 
22 
23 #include "ns3/log.h"
24 #include "ns3/test.h"
25 #include <ns3/building-position-allocator.h>
26 #include <ns3/mobility-building-info.h>
27 #include <ns3/constant-position-mobility-model.h>
28 #include <ns3/mobility-model.h>
29 #include <ns3/building.h>
30 #include <ns3/buildings-helper.h>
31 #include <ns3/mobility-helper.h>
32 #include <ns3/simulator.h>
33 #include <map>
34 
35 using namespace ns3;
36 
37 NS_LOG_COMPONENT_DEFINE ("BuildingPositionAllocatorTest");
38 
39 struct Room
40 {
41  Room (uint32_t xx, uint32_t yy, uint32_t zz);
42  uint32_t x;
43  uint32_t y;
44  uint32_t z;
45 };
46 
47 Room::Room (uint32_t xx, uint32_t yy, uint32_t zz)
48  : x (xx),
49  y (yy),
50  z (zz)
51 {
52 }
53 
54 bool
55 operator < (const Room& a, const Room& b)
56 {
57  return ( (a.x < b.x)
58  || ( (a.x == b.x) && (a.y < b.y) )
59  || ( (a.x == b.x) && (a.y == b.y) && (a.z < b.z) ));
60 }
61 
62 
63 
65 {
66 public:
68 
69 private:
70  virtual void DoRun (void);
71 
72 };
73 
74 
76  : TestCase ("RandomRoom, 12 rooms, 24 nodes")
77 {
78 }
79 
80 void
82 {
83  NS_LOG_FUNCTION (this);
84 
85 
86 
87  NS_LOG_LOGIC ("create building");
88  Ptr<Building> b = CreateObject<Building> ();
89  b->SetBoundaries (Box (1, 3, 1, 4, 1, 3));
90  b->SetNFloors (2);
91  b->SetNRoomsX (2);
92  b->SetNRoomsY (3);
93 
95  nodes.Create (24);
96 
98  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
99  Ptr<PositionAllocator> positionAlloc = CreateObject<RandomRoomPositionAllocator> ();
100  mobility.SetPositionAllocator (positionAlloc);
101  mobility.Install (nodes);
102  BuildingsHelper::Install (nodes);
103 
104  std::map<Room, uint32_t> roomCounter;
105 
106  for (NodeContainer::Iterator it = nodes.Begin (); it != nodes.End (); ++it)
107  {
109  NS_ASSERT_MSG (mm, "no mobility model aggregated to this node");
111  NS_ASSERT_MSG (bmm, "MobilityBuildingInfo has not been aggregated to this node mobility model");
112 
113  NS_TEST_ASSERT_MSG_EQ (bmm->IsIndoor (), true, "node should be indoor");
114  Room r (bmm->GetRoomNumberX (), bmm->GetRoomNumberY (), bmm->GetFloorNumber ());
115  ++(roomCounter[r]);
116 
117  Vector p = mm->GetPosition ();
118  NS_TEST_ASSERT_MSG_GT (p.x, bmm->GetRoomNumberX (), "wrong x value");
119  NS_TEST_ASSERT_MSG_LT (p.x, bmm->GetRoomNumberX () + 1, "wrong x value");
120  NS_TEST_ASSERT_MSG_GT (p.y, bmm->GetRoomNumberY (), "wrong y value");
121  NS_TEST_ASSERT_MSG_LT (p.y, bmm->GetRoomNumberY () + 1, "wrong y value");
122  NS_TEST_ASSERT_MSG_GT (p.z, bmm->GetFloorNumber (), "wrong z value");
123  NS_TEST_ASSERT_MSG_LT (p.z, bmm->GetFloorNumber () + 1, "wrong z value");
124 
125  }
126 
127  for (std::map<Room, uint32_t>::iterator it = roomCounter.begin (); it != roomCounter.end (); ++it)
128  {
129  // random selection is done without replacement until the set of
130  // eligible room is empty, at which point the set is filled
131  // again. Hence with 24 nodes and 12 rooms we expect 2 nodes per room
132  NS_TEST_ASSERT_MSG_EQ (it->second, 2, "expected 2 nodes per room");
133  }
134 
135  NS_TEST_ASSERT_MSG_EQ (roomCounter.size (), 12, "expected 12 rooms allocated");
136 
137  Simulator::Destroy ();
138 }
139 
140 
141 
142 
143 
145 {
146 public:
148 
149 private:
150  virtual void DoRun (void);
151 
152 };
153 
154 
156  : TestCase ("SameRoom 48 nodes")
157 {
158 }
159 
160 void
162 {
163  NS_LOG_FUNCTION (this);
164 
165 
166 
167  NS_LOG_LOGIC ("create building");
168  Ptr<Building> b = CreateObject<Building> ();
169  b->SetBoundaries (Box (-10, -6, 20, 26, -1, 5));
170  b->SetNFloors (2);
171  b->SetNRoomsX (2);
172  b->SetNRoomsY (3);
173 
175  nodes.Create (24);
176 
178  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
179  Ptr<PositionAllocator> positionAlloc = CreateObject<RandomRoomPositionAllocator> ();
180  mobility.SetPositionAllocator (positionAlloc);
181  mobility.Install (nodes);
182  BuildingsHelper::Install (nodes);
183 
184  NodeContainer copyNodes;
185  copyNodes.Create (48);
186  positionAlloc = CreateObject<SameRoomPositionAllocator> (nodes);
187  mobility.SetPositionAllocator (positionAlloc);
188  mobility.Install (copyNodes);
189  BuildingsHelper::Install (copyNodes);
190 
191  std::map<Room, uint32_t> roomCounter;
192 
193  for (NodeContainer::Iterator it = copyNodes.Begin (); it != copyNodes.End (); ++it)
194  {
196  NS_ASSERT_MSG (mm, "no mobility model aggregated to this node");
198  NS_ASSERT_MSG (bmm, "MobilityBuildingInfo has not been aggregated to this node mobility model");
199 
200  NS_TEST_ASSERT_MSG_EQ (bmm->IsIndoor (), true, "node should be indoor");
201  Room r (bmm->GetRoomNumberX (), bmm->GetRoomNumberY (), bmm->GetFloorNumber ());
202  ++(roomCounter[r]);
203  }
204 
205  for (std::map<Room, uint32_t>::iterator it = roomCounter.begin (); it != roomCounter.end (); ++it)
206  {
207 
208  NS_TEST_ASSERT_MSG_EQ (it->second, 4, "expected 4 nodes per room");
209  }
210 
211  NS_TEST_ASSERT_MSG_EQ (roomCounter.size (), 12, "expected 12 rooms allocated");
212 
213  Simulator::Destroy ();
214 }
215 
216 
217 
218 
219 
220 
222 {
223 public:
225 };
226 
227 
229  : TestSuite ("building-position-allocator", UNIT)
230 {
231  NS_LOG_FUNCTION (this);
232 
233  AddTestCase (new RandomRoomPositionAllocatorTestCase, TestCase::QUICK);
234  AddTestCase (new SameRoomPositionAllocatorTestCase, TestCase::QUICK);
235 
236 }
237 
static BuildingPositionAllocatorTestSuite buildingsPositionAllocatorTestSuiteInstance
virtual void DoRun(void)
Implementation to actually run this TestCase.
virtual void DoRun(void)
Implementation to actually run this TestCase.
a 3d box
Definition: box.h:35
bool operator<(const Length &l, const Length &r)
Check if l has a value less than r.
Definition: length.cc:415
mobility buildings information (to be used by mobility models)
Helper class used to assign positions and mobility models to nodes.
Keep track of the current position and velocity of an object.
Vector GetPosition(void) const
keep track of a set of node pointers.
Iterator Begin(void) const
Get an iterator which refers to the first Node in the container.
Iterator End(void) const
Get an iterator which indicates past-the-last Node in the container.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
std::vector< Ptr< Node > >::const_iterator Iterator
Node container iterator.
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:470
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:74
encapsulates test code
Definition: test.h:1154
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:299
A suite of tests to run.
Definition: test.h:1344
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Definition: assert.h:88
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:289
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_TEST_ASSERT_MSG_LT(actual, limit, msg)
Test that an actual value is less than a limit and report and abort if not.
Definition: test.h:809
#define NS_TEST_ASSERT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report and abort if not.
Definition: test.h:166
#define NS_TEST_ASSERT_MSG_GT(actual, limit, msg)
Test that an actual value is greater than a limit and report and abort if not.
Definition: test.h:995
nodes
Definition: first.py:32
Every class exported by the ns3 library is enclosed in the ns3 namespace.
mobility
Definition: third.py:108
Room(uint32_t xx, uint32_t yy, uint32_t zz)