A Discrete-Event Network Simulator
API
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);
95 Simulator::Schedule(Seconds(0.0), &Object::Initialize, 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 {
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));
131 Simulator::Run();
132 Simulator::Destroy();
133}
134
135void
137{
138 std::vector<Ptr<MobilityModel>>::iterator i;
139 for (i = mobilityStack.begin(); i != mobilityStack.end(); ++i)
140 {
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.
227 Simulator::Schedule(Seconds(0.0), &Object::Initialize, m_mobilityModel);
228
229 Ptr<WaypointMobilityModel> mob = DynamicCast<WaypointMobilityModel>(m_mobilityModel);
230 Waypoint m_nextWaypoint(Seconds(m_waypointCounter), Vector(0.0, 0.0, 0.0));
232
233 Simulator::Stop(Seconds((double)m_waypointCount + 2.0));
234 Simulator::Run();
235 Simulator::Destroy();
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));
253 }
254}
255
262{
264 : TestSuite("waypoint-mobility-model", UNIT)
265 {
266 AddTestCase(new WaypointMobilityModelNotifyTest(true), TestCase::QUICK);
267 AddTestCase(new WaypointMobilityModelNotifyTest(false), TestCase::QUICK);
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.
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
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:305
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.
virtual void Update() const
Update the underlying state corresponding to the stored waypoints.
void AddWaypoint(const Waypoint &waypoint)
WaypointMobilityModelTestSuite g_waypointMobilityModelTestSuite
the test suite
Time Now()
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:296
#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:707
Waypoint Mobility Model Test Suite.