A Discrete-Event Network Simulator
QKDNetSim v2.0 (NS-3 v3.41) @ (+)
API
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
building-position-allocator-test.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011, 2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation;
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16  *
17  * Author: Nicola Baldo <nbaldo@cttc.es>
18  */
19 
20 #include "ns3/log.h"
21 #include "ns3/test.h"
22 #include <ns3/building-position-allocator.h>
23 #include <ns3/building.h>
24 #include <ns3/buildings-helper.h>
25 #include <ns3/constant-position-mobility-model.h>
26 #include <ns3/mobility-building-info.h>
27 #include <ns3/mobility-helper.h>
28 #include <ns3/mobility-model.h>
29 #include <ns3/simulator.h>
30 
31 #include <map>
32 
33 using namespace ns3;
34 
35 NS_LOG_COMPONENT_DEFINE("BuildingPositionAllocatorTest");
36 
48 struct Room
49 {
56  Room(uint32_t xx, uint32_t yy, uint32_t zz);
57  uint32_t x;
58  uint32_t y;
59  uint32_t z;
60 };
61 
62 Room::Room(uint32_t xx, uint32_t yy, uint32_t zz)
63  : x(xx),
64  y(yy),
65  z(zz)
66 {
67 }
68 
69 bool
70 operator<(const Room& a, const Room& b)
71 {
72  return ((a.x < b.x) || ((a.x == b.x) && (a.y < b.y)) ||
73  ((a.x == b.x) && (a.y == b.y) && (a.z < b.z)));
74 }
75 
83 {
84  public:
86 
87  private:
88  void DoRun() override;
89 };
90 
92  : TestCase("RandomRoom, 12 rooms, 24 nodes")
93 {
94 }
95 
96 void
98 {
99  NS_LOG_FUNCTION(this);
100 
101  NS_LOG_LOGIC("create building");
102  Ptr<Building> b = CreateObject<Building>();
103  b->SetBoundaries(Box(1, 3, 1, 4, 1, 3));
104  b->SetNFloors(2);
105  b->SetNRoomsX(2);
106  b->SetNRoomsY(3);
107 
109  nodes.Create(24);
110 
112  mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
113  Ptr<PositionAllocator> positionAlloc = CreateObject<RandomRoomPositionAllocator>();
114  mobility.SetPositionAllocator(positionAlloc);
115  mobility.Install(nodes);
116  BuildingsHelper::Install(nodes);
117 
118  std::map<Room, uint32_t> roomCounter;
119 
120  for (auto it = nodes.Begin(); it != nodes.End(); ++it)
121  {
123  NS_ASSERT_MSG(mm, "no mobility model aggregated to this node");
125  NS_ASSERT_MSG(bmm,
126  "MobilityBuildingInfo has not been aggregated to this node mobility model");
127 
128  NS_TEST_ASSERT_MSG_EQ(bmm->IsIndoor(), true, "node should be indoor");
129  Room r(bmm->GetRoomNumberX(), bmm->GetRoomNumberY(), bmm->GetFloorNumber());
130  ++(roomCounter[r]);
131 
132  Vector p = mm->GetPosition();
133  NS_TEST_ASSERT_MSG_GT(p.x, bmm->GetRoomNumberX(), "wrong x value");
134  NS_TEST_ASSERT_MSG_LT(p.x, bmm->GetRoomNumberX() + 1, "wrong x value");
135  NS_TEST_ASSERT_MSG_GT(p.y, bmm->GetRoomNumberY(), "wrong y value");
136  NS_TEST_ASSERT_MSG_LT(p.y, bmm->GetRoomNumberY() + 1, "wrong y value");
137  NS_TEST_ASSERT_MSG_GT(p.z, bmm->GetFloorNumber(), "wrong z value");
138  NS_TEST_ASSERT_MSG_LT(p.z, bmm->GetFloorNumber() + 1, "wrong z value");
139  }
140 
141  for (auto it = roomCounter.begin(); it != roomCounter.end(); ++it)
142  {
143  // random selection is done without replacement until the set of
144  // eligible room is empty, at which point the set is filled
145  // again. Hence with 24 nodes and 12 rooms we expect 2 nodes per room
146  NS_TEST_ASSERT_MSG_EQ(it->second, 2, "expected 2 nodes per room");
147  }
148 
149  NS_TEST_ASSERT_MSG_EQ(roomCounter.size(), 12, "expected 12 rooms allocated");
150 
151  Simulator::Destroy();
152 }
153 
161 {
162  public:
164 
165  private:
166  void DoRun() override;
167 };
168 
170  : TestCase("SameRoom 48 nodes")
171 {
172 }
173 
174 void
176 {
177  NS_LOG_FUNCTION(this);
178 
179  NS_LOG_LOGIC("create building");
180  Ptr<Building> b = CreateObject<Building>();
181  b->SetBoundaries(Box(-10, -6, 20, 26, -1, 5));
182  b->SetNFloors(2);
183  b->SetNRoomsX(2);
184  b->SetNRoomsY(3);
185 
187  nodes.Create(24);
188 
190  mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
191  Ptr<PositionAllocator> positionAlloc = CreateObject<RandomRoomPositionAllocator>();
192  mobility.SetPositionAllocator(positionAlloc);
193  mobility.Install(nodes);
194  BuildingsHelper::Install(nodes);
195 
196  NodeContainer copyNodes;
197  copyNodes.Create(48);
198  positionAlloc = CreateObject<SameRoomPositionAllocator>(nodes);
199  mobility.SetPositionAllocator(positionAlloc);
200  mobility.Install(copyNodes);
201  BuildingsHelper::Install(copyNodes);
202 
203  std::map<Room, uint32_t> roomCounter;
204 
205  for (auto it = copyNodes.Begin(); it != copyNodes.End(); ++it)
206  {
208  NS_ASSERT_MSG(mm, "no mobility model aggregated to this node");
210  NS_ASSERT_MSG(bmm,
211  "MobilityBuildingInfo has not been aggregated to this node mobility model");
212 
213  NS_TEST_ASSERT_MSG_EQ(bmm->IsIndoor(), true, "node should be indoor");
214  Room r(bmm->GetRoomNumberX(), bmm->GetRoomNumberY(), bmm->GetFloorNumber());
215  ++(roomCounter[r]);
216  }
217 
218  for (auto it = roomCounter.begin(); it != roomCounter.end(); ++it)
219  {
220  NS_TEST_ASSERT_MSG_EQ(it->second, 4, "expected 4 nodes per room");
221  }
222 
223  NS_TEST_ASSERT_MSG_EQ(roomCounter.size(), 12, "expected 12 rooms allocated");
224 
225  Simulator::Destroy();
226 }
227 
235 {
236  public:
238 };
239 
241  : TestSuite("building-position-allocator", UNIT)
242 {
243  NS_LOG_FUNCTION(this);
244 
245  AddTestCase(new RandomRoomPositionAllocatorTestCase, TestCase::QUICK);
246  AddTestCase(new SameRoomPositionAllocatorTestCase, TestCase::QUICK);
247 }
248 
bool operator<(const Room &a, const Room &b)
static BuildingPositionAllocatorTestSuite buildingsPositionAllocatorTestSuiteInstance
Static variable for test initialization.
RandomRoomPositionAllocator TestSuite.
void DoRun() override
Implementation to actually run this TestCase.
void DoRun() override
Implementation to actually run this TestCase.
a 3d box
Definition: box.h:35
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() const
keep track of a set of node pointers.
Iterator End() 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.
Iterator Begin() const
Get an iterator which refers to the first Node in the container.
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
Definition: object.h:471
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:77
encapsulates test code
Definition: test.h:1060
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:301
A suite of tests to run.
Definition: test.h:1256
#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:86
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:282
#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:709
#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:144
#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:874
NodeContainer nodes
Every class exported by the ns3 library is enclosed in the ns3 namespace.
mobility
Definition: third.py:105
Room coordinates.
uint32_t x
X coord.
uint32_t y
Y coord.
uint32_t z
Z coord (floor)
Room(uint32_t xx, uint32_t yy, uint32_t zz)
Constructor.