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 
26 using 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;
54  uint32_t mobilityCount;
55  uint32_t waypointCount;
56  std::deque<Waypoint> waypoints;
57  bool lazyNotify;
58  private:
59  void DoRun() override;
60  void DoTeardown() override;
62  void ForceUpdates();
68 };
69 
70 void
72 {
73  mobilityStack.clear();
74  waypoints.clear();
75 }
76 
77 void
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  {
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();
133 }
134 
135 void
137 {
138  std::vector<Ptr<MobilityModel>>::iterator i;
139  for (i = mobilityStack.begin(); i != mobilityStack.end(); ++i)
140  {
142  mob->Update();
143  }
144 }
145 
146 void
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:
191  uint32_t m_waypointCount;
192  uint32_t m_waypointCounter;
194  private:
195  void DoRun() override;
196  void DoTeardown() override;
202 };
203 
204 void
206 {
207  m_mobilityModel = nullptr;
208 }
209 
210 void
212 {
213  m_waypointCount = 10;
214  m_waypointCounter = 1;
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>();
222  m_mobilityModel->TraceConnectWithoutContext(
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));
231  mob->AddWaypoint(m_nextWaypoint);
232 
233  Simulator::Stop(Seconds((double)m_waypointCount + 2.0));
234  Simulator::Run();
236 }
237 
238 void
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  {
250  m_waypointCounter++;
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  {
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.
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
A suite of tests to run.
Definition: test.h:1256
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
#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
static void CourseChangeCallback(std::string path, Ptr< const MobilityModel > model)
This function will be used below as a trace sink, if the command-line argument or default value "useC...
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.