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 
29 // Include a header file from your module to test.
30 #include "../model/satellite-constant-interference.h"
31 #include "../model/satellite-per-packet-interference.h"
32 #include "../model/satellite-traced-interference.h"
33 #include "../utils/satellite-env-variables.h"
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 
45 using namespace ns3;
46 
62 class 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 
78 {
79 }
80 
81 void
83 {
84  // Set simulation output details
85  Singleton<SatEnvVariables>::Get()->DoInitialize();
86  Singleton<SatEnvVariables>::Get()->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  Singleton<SatEnvVariables>::Get()->DoDispose();
125 }
126 
142 class 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] = NULL;
175  }
176 }
177 
179 {
180 }
181 
182 void
183 SatPerPacketInterferenceTestCase::AddInterference(Time duration, double power, Address rxAddress)
184 {
185  Ptr<SatInterference::InterferenceChangeEvent> event =
186  m_interference->Add(duration, power, rxAddress);
187 }
188 
189 void
190 SatPerPacketInterferenceTestCase::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 
207 void
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 
218 void
220 {
221  // Set simulation output details
222  Singleton<SatEnvVariables>::Get()->DoInitialize();
223  Singleton<SatEnvVariables>::Get()->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  Singleton<SatEnvVariables>::Get()->DoDispose();
302 }
303 
308 class SatInterferenceTestSuite : public TestSuite
309 {
310  public:
312 };
313 
315  : TestSuite("sat-if-unit-test", UNIT)
316 {
317  AddTestCase(new SatConstantInterferenceTestCase, TestCase::QUICK);
318  AddTestCase(new SatPerPacketInterferenceTestCase, TestCase::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)
SatArqSequenceNumber is handling the sequence numbers for the ARQ process.
static SatInterferenceTestSuite satSatInterferenceTestSuite