A Discrete-Event Network Simulator
API
mobility-test-suite.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright 2010 University of Washington
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  */
19 
20 /*
21  * This test suite is intended to test mobility use cases in general,
22  * as typically used by user programs (i.e. with the helper layer
23  * involved).
24  */
25 
26 #include "ns3/test.h"
27 #include "ns3/boolean.h"
28 #include "ns3/simulator.h"
29 #include "ns3/scheduler.h"
30 #include "ns3/vector.h"
31 #include "ns3/mobility-model.h"
32 #include "ns3/waypoint-mobility-model.h"
33 #include "ns3/mobility-helper.h"
34 
35 using namespace ns3;
36 
45 {
46 public:
48  virtual ~WaypointLazyNotifyFalse ();
49 
50 private:
55  void TestXPosition (double expectedXPos);
61  void CourseChangeCallback (std::string path, Ptr<const MobilityModel> model);
62  virtual void DoRun (void);
66 };
67 
69  : TestCase ("Test behavior when LazyNotify is false"),
70  m_courseChanges (0)
71 {
72 }
73 
75 {
76 }
77 
78 void
80 {
81  Vector pos = m_mob->GetPosition ();
82  NS_TEST_EXPECT_MSG_EQ_TOL_INTERNAL (pos.x, expectedXPos, 0.001, "Position not equal", __FILE__, __LINE__);
83 }
84 
85 void
87 {
88  // All waypoints (at 10 second intervals) should trigger a course change
89  NS_TEST_EXPECT_MSG_EQ_TOL_INTERNAL (m_courseChanges * 10.0, Simulator::Now ().GetSeconds (), 0.001, "Course change not notified correctly", __FILE__, __LINE__);
91 }
92 
93 void
95 {
96  m_node = CreateObject<Node> ();
97  m_mob = CreateObject<WaypointMobilityModel> ();
98  // LazyNotify should by default be false
99  m_node->AggregateObject (m_mob);
100  Waypoint wpt (Seconds (0.0), Vector (0.0, 0.0, 0.0));
101  m_mob->AddWaypoint (wpt);
102  Waypoint wpt2 (Seconds (10.0), Vector (10.0, 10.0, 10.0));
103  m_mob->AddWaypoint (wpt2);
104  Waypoint wpt3 (Seconds (20.0), Vector (20.0, 20.0, 20.0));
105  m_mob->AddWaypoint (wpt3);
106 
107  Simulator::Schedule (Seconds (5.0), &WaypointLazyNotifyFalse::TestXPosition, this, 5);
108  Simulator::Run ();
109  Simulator::Destroy ();
110 }
111 
119 {
120 public:
122  virtual ~WaypointLazyNotifyTrue ();
123 
124 private:
129  void TestXPosition (double expectedXPos);
135  void CourseChangeCallback (std::string path, Ptr<const MobilityModel> model);
136  virtual void DoRun (void);
139 };
140 
142  : TestCase ("Test behavior when LazyNotify is true")
143 {
144 }
145 
147 {
148 }
149 
150 void
152 {
153  Vector pos = m_mob->GetPosition ();
154  NS_TEST_EXPECT_MSG_EQ_TOL_INTERNAL (pos.x, expectedXPos, 0.001, "Position not equal", __FILE__, __LINE__);
155 }
156 
157 void
159 {
160  // This should trigger at time 15 only, since that is the first time that
161  // position is updated due to LazyNotify
162  NS_TEST_EXPECT_MSG_EQ_TOL_INTERNAL (15, Simulator::Now ().GetSeconds (), 0.001, "Course change not notified correctly", __FILE__, __LINE__);
163 }
164 
165 void
167 {
168  m_node = CreateObject<Node> ();
169  m_mob = CreateObject<WaypointMobilityModel> ();
170  m_mob->SetAttributeFailSafe ("LazyNotify", BooleanValue (true));
171  m_node->AggregateObject (m_mob);
172  Waypoint wpt (Seconds (0.0), Vector (0.0, 0.0, 0.0));
173  m_mob->AddWaypoint (wpt);
174  Waypoint wpt2 (Seconds (10.0), Vector (10.0, 10.0, 10.0));
175  m_mob->AddWaypoint (wpt2);
176  Waypoint wpt3 (Seconds (20.0), Vector (20.0, 20.0, 20.0));
177  m_mob->AddWaypoint (wpt3);
178 
179  Simulator::Schedule (Seconds (15.0), &WaypointLazyNotifyTrue::TestXPosition, this, 15);
180  Simulator::Run ();
181  Simulator::Destroy ();
182 }
183 
191 {
192 public:
195 
196 private:
202  void TestXPosition (Ptr<const WaypointMobilityModel> model, double expectedXPos);
208  void TestNumWaypoints (Ptr<const WaypointMobilityModel> model, uint32_t num);
209  virtual void DoRun (void);
215 };
216 
218  : TestCase ("Test behavior of Waypoint InitialPositionIsWaypoint")
219 {
220 }
221 
223 {
224 }
225 
226 void
228 {
229  Vector pos = model->GetPosition ();
230  NS_TEST_EXPECT_MSG_EQ_TOL_INTERNAL (pos.x, expectedXPos, 0.001, "Position not equal", __FILE__, __LINE__);
231 }
232 
233 void
235 {
236  NS_TEST_EXPECT_MSG_EQ (model->WaypointsLeft (), num, "Unexpected number of waypoints left");
237 }
238 
239 void
241 {
242  // Case 1: InitialPositionIsWaypoint == false, and we call SetPosition
243  // without any waypoints added. There should be no waypoints after
244  // time 0
245  m_mob1 = CreateObject<WaypointMobilityModel> ();
246  m_mob1->SetAttributeFailSafe ("InitialPositionIsWaypoint", BooleanValue (false));
247  m_mob1->SetPosition (Vector (10.0, 10.0, 10.0));
248  // At time 1s, there should be no waypoints
249  Simulator::Schedule (Seconds (1.0), &WaypointInitialPositionIsWaypoint::TestNumWaypoints, this, m_mob1, 0);
250  // At time 15s, the model should still be at x position 10.0
251  Simulator::Schedule (Seconds (15.0), &WaypointInitialPositionIsWaypoint::TestXPosition, this, m_mob1, 10.0);
252 
253  // Case 2: InitialPositionIsWaypoint == false, and we call SetPosition
254  // after adding a waypoint.
255  m_mob2 = CreateObject<WaypointMobilityModel> ();
256  m_mob2->SetAttributeFailSafe ("InitialPositionIsWaypoint", BooleanValue (false));
257  Waypoint wpt21 (Seconds (5.0), Vector (15.0, 15.0, 15.0));
258  m_mob2->AddWaypoint (wpt21);
259  Waypoint wpt22 (Seconds (10.0), Vector (20.0, 20.0, 20.0));
260  m_mob2->AddWaypoint (wpt22);
261  m_mob2->SetPosition (Vector (10.0, 10.0, 10.0));
262  // At time 3, no waypoints have been hit, so position should be 10 and
263  // numWaypoints should be 2, or 1 excluding the next one
264  Simulator::Schedule (Seconds (3.0), &WaypointInitialPositionIsWaypoint::TestXPosition, this, m_mob2, 10.0);
265  Simulator::Schedule (Seconds (3.0), &WaypointInitialPositionIsWaypoint::TestNumWaypoints, this, m_mob2, 1);
266  // At time 8, check that X position is 18 (i.e. position is interpolating
267  // between 15 and 20) and there is one waypoint left, but we exclude
268  // the next one so we test for zero waypoints
269  Simulator::Schedule (Seconds (8.0), &WaypointInitialPositionIsWaypoint::TestXPosition, this, m_mob2, 18.0);
270  Simulator::Schedule (Seconds (8.0), &WaypointInitialPositionIsWaypoint::TestNumWaypoints, this, m_mob2, 0);
271 
272  // Case 3: InitialPositionIsWaypoint == true, and we call SetPosition
273  // without any waypoints added.
274  m_mob3 = CreateObject<WaypointMobilityModel> ();
275  m_mob3->SetAttributeFailSafe ("InitialPositionIsWaypoint", BooleanValue (true));
276  m_mob3->SetPosition (Vector (10.0, 10.0, 10.0));
277  // At time 1s, there should be zero waypoints not counting the next one
278  Simulator::Schedule (Seconds (1.0), &WaypointInitialPositionIsWaypoint::TestNumWaypoints, this, m_mob3, 0);
279  // At time 15s, the model should still be at x position 10.0
280  Simulator::Schedule (Seconds (15.0), &WaypointInitialPositionIsWaypoint::TestXPosition, this, m_mob3, 10.0);
281 
282  // Case 4: InitialPositionIsWaypoint == true, and we call SetPosition
283  // after adding a waypoint.
284  m_mob4 = CreateObject<WaypointMobilityModel> ();
285  m_mob4->SetAttributeFailSafe ("InitialPositionIsWaypoint", BooleanValue (true));
286  Waypoint wpt41 (Seconds (5.0), Vector (15.0, 15.0, 15.0));
287  m_mob4->AddWaypoint (wpt41);
288  Waypoint wpt42 (Seconds (10.0), Vector (20.0, 20.0, 20.0));
289  m_mob4->AddWaypoint (wpt42);
290  // Here, SetPosition() is called after waypoints have been added. In
291  // this case, the initial position is set until the time of the first
292  // waypoint, at which time it jumps to the waypoint and begins moving
293  m_mob4->SetPosition (Vector (10.0, 10.0, 10.0));
294  // At time 3, position should be fixed still at 10
295  Simulator::Schedule (Seconds (3.0), &WaypointInitialPositionIsWaypoint::TestXPosition, this, m_mob4, 10.0);
296  Simulator::Schedule (Seconds (3.0), &WaypointInitialPositionIsWaypoint::TestNumWaypoints, this, m_mob4, 1);
297  // At time 6, we should be moving between 15 and 20
298  Simulator::Schedule (Seconds (6.0), &WaypointInitialPositionIsWaypoint::TestXPosition, this, m_mob4, 16.0);
299  // At time 15, we should be fixed at 20
300  Simulator::Schedule (Seconds (15.0), &WaypointInitialPositionIsWaypoint::TestXPosition, this, m_mob4, 20.0);
301 
302  // case 5: If waypoint and SetPosition both called at time 0,
303  // SetPosition takes precedence
304  m_mob5 = CreateObject<WaypointMobilityModel> ();
305  m_mob5->SetAttributeFailSafe ("InitialPositionIsWaypoint", BooleanValue (true));
306  // Note: The below statement would result in a crash, because it would
307  // violate the rule that waypoints must increase in start time
308  // m_mob5->SetPosition (Vector (10.0, 10.0, 10.0));
309  Waypoint wpt51 (Seconds (0.0), Vector (200.0, 200.0, 200.0));
310  m_mob5->AddWaypoint (wpt51);
311  Waypoint wpt52 (Seconds (5.0), Vector (15.0, 15.0, 15.0));
312  m_mob5->AddWaypoint (wpt52);
313  Waypoint wpt53 (Seconds (10.0), Vector (20.0, 20.0, 20.0));
314  m_mob5->AddWaypoint (wpt53);
315  // Here, since waypoints already exist, the below SetPosition will cancel
316  // out wpt51 above, and model will stay at initial position until time 5
317  m_mob5->SetPosition (Vector (10.0, 10.0, 10.0));
318  Simulator::Schedule (Seconds (3.0), &WaypointInitialPositionIsWaypoint::TestXPosition, this, m_mob5, 10.0);
319 
320  Simulator::Run ();
321  Simulator::Destroy ();
322 }
323 
331 {
332 public:
335 
336 private:
342  void TestXPosition (Ptr<const WaypointMobilityModel> mob, double expectedXPos);
343  virtual void DoRun (void);
344 };
345 
347  : TestCase ("Test behavior using MobilityHelper and PositionAllocator")
348 {
349 }
350 
352 {
353 }
354 
355 void
357 {
358  Vector pos = mob->GetPosition ();
359  NS_TEST_EXPECT_MSG_EQ_TOL_INTERNAL (pos.x, expectedXPos, 0.001, "Position not equal", __FILE__, __LINE__);
360 }
361 
362 // WaypointMobilityModel tests using the helper
363 void
365 {
366  NodeContainer c;
367  c.Create (1);
369  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
370  positionAlloc->Add (Vector (0.0, 0.0, 0.0));
371  mobility.SetPositionAllocator (positionAlloc);
372  // When InitialPositionIsWaypoint is false (default), the position
373  // set by the position allocator is ignored. The first waypoint set will
374  // set the initial position (with velocity 0 until first waypoint time)
375  mobility.SetMobilityModel ("ns3::WaypointMobilityModel",
376  "InitialPositionIsWaypoint", BooleanValue (false));
377  mobility.Install (c);
378 
379  // Get back a pointer to this
381  // Waypoint added at time 0 will override initial position
382  Waypoint wpt (Seconds (5.0), Vector (20.0, 20.0, 20.0));
383  Waypoint wpt2 (Seconds (10.0), Vector (10.0, 10.0, 10.0));
384  mob->AddWaypoint (wpt);
385  mob->AddWaypoint (wpt2);
386  // At time 3 (before first waypoint, position is 20
387  Simulator::Schedule (Seconds (3), &WaypointMobilityModelViaHelper::TestXPosition, this, mob, 20);
388  // At time 7.5 (midway between points 1 and 2, position is 15
389  Simulator::Schedule (Seconds (7.5), &WaypointMobilityModelViaHelper::TestXPosition, this, mob, 15);
390 
391  // When InitialPositionIsWaypoint is true, the position allocator creates
392  // the first waypoint, and movement occurs between this origin and the
393  // initial waypoint below at 5 seconds
394  NodeContainer c2;
395  c2.Create (1);
396  MobilityHelper mobility2;
397  Ptr<ListPositionAllocator> positionAlloc2 = CreateObject<ListPositionAllocator> ();
398  positionAlloc2->Add (Vector (0.0, 0.0, 0.0));
399  mobility2.SetPositionAllocator (positionAlloc2);
400  mobility2.SetMobilityModel ("ns3::WaypointMobilityModel",
401  "InitialPositionIsWaypoint", BooleanValue (true));
402  mobility2.Install (c2);
404  Waypoint wpt3 (Seconds (5.0), Vector (20.0, 20.0, 20.0));
405  mob2->AddWaypoint (wpt3);
406  // Move to position 12 at 3 seconds
407  Simulator::Schedule (Seconds (3), &WaypointMobilityModelViaHelper::TestXPosition, this, mob2, 12);
408 
409  Simulator::Run ();
410  Simulator::Destroy ();
411 }
412 
420 {
421 public:
423 };
424 
426  : TestSuite ("mobility", UNIT)
427 {
428  AddTestCase (new WaypointLazyNotifyFalse, TestCase::QUICK);
429  AddTestCase (new WaypointLazyNotifyTrue, TestCase::QUICK);
430  AddTestCase (new WaypointInitialPositionIsWaypoint, TestCase::QUICK);
431  AddTestCase (new WaypointMobilityModelViaHelper, TestCase::QUICK);
432 }
433 
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:73
Test whether course change notifications occur regardless of calls to Update() position (which are tr...
AttributeValue implementation for Boolean.
Definition: boolean.h:36
void CourseChangeCallback(std::string path, Ptr< const MobilityModel > model)
Course change callback.
void TestXPosition(Ptr< const WaypointMobilityModel > model, double expectedXPos)
Text X position function.
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:459
A suite of tests to run.
Definition: test.h:1342
void AddWaypoint(const Waypoint &waypoint)
Waypoint Initial Position Is Waypoint Test.
void AggregateObject(Ptr< Object > other)
Aggregate two Objects together.
Definition: object.cc:252
Waypoint Mobility Model Via Helper Test.
#define NS_TEST_EXPECT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report if not.
Definition: test.h:285
Ptr< WaypointMobilityModel > m_mob5
mobility model 5
Vector GetPosition(void) const
Ptr< WaypointMobilityModel > m_mob3
mobility model 3
bool SetAttributeFailSafe(std::string name, const AttributeValue &value)
Set a single attribute without raising errors.
Definition: object-base.cc:205
Ptr< WaypointMobilityModel > m_mob4
mobility model 4
encapsulates test code
Definition: test.h:1155
virtual void DoRun(void)
Implementation to actually run this TestCase.
Ptr< WaypointMobilityModel > m_mob
modility model
virtual void DoRun(void)
Implementation to actually run this TestCase.
void TestNumWaypoints(Ptr< const WaypointMobilityModel > model, uint32_t num)
Test number of way points.
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
tuple mobility
Definition: third.py:101
virtual void DoRun(void)
Implementation to actually run this TestCase.
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:299
void TestXPosition(Ptr< const WaypointMobilityModel > mob, double expectedXPos)
Text X position function.
void TestXPosition(double expectedXPos)
Text X position function.
static MobilityTestSuite mobilityTestSuite
the test suite
virtual void DoRun(void)
Implementation to actually run this TestCase.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
keep track of a set of node pointers.
Mobility Test Suite.
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())
Waypoint Lazy Notify True.
void SetPosition(const Vector &position)
Ptr< WaypointMobilityModel > m_mob1
mobility model 1
Helper class used to assign positions and mobility models to nodes.
#define NS_TEST_EXPECT_MSG_EQ_TOL_INTERNAL(actual, limit, tol, msg, file, line)
Test that actual and expected (limit) values are equal to plus or minus some tolerance and report if ...
Definition: test.h:484
int m_courseChanges
course changes
Ptr< Node > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
void TestXPosition(double expectedXPos)
Test X position function.
Ptr< WaypointMobilityModel > m_mob2
mobility model 2
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:993
void Add(Vector v)
Add a position to the list of positions.
Waypoint-based mobility model.
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:365
Ptr< WaypointMobilityModel > m_mob
modility model
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
void SetPositionAllocator(Ptr< PositionAllocator > allocator)
Set the position allocator which will be used to allocate the initial position of every node initiali...
a (time, location) pair.
Definition: waypoint.h:35
uint32_t WaypointsLeft(void) const
Get the number of waypoints left for this object, excluding the next one.
void CourseChangeCallback(std::string path, Ptr< const MobilityModel > model)
Course change callback.
static void CourseChangeCallback(std::string path, Ptr< const MobilityModel > model)