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
35using namespace ns3;
36
45{
46public:
48 virtual ~WaypointLazyNotifyFalse ();
49
50private:
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
78void
80{
81 Vector pos = m_mob->GetPosition ();
82 NS_TEST_EXPECT_MSG_EQ_TOL (pos.x, expectedXPos, 0.001, "Position not equal");
83}
84
85void
87{
88 // All waypoints (at 10 second intervals) should trigger a course change
89 NS_TEST_EXPECT_MSG_EQ_TOL (m_courseChanges * 10.0, Simulator::Now ().GetSeconds (), 0.001, "Course change not notified correctly");
91}
92
93void
95{
96 m_node = CreateObject<Node> ();
97 m_mob = CreateObject<WaypointMobilityModel> ();
98 // LazyNotify should by default be false
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{
120public:
122 virtual ~WaypointLazyNotifyTrue ();
123
124private:
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
150void
152{
153 Vector pos = m_mob->GetPosition ();
154 NS_TEST_EXPECT_MSG_EQ_TOL (pos.x, expectedXPos, 0.001, "Position not equal");
155}
156
157void
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 (15, Simulator::Now ().GetSeconds (), 0.001, "Course change not notified correctly");
163}
164
165void
167{
168 m_node = CreateObject<Node> ();
169 m_mob = CreateObject<WaypointMobilityModel> ();
170 m_mob->SetAttributeFailSafe ("LazyNotify", BooleanValue (true));
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{
192public:
195
196private:
202 void TestXPosition (Ptr<const WaypointMobilityModel> model, double expectedXPos);
209 virtual void DoRun (void);
215};
216
218 : TestCase ("Test behavior of Waypoint InitialPositionIsWaypoint")
219{
220}
221
223{
224}
225
226void
228{
229 Vector pos = model->GetPosition ();
230 NS_TEST_EXPECT_MSG_EQ_TOL (pos.x, expectedXPos, 0.001, "Position not equal");
231}
232
233void
235{
236 NS_TEST_EXPECT_MSG_EQ (model->WaypointsLeft (), num, "Unexpected number of waypoints left");
237}
238
239void
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{
332public:
335
336private:
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
355void
357{
358 Vector pos = mob->GetPosition ();
359 NS_TEST_EXPECT_MSG_EQ_TOL (pos.x, expectedXPos, 0.001, "Position not equal");
360}
361
362// WaypointMobilityModel tests using the helper
363void
365{
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{
421public:
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
Mobility Test Suite.
Waypoint Initial Position Is Waypoint Test.
virtual void DoRun(void)
Implementation to actually run this TestCase.
Ptr< WaypointMobilityModel > m_mob4
mobility model 4
Ptr< WaypointMobilityModel > m_mob5
mobility model 5
Ptr< WaypointMobilityModel > m_mob2
mobility model 2
Ptr< WaypointMobilityModel > m_mob1
mobility model 1
void TestNumWaypoints(Ptr< const WaypointMobilityModel > model, uint32_t num)
Test number of way points.
void TestXPosition(Ptr< const WaypointMobilityModel > model, double expectedXPos)
Text X position function.
Ptr< WaypointMobilityModel > m_mob3
mobility model 3
Test whether course change notifications occur regardless of calls to Update() position (which are tr...
void CourseChangeCallback(std::string path, Ptr< const MobilityModel > model)
Course change callback.
void TestXPosition(double expectedXPos)
Test X position function.
int m_courseChanges
course changes
virtual void DoRun(void)
Implementation to actually run this TestCase.
Ptr< WaypointMobilityModel > m_mob
modility model
Waypoint Lazy Notify True.
void TestXPosition(double expectedXPos)
Text X position function.
virtual void DoRun(void)
Implementation to actually run this TestCase.
Ptr< WaypointMobilityModel > m_mob
modility model
void CourseChangeCallback(std::string path, Ptr< const MobilityModel > model)
Course change callback.
Waypoint Mobility Model Via Helper Test.
virtual void DoRun(void)
Implementation to actually run this TestCase.
void TestXPosition(Ptr< const WaypointMobilityModel > mob, double expectedXPos)
Text X position function.
AttributeValue implementation for Boolean.
Definition: boolean.h:37
Helper class used to assign positions and mobility models to nodes.
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(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
void SetPositionAllocator(Ptr< PositionAllocator > allocator)
Set the position allocator which will be used to allocate the initial position of every node initiali...
void SetPosition(const Vector &position)
Vector GetPosition(void) const
keep track of a set of node pointers.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
bool SetAttributeFailSafe(std::string name, const AttributeValue &value)
Set a single attribute without raising errors.
Definition: object-base.cc:276
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:470
void AggregateObject(Ptr< Object > other)
Aggregate two Objects together.
Definition: object.cc:252
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:74
encapsulates test code
Definition: test.h:994
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:1188
a (time, location) pair.
Definition: waypoint.h:36
Waypoint-based mobility model.
void AddWaypoint(const Waypoint &waypoint)
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:287
#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:240
#define NS_TEST_EXPECT_MSG_EQ_TOL(actual, limit, tol, msg)
Test that actual and expected (limit) values are equal to plus or minus some tolerance and report if ...
Definition: test.h:491
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1244
static MobilityTestSuite mobilityTestSuite
the test suite
Every class exported by the ns3 library is enclosed in the ns3 namespace.
mobility
Definition: third.py:107