Loading...
Searching...
No Matches
satellite-interference-test.cc
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2013 Magister Solutions Ltd
4 * Copyright (c) 2018 CNES
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation;
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 *
19 * Author: Sami Rantanen <sami.rantanen@magister.fi>
20 * Author: Mathias Ettinger <mettinger@toulouse.viveris.com>
21 */
22
28
29// Include a header file from your module to test.
34
35#include "ns3/boolean.h"
36#include "ns3/config.h"
37#include "ns3/double.h"
38#include "ns3/log.h"
39#include "ns3/simulator.h"
40#include "ns3/singleton.h"
41#include "ns3/string.h"
42#include "ns3/test.h"
43#include "ns3/timer.h"
44
45using namespace ns3;
46
62class SatConstantInterferenceTestCase : public TestCase
63{
64 public:
67
68 private:
69 virtual void DoRun(void);
70};
71
73 : TestCase("Test satellite constant interference model.")
74{
75}
76
80
81void
83{
84 // Set simulation output details
85 SatEnvVariables::GetInstance()->DoInitialize();
86 SatEnvVariables::GetInstance()->SetOutputVariables("test-sat-if-unit", "constant", true);
87
88 Ptr<SatConstantInterference> interference = CreateObject<SatConstantInterference>();
89 interference->SetAttribute("ConstantInterferencePower", DoubleValue(100.0));
90
91 // just test that we can call add. However, It shouldn't have any effect on interference.
92 Ptr<SatInterference::InterferenceChangeEvent> event =
93 interference->Add(Time(10), 55, Mac48Address::ConvertFrom(Mac48Address::Allocate()));
94
95 // Test event setting with constant interference (base class SatInterference can't be
96 // instantiate)
97 NS_TEST_ASSERT_MSG_EQ(event->GetDuration(), Time(10), "Event duration is incorrect");
98 NS_TEST_ASSERT_MSG_EQ(event->GetEndTime() - event->GetStartTime(),
99 Time(10),
100 "Event start time or end time incorrect");
101 NS_TEST_ASSERT_MSG_EQ(event->GetRxPower(), 55, "Event RX power incorrect");
102
103 interference->NotifyRxStart(event);
104
105 std::vector<std::pair<double, double>> power = interference->Calculate(event);
106
107 NS_TEST_ASSERT_MSG_EQ(1, power.size(), "Calculated power returned more than one fragment");
108 NS_TEST_ASSERT_MSG_EQ(1.0, power[0].first, "Calculated power does not span the whole packet");
109 NS_TEST_ASSERT_MSG_EQ(100, power[0].second, "Calculated power not correct");
110
111 interference->NotifyRxEnd(event);
112
113 // just test that we can set interference again
114 interference->SetAttribute("ConstantInterferencePower", DoubleValue(50.0));
115
116 interference->NotifyRxStart(event);
117
118 power = interference->Calculate(event);
119
120 NS_TEST_ASSERT_MSG_EQ(1, power.size(), "Calculated power returned more than one fragment");
121 NS_TEST_ASSERT_MSG_EQ(1.0, power[0].first, "Calculated power does not span the whole packet");
122 NS_TEST_ASSERT_MSG_EQ(50, power[0].second, "Calculated power not correct");
123
124 SatEnvVariables::GetInstance()->DoDispose();
125}
126
142class SatPerPacketInterferenceTestCase : public TestCase
143{
144 public:
147
148 // adds interference to model object
149 void AddInterference(Time duration, double power, Address rxAddress);
150
151 // adds receivers own interference to model object and schedules receiving
152 void StartReceiver(Time duration, double power, Address rxAddress);
153
154 // receives packets i.e. calculates interference and stops receiving.
155 void Receive(uint32_t rxIndex);
156
157 private:
158 virtual void DoRun(void);
159 Ptr<SatPerPacketInterference> m_interference;
160 Ptr<SatInterference::InterferenceChangeEvent> m_rxEvent[4];
161 uint32_t m_rxIndex;
162 double finalPower[4];
163};
164
166 : TestCase("Test satellite per packet interference model.")
167{
168 m_interference = CreateObject<SatPerPacketInterference>();
169 m_rxIndex = 0;
170
171 for (int i = 0; i < 4; i++)
172 {
173 finalPower[i] = 0;
174 m_rxEvent[i] = nullptr;
175 }
176}
177
181
182void
183SatPerPacketInterferenceTestCase::AddInterference(Time duration, double power, Address rxAddress)
184{
185 Ptr<SatInterference::InterferenceChangeEvent> event =
186 m_interference->Add(duration, power, rxAddress);
187}
188
189void
190SatPerPacketInterferenceTestCase::StartReceiver(Time duration, double power, Address rxAddress)
191{
192 // add own interference
193 m_rxEvent[m_rxIndex] = m_interference->Add(duration, power, rxAddress);
194
195 // notify interference object of receiving
196 m_interference->NotifyRxStart(m_rxEvent[m_rxIndex]);
197
198 // schedule receiving
199 Simulator::Schedule(Time(duration),
201 this,
202 m_rxIndex);
203
204 m_rxIndex++;
205}
206
207void
209{
210 std::vector<std::pair<double, double>> ifPower = m_interference->Calculate(m_rxEvent[rxIndex]);
211 NS_TEST_ASSERT_MSG_EQ(1, ifPower.size(), "Calculated power returned more than one fragment");
212 NS_TEST_ASSERT_MSG_EQ(1.0, ifPower[0].first, "Calculated power does not span the whole packet");
213
214 finalPower[rxIndex] = ifPower[0].second;
215 m_interference->NotifyRxEnd(m_rxEvent[rxIndex]);
216}
217
218void
220{
221 // Set simulation output details
222 SatEnvVariables::GetInstance()->DoInitialize();
223 SatEnvVariables::GetInstance()->SetOutputVariables("test-sat-if-unit", "perpacket", true);
224
225 // simulate interferences and receiving (4 receivers), adding and calculation done in callback
226 // routines
227 Simulator::Schedule(Time(0),
229 this,
230 Time(60),
231 60,
232 Mac48Address::ConvertFrom(Mac48Address::Allocate()));
233 Simulator::Schedule(Time(10),
235 this,
236 Time(40),
237 70,
238 Mac48Address::ConvertFrom(Mac48Address::Allocate()));
239 Simulator::Schedule(Time(30),
241 this,
242 Time(50),
243 10,
244 Mac48Address::ConvertFrom(Mac48Address::Allocate()));
245 Simulator::Schedule(Time(50),
247 this,
248 Time(40),
249 20,
250 Mac48Address::ConvertFrom(Mac48Address::Allocate()));
251 Simulator::Schedule(Time(10),
253 this,
254 Time(90),
255 50,
256 Mac48Address::ConvertFrom(Mac48Address::Allocate())); // event[0]
257 Simulator::Schedule(Time(20),
259 this,
260 Time(50),
261 5,
262 Mac48Address::ConvertFrom(Mac48Address::Allocate())); // event[1]
263 Simulator::Schedule(Time(30),
265 this,
266 Time(60),
267 30,
268 Mac48Address::ConvertFrom(Mac48Address::Allocate())); // event[2]
269 Simulator::Schedule(Time(50),
271 this,
272 Time(20),
273 40,
274 Mac48Address::ConvertFrom(Mac48Address::Allocate())); // event[3]
275
276 Simulator::Run();
277
278 // After simulation check that calculated results are as planned
279
280 // check first receiver
281 double finalDiff = std::abs((double)995 / (double)9 - finalPower[0]);
282
283 NS_TEST_ASSERT_MSG_LT(finalDiff, 0.0000000000001, "Final power incorrect");
284
285 // check second receiver
286 finalDiff = std::abs((double)196 - finalPower[1]);
287
288 NS_TEST_ASSERT_MSG_LT(finalDiff, 0.0000000000001, "Final power incorrect");
289
290 // check third receiver
291 finalDiff = std::abs((double)850 / (double)6 - finalPower[2]);
292
293 NS_TEST_ASSERT_MSG_LT(finalDiff, 0.0000000000001, "Final power incorrect");
294
295 // check fourth receiver
296 finalDiff = std::abs((double)145 - finalPower[3]);
297
298 NS_TEST_ASSERT_MSG_LT(finalDiff, 0.00000000000001, "Final power incorrect");
299
300 Simulator::Destroy();
301 SatEnvVariables::GetInstance()->DoDispose();
302}
303
308class SatInterferenceTestSuite : public TestSuite
309{
310 public:
312};
313
315 : TestSuite("sat-if-unit-test", Type::UNIT)
316{
317 AddTestCase(new SatConstantInterferenceTestCase, TestCase::Duration::QUICK);
318 AddTestCase(new SatPerPacketInterferenceTestCase, TestCase::Duration::QUICK);
319}
320
321// Do allocate an instance of this TestSuite
Test case to unit test satellite constant interference model.
Test suite for Satellite interference unit test cases.
Test case to unit test satellite per packet interference model.
Ptr< SatPerPacketInterference > m_interference
void AddInterference(Time duration, double power, Address rxAddress)
Ptr< SatInterference::InterferenceChangeEvent > m_rxEvent[4]
void StartReceiver(Time duration, double power, Address rxAddress)
static Ptr< SatEnvVariables > GetInstance()
SatArqSequenceNumber is handling the sequence numbers for the ARQ process.
static SatAntennaPatternTestSuite satSatInterferenceTestSuite