A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
waypoint-mobility-model-test.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2009 Phillip Sitbon
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: Phillip Sitbon <phillip@sitbon.net>
18 */
19
20#include "ns3/boolean.h"
21#include "ns3/config.h"
22#include "ns3/simulator.h"
23#include "ns3/test.h"
24#include "ns3/waypoint-mobility-model.h"
25
26using namespace ns3;
27
34{
35 public:
42 : TestCase(lazy ? "Check Waypoint Mobility Model LAZY notification accuracy"
43 : "Check Waypoint Mobility Model NON-LAZY notification accuracy"),
44 lazyNotify(lazy)
45 {
46 }
47
49 {
50 }
51
52 private:
53 std::vector<Ptr<MobilityModel>> mobilityStack;
56 std::deque<Waypoint> waypoints;
58 private:
59 void DoRun() override;
60 void DoTeardown() override;
62 void ForceUpdates();
68};
69
70void
72{
73 mobilityStack.clear();
74 waypoints.clear();
75}
76
77void
79{
80 mobilityCount = 1;
81 waypointCount = 100;
82
83 ObjectFactory mobilityFactory;
84 mobilityFactory.SetTypeId("ns3::WaypointMobilityModel");
85 mobilityFactory.Set("LazyNotify", BooleanValue(lazyNotify));
86
87 // Populate the vector of mobility models.
88 for (uint32_t i = 0; i < mobilityCount; i++)
89 {
90 // Create a new mobility model.
91 Ptr<MobilityModel> model = mobilityFactory.Create()->GetObject<MobilityModel>();
92
93 // Add this mobility model to the stack.
94 mobilityStack.push_back(model);
96 }
97
98 Waypoint wpt(Seconds(0.0), Vector(0.0, 0.0, 0.0));
99
100 // Create waypoints
101 for (uint32_t iw = 0; iw < waypointCount; ++iw)
102 {
103 wpt.time += Seconds(1.0);
104 waypoints.push_back(wpt);
105 }
106
107 // Add the same waypoints to each node
108 std::vector<Ptr<MobilityModel>>::iterator i;
109 for (i = mobilityStack.begin(); i != mobilityStack.end(); ++i)
110 {
111 Ptr<WaypointMobilityModel> mob = (*i)->GetObject<WaypointMobilityModel>();
112 mob->TraceConnectWithoutContext(
113 "CourseChange",
115
116 for (std::deque<Waypoint>::iterator w = waypoints.begin(); w != waypoints.end(); ++w)
117 {
118 mob->AddWaypoint(*w);
119 }
120 }
121
122 // Schedule updates at non-waypoint times to make sure lazy notifications don't happen
123 for (double updateTime = 0.5; updateTime <= ((double)waypointCount + 1.5); updateTime += 1.0)
124 {
125 Simulator::Schedule(Seconds(updateTime),
127 this);
128 }
129
130 Simulator::Stop(Seconds((double)waypointCount + 2.0));
133}
134
135void
137{
138 std::vector<Ptr<MobilityModel>>::iterator i;
139 for (i = mobilityStack.begin(); i != mobilityStack.end(); ++i)
140 {
141 Ptr<WaypointMobilityModel> mob = (*i)->GetObject<WaypointMobilityModel>();
142 mob->Update();
143 }
144}
145
146void
148{
149 const Time now = Simulator::Now();
150 const double sec = now.GetSeconds();
152
153 NS_TEST_EXPECT_MSG_EQ(now, mob->m_current.time, "Waypoint time not properly updated");
154
155 if (!lazyNotify)
156 {
157 // All waypoints are on second boundaries only
159 sec - ((double)((int)sec)) + sec,
160 sec,
161 "Course didn't change on one second time boundary with NON-LAZY notifications");
162 }
163 else
164 {
165 // Updates should happen at the times they are forced, in between waypoints.
166 NS_TEST_EXPECT_MSG_EQ(sec - ((double)((int)sec)),
167 0.5,
168 "Course didn't change between waypoints with LAZY notifications");
169 }
170}
171
178{
179 public:
181 : TestCase("Check Waypoint Mobility Model waypoint add")
182 {
183 }
184
186 {
187 }
188
189 private:
194 private:
195 void DoRun() override;
196 void DoTeardown() override;
202};
203
204void
206{
207 m_mobilityModel = nullptr;
208}
209
210void
212{
213 m_waypointCount = 10;
215
216 ObjectFactory mobilityFactory;
217 mobilityFactory.SetTypeId("ns3::WaypointMobilityModel");
218 mobilityFactory.Set("LazyNotify", BooleanValue(false));
219
220 // Create a new mobility model.
221 m_mobilityModel = mobilityFactory.Create()->GetObject<MobilityModel>();
223 "CourseChange",
225
226 // Add this mobility model to the stack.
228
229 Ptr<WaypointMobilityModel> mob = DynamicCast<WaypointMobilityModel>(m_mobilityModel);
230 Waypoint m_nextWaypoint(Seconds(m_waypointCounter), Vector(0.0, 0.0, 0.0));
231 mob->AddWaypoint(m_nextWaypoint);
232
236}
237
238void
240{
241 const Time now = Simulator::Now();
242 Ptr<WaypointMobilityModel> mob = DynamicCast<WaypointMobilityModel>(m_mobilityModel);
243
244 std::cout << now << " CourseChangeCallback" << std::endl;
245
246 NS_TEST_EXPECT_MSG_EQ(now, Seconds(m_waypointCounter), "Waypoint time not properly set");
247
248 if (now < Seconds((double)m_waypointCount))
249 {
251 m_nextWaypoint = Waypoint(Seconds(m_waypointCounter), Vector(0.0, 0.0, 0.0));
252 mob->AddWaypoint(m_nextWaypoint);
253 }
254}
255
262{
264 : TestSuite("waypoint-mobility-model", UNIT)
265 {
269 }
Waypoint Mobility Model Add Waypoint Test.
void DoTeardown() override
Implementation to do any local setup required for this TestCase.
void CourseChangeCallback(Ptr< const MobilityModel > model)
Course change callback.
Ptr< MobilityModel > m_mobilityModel
mobility model
void DoRun() override
Implementation to actually run this TestCase.
Waypoint Mobility Model Notify Test.
void CourseChangeCallback(Ptr< const MobilityModel > model)
Course change callback.
std::deque< Waypoint > waypoints
waypoints
void DoTeardown() override
Implementation to do any local setup required for this TestCase.
void DoRun() override
Implementation to actually run this TestCase.
std::vector< Ptr< MobilityModel > > mobilityStack
mobilty model
WaypointMobilityModelNotifyTest(bool lazy)
Constructor.
AttributeValue implementation for Boolean.
Definition: boolean.h:37
Keep track of the current position and velocity of an object.
bool TraceConnectWithoutContext(std::string name, const CallbackBase &cb)
Connect a TraceSource to a Callback without a context.
Definition: object-base.cc:311
Instantiate subclasses of ns3::Object.
Ptr< Object > Create() const
Create an Object instance of the configured TypeId.
void Set(const std::string &name, const AttributeValue &value, Args &&... args)
Set an attribute to be set during construction.
void SetTypeId(TypeId tid)
Set the TypeId of the Objects to be created by this factory.
void Initialize()
Invoke DoInitialize on all Objects aggregated to this one.
Definition: object.cc:186
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:78
static EventId Schedule(const Time &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Definition: simulator.h:568
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
Definition: simulator.cc:140
static Time Now()
Return the current simulation virtual time.
Definition: simulator.cc:199
static void Run()
Run the simulation.
Definition: simulator.cc:176
static void Stop()
Tell the Simulator the calling event should be the last one executed.
Definition: simulator.cc:184
encapsulates test code
Definition: test.h:1060
@ QUICK
Fast test.
Definition: test.h:1065
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
@ UNIT
This test suite implements a Unit Test.
Definition: test.h:1265
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:105
double GetSeconds() const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:402
a (time, location) pair.
Definition: waypoint.h:36
Time time
The waypoint time.
Definition: waypoint.h:53
Waypoint-based mobility model.
WaypointMobilityModelTestSuite g_waypointMobilityModelTestSuite
the test suite
#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:251
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1336
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Args... > MakeCallback(R(T::*memPtr)(Args...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition: callback.h:702
Waypoint Mobility Model Test Suite.