A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
lte-test-phy-error-model.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2011-2013 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 *
6 * Author: Marco Miozzo <marco.miozzo@cttc.es>
7 * Nicola Baldo <nbaldo@cttc.es>
8 */
9
11
12#include <ns3/boolean.h>
13#include <ns3/buildings-helper.h>
14#include <ns3/config.h>
15#include <ns3/double.h>
16#include <ns3/enum.h>
17#include <ns3/eps-bearer.h>
18#include <ns3/ff-mac-scheduler.h>
19#include <ns3/hybrid-buildings-propagation-loss-model.h>
20#include <ns3/integer.h>
21#include <ns3/log.h>
22#include <ns3/lte-enb-net-device.h>
23#include <ns3/lte-enb-phy.h>
24#include <ns3/lte-helper.h>
25#include <ns3/lte-ue-net-device.h>
26#include <ns3/lte-ue-phy.h>
27#include <ns3/lte-ue-rrc.h>
28#include <ns3/mobility-building-info.h>
29#include <ns3/mobility-helper.h>
30#include <ns3/net-device-container.h>
31#include <ns3/node-container.h>
32#include <ns3/object.h>
33#include <ns3/packet.h>
34#include <ns3/ptr.h>
35#include <ns3/radio-bearer-stats-calculator.h>
36#include <ns3/simulator.h>
37#include <ns3/spectrum-error-model.h>
38#include <ns3/spectrum-interference.h>
39#include <ns3/string.h>
40#include <ns3/test.h>
41
42#include <iostream>
43
44using namespace ns3;
45
46NS_LOG_COMPONENT_DEFINE("LteTestPhyErrorModel");
47
49 : TestSuite("lte-phy-error-model", Type::SYSTEM)
50{
51 NS_LOG_INFO("creating LenaTestPhyErrorModelTestCase");
52
53 for (uint32_t rngRun = 1; rngRun <= 3; ++rngRun)
54 {
55 // Tests on DL Control Channels (PCFICH+PDCCH)
56 // the tolerance is calculated with the following octave code:
57 //
58 // n = 1000; # TX packets
59 // for p=1-[0.007 0.045 0.206 0.343]
60 // tol = n*p - binoinv(0.001, n, p)
61 // endfor
62
63 // 1 interfering eNB SINR -2.0 BLER 0.007 TB size 217
64 AddTestCase(new LenaDlCtrlPhyErrorModelTestCase(2, 1078, 0.007, 9, Seconds(0.04), rngRun),
65 (rngRun == 1) ? TestCase::Duration::QUICK : TestCase::Duration::TAKES_FOREVER);
66 // 2 interfering eNBs SINR -4.0 BLER 0.037 TB size 217
67 AddTestCase(new LenaDlCtrlPhyErrorModelTestCase(3, 1040, 0.045, 21, Seconds(0.04), rngRun),
68 (rngRun == 1) ? TestCase::Duration::EXTENSIVE
69 : TestCase::Duration::TAKES_FOREVER);
70 // 3 interfering eNBs SINR -6.0 BLER 0.21 TB size 133
71 AddTestCase(new LenaDlCtrlPhyErrorModelTestCase(4, 1250, 0.206, 40, Seconds(0.12), rngRun),
72 (rngRun == 1) ? TestCase::Duration::EXTENSIVE
73 : TestCase::Duration::TAKES_FOREVER);
74 // 4 interfering eNBs SINR -7.0 BLER 0.34 TB size 133
75 AddTestCase(new LenaDlCtrlPhyErrorModelTestCase(5, 1260, 0.343, 47, Seconds(0.12), rngRun),
76 (rngRun == 1) ? TestCase::Duration::EXTENSIVE
77 : TestCase::Duration::TAKES_FOREVER);
78
79 // Tests on DL Data channels (PDSCH)
80 // the tolerance is calculated with the following octave code:
81 //
82 // n = 1000; # TX packets
83 // for p=1-[0.33 0.11 0.2 0.3 0.55 0.14]
84 // tol = n*p - binoinv(0.005, n, p)
85 // endfor
86
87 // MCS 2 TB size of 256 bits BLER 0.33 SINR -5.51
88 AddTestCase(new LenaDataPhyErrorModelTestCase(4, 1800, 0.33, 39, Seconds(0.04), rngRun),
89 (rngRun == 1) ? TestCase::Duration::QUICK : TestCase::Duration::TAKES_FOREVER);
90 // MCS 2 TB size of 528 bits BLER 0.11 SINR -5.51
91 AddTestCase(new LenaDataPhyErrorModelTestCase(2, 1800, 0.11, 26, Seconds(0.04), rngRun),
92 (rngRun == 1) ? TestCase::Duration::EXTENSIVE
93 : TestCase::Duration::TAKES_FOREVER);
94 // MCS 2 TB size of 1088 bits BLER 0.02 SINR -5.51
95 AddTestCase(new LenaDataPhyErrorModelTestCase(1, 1800, 0.02, 33, Seconds(0.04), rngRun),
96 (rngRun == 1) ? TestCase::Duration::EXTENSIVE
97 : TestCase::Duration::TAKES_FOREVER);
98 // MCS 12 TB size of 4800 bits BLER 0.3 SINR 4.43
99 AddTestCase(new LenaDataPhyErrorModelTestCase(1, 600, 0.3, 38, Seconds(0.04), rngRun),
100 (rngRun == 1) ? TestCase::Duration::EXTENSIVE
101 : TestCase::Duration::TAKES_FOREVER);
102 // MCS 12 TB size of 1632 bits BLER 0.55 SINR 4.43
103 AddTestCase(new LenaDataPhyErrorModelTestCase(3, 600, 0.55, 40, Seconds(0.04), rngRun),
104 (rngRun == 1) ? TestCase::Duration::EXTENSIVE
105 : TestCase::Duration::TAKES_FOREVER);
106 // MCS 16 TB size of 7272 bits (3648 x 3584) BLER 0.14 SINR 8.48
107 // BLER 0.14 = 1 - ((1-0.075)*(1-0.075))
108 AddTestCase(new LenaDataPhyErrorModelTestCase(1, 470, 0.14, 29, Seconds(0.04), rngRun),
109 (rngRun == 1) ? TestCase::Duration::EXTENSIVE
110 : TestCase::Duration::TAKES_FOREVER);
111 }
112}
113
114/**
115 * \ingroup lte-test
116 * Static variable for test initialization
117 */
119
120std::string
121LenaDataPhyErrorModelTestCase::BuildNameString(uint16_t nUser, uint16_t dist, uint32_t rngRun)
122{
123 std::ostringstream oss;
124 oss << "DataPhyErrorModel " << nUser << " UEs, distance " << dist << " m, RngRun " << rngRun;
125 return oss.str();
126}
127
129 uint16_t dist,
130 double blerRef,
131 uint16_t toleranceRxPackets,
132 Time statsStartTime,
133 uint32_t rngRun)
134 : TestCase(BuildNameString(nUser, dist, rngRun)),
135 m_nUser(nUser),
136 m_dist(dist),
137 m_blerRef(blerRef),
138 m_toleranceRxPackets(toleranceRxPackets),
139 m_statsStartTime(statsStartTime),
140 m_rngRun(rngRun)
141{
142}
143
147
148void
150{
151 double ber = 0.03;
152 Config::SetDefault("ns3::LteAmc::Ber", DoubleValue(ber));
153 Config::SetDefault("ns3::LteAmc::AmcModel", EnumValue(LteAmc::PiroEW2010));
154 Config::SetDefault("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue(false));
155 Config::SetDefault("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue(true));
156 Config::SetDefault("ns3::RrFfMacScheduler::HarqEnabled", BooleanValue(false));
158
159 Config::SetDefault("ns3::RadioBearerStatsCalculator::DlRlcOutputFilename",
160 StringValue(CreateTempDirFilename("DlRlcStats.txt")));
161 Config::SetDefault("ns3::RadioBearerStatsCalculator::UlRlcOutputFilename",
162 StringValue(CreateTempDirFilename("UlRlcStats.txt")));
163
164 // Disable Uplink Power Control
165 Config::SetDefault("ns3::LteUePhy::EnableUplinkPowerControl", BooleanValue(false));
166
167 /*
168 * Initialize Simulation Scenario: 1 eNB and m_nUser UEs
169 */
170
171 int64_t stream = 1;
173
174 // Create Nodes: eNodeB and UE
175 NodeContainer enbNodes;
176 NodeContainer ueNodes;
177 enbNodes.Create(1);
178 ueNodes.Create(m_nUser);
179
180 // Install Mobility Model
181 MobilityHelper mobility;
182 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
183 mobility.Install(enbNodes);
184 BuildingsHelper::Install(enbNodes);
185 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
186 mobility.Install(ueNodes);
188
189 // remove random shadowing component
190 lena->SetAttribute("PathlossModel", StringValue("ns3::HybridBuildingsPropagationLossModel"));
191 lena->SetPathlossModelAttribute("ShadowSigmaOutdoor", DoubleValue(0.0));
192 lena->SetPathlossModelAttribute("ShadowSigmaIndoor", DoubleValue(0.0));
193 lena->SetPathlossModelAttribute("ShadowSigmaExtWalls", DoubleValue(0.0));
194
195 // Create Devices and install them in the Nodes (eNB and UE)
196 NetDeviceContainer enbDevs;
197 NetDeviceContainer ueDevs;
198 lena->SetSchedulerType("ns3::RrFfMacScheduler");
199 lena->SetSchedulerAttribute("UlCqiFilter", EnumValue(FfMacScheduler::PUSCH_UL_CQI));
200
201 enbDevs = lena->InstallEnbDevice(enbNodes);
202 stream += lena->AssignStreams(enbDevs, stream);
203 ueDevs = lena->InstallUeDevice(ueNodes);
204 stream += lena->AssignStreams(ueDevs, stream);
205
206 // Attach a UE to a eNB
207 lena->Attach(ueDevs, enbDevs.Get(0));
208
209 // Activate an EPS bearer
211 EpsBearer bearer(q);
212 lena->ActivateDataRadioBearer(ueDevs, bearer);
213
214 Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get(0)->GetObject<LteEnbNetDevice>();
215 Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy();
216 enbPhy->SetAttribute("TxPower", DoubleValue(43.0));
217 enbPhy->SetAttribute("NoiseFigure", DoubleValue(5.0));
218 // place the HeNB over the default rooftop level (20 mt.)
219 Ptr<MobilityModel> mm = enbNodes.Get(0)->GetObject<MobilityModel>();
220 mm->SetPosition(Vector(0.0, 0.0, 30.0));
221
222 // Set UEs' position and power
223 for (int i = 0; i < m_nUser; i++)
224 {
225 Ptr<MobilityModel> mm1 = ueNodes.Get(i)->GetObject<MobilityModel>();
226 mm1->SetPosition(Vector(m_dist, 0.0, 1.0));
227 Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get(i)->GetObject<LteUeNetDevice>();
228 Ptr<LteUePhy> uePhy = lteUeDev->GetPhy();
229 uePhy->SetAttribute("TxPower", DoubleValue(23.0));
230 uePhy->SetAttribute("NoiseFigure", DoubleValue(9.0));
231 }
232
233 Time statsDuration = Seconds(1.0);
234 Simulator::Stop(m_statsStartTime + statsDuration - Seconds(0.0001));
235
236 lena->EnableRlcTraces();
237 Ptr<RadioBearerStatsCalculator> rlcStats = lena->GetRlcStats();
238 rlcStats->SetAttribute("StartTime", TimeValue(m_statsStartTime));
239 rlcStats->SetAttribute("EpochDuration", TimeValue(statsDuration));
240
242
243 NS_LOG_INFO("\tTest downlink data shared channels (PDSCH)");
244 NS_LOG_INFO("Test with " << m_nUser << " user(s) at distance " << m_dist << " expected BLER "
245 << m_blerRef);
246 for (int i = 0; i < m_nUser; i++)
247 {
248 // get the imsi
249 uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
250 uint8_t lcId = 3;
251
252 double dlRxPackets = rlcStats->GetDlRxPackets(imsi, lcId);
253 double dlTxPackets = rlcStats->GetDlTxPackets(imsi, lcId);
254 double dlBler [[maybe_unused]] = 1.0 - (dlRxPackets / dlTxPackets);
255 double expectedDlRxPackets = dlTxPackets - dlTxPackets * m_blerRef;
256 NS_LOG_INFO("\tUser " << i << " imsi " << imsi << " DOWNLINK"
257 << " pkts rx " << dlRxPackets << " tx " << dlTxPackets << " BLER "
258 << dlBler << " Err " << std::fabs(m_blerRef - dlBler)
259 << " expected rx " << expectedDlRxPackets << " difference "
260 << std::abs(expectedDlRxPackets - dlRxPackets) << " tolerance "
262
263 // sanity check for whether the tx packets reported by the stats are correct
264 // we expect one packet per TTI
265 auto expectedDlTxPackets = static_cast<double>(statsDuration.GetMilliSeconds());
266 NS_TEST_ASSERT_MSG_EQ_TOL(dlTxPackets,
267 expectedDlTxPackets,
268 expectedDlTxPackets * 0.005,
269 " too different DL TX packets reported");
270
271 // this is the main test condition: check that the RX packets are within the expected range
272 NS_TEST_ASSERT_MSG_EQ_TOL(dlRxPackets,
273 expectedDlRxPackets,
275 " too different DL RX packets reported");
276 }
277
279}
280
281std::string
283{
284 std::ostringstream oss;
285 oss << "DlCtrlPhyErrorModel " << nEnb << " eNBs, distance " << dist << " m, RngRun " << rngRun;
286 return oss.str();
287}
288
290 uint16_t dist,
291 double blerRef,
292 uint16_t toleranceRxPackets,
293 Time statsStartTime,
294 uint32_t rngRun)
295 : TestCase(BuildNameString(nEnb, dist, rngRun)),
296 m_nEnb(nEnb),
297 m_dist(dist),
298 m_blerRef(blerRef),
299 m_toleranceRxPackets(toleranceRxPackets),
300 m_statsStartTime(statsStartTime),
301 m_rngRun(rngRun)
302{
303}
304
308
309void
311{
312 double ber = 0.03;
313 Config::SetDefault("ns3::LteAmc::Ber", DoubleValue(ber));
314 Config::SetDefault("ns3::LteAmc::AmcModel", EnumValue(LteAmc::PiroEW2010));
315 Config::SetDefault("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue(true));
316 Config::SetDefault("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue(false));
317 Config::SetDefault("ns3::RrFfMacScheduler::HarqEnabled", BooleanValue(false));
319
320 Config::SetDefault("ns3::RadioBearerStatsCalculator::DlRlcOutputFilename",
321 StringValue(CreateTempDirFilename("DlRlcStats.txt")));
322 Config::SetDefault("ns3::RadioBearerStatsCalculator::UlRlcOutputFilename",
323 StringValue(CreateTempDirFilename("UlRlcStats.txt")));
324
325 // Disable Uplink Power Control
326 Config::SetDefault("ns3::LteUePhy::EnableUplinkPowerControl", BooleanValue(false));
327
328 /*
329 * Initialize Simulation Scenario: 1 eNB and m_nUser UEs
330 */
331
332 int64_t stream = 1;
334
335 // Create Nodes: eNodeB and UE
336 NodeContainer enbNodes;
337 NodeContainer ueNodes;
338 enbNodes.Create(m_nEnb);
339 ueNodes.Create(1);
340
341 // Install Mobility Model
342 MobilityHelper mobility;
343 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
344 mobility.Install(enbNodes);
345 BuildingsHelper::Install(enbNodes);
346 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
347 mobility.Install(ueNodes);
349
350 // remove random shadowing component
351 lena->SetAttribute("PathlossModel", StringValue("ns3::HybridBuildingsPropagationLossModel"));
352 lena->SetPathlossModelAttribute("ShadowSigmaOutdoor", DoubleValue(0.0));
353 lena->SetPathlossModelAttribute("ShadowSigmaIndoor", DoubleValue(0.0));
354 lena->SetPathlossModelAttribute("ShadowSigmaExtWalls", DoubleValue(0.0));
355
356 // Create Devices and install them in the Nodes (eNB and UE)
357 NetDeviceContainer enbDevs;
358 NetDeviceContainer ueDevs;
359 lena->SetSchedulerType("ns3::RrFfMacScheduler");
360 lena->SetSchedulerAttribute("UlCqiFilter", EnumValue(FfMacScheduler::PUSCH_UL_CQI));
361
362 enbDevs = lena->InstallEnbDevice(enbNodes);
363 stream += lena->AssignStreams(enbDevs, stream);
364 ueDevs = lena->InstallUeDevice(ueNodes);
365 stream += lena->AssignStreams(ueDevs, stream);
366
367 // Attach a UE to one eNB (the others are interfering ones)
368 lena->Attach(ueDevs, enbDevs.Get(0));
369
370 // Activate an EPS bearer
372 EpsBearer bearer(q);
373 lena->ActivateDataRadioBearer(ueDevs, bearer);
374
375 // Set UEs' position and power
376 for (int i = 0; i < m_nEnb; i++)
377 {
378 // place the HeNB over the default rooftop level (20 mt.)
379 Ptr<MobilityModel> mm = enbNodes.Get(i)->GetObject<MobilityModel>();
380 mm->SetPosition(Vector(0.0, 0.0, 30.0));
381 Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get(i)->GetObject<LteEnbNetDevice>();
382 Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy();
383 enbPhy->SetAttribute("TxPower", DoubleValue(43.0));
384 enbPhy->SetAttribute("NoiseFigure", DoubleValue(5.0));
385 }
386
387 // Set UEs' position and power
388 Ptr<MobilityModel> mm = ueNodes.Get(0)->GetObject<MobilityModel>();
389 mm->SetPosition(Vector(m_dist, 0.0, 1.0));
390 Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get(0)->GetObject<LteUeNetDevice>();
391 Ptr<LteUePhy> uePhy = lteUeDev->GetPhy();
392 uePhy->SetAttribute("TxPower", DoubleValue(23.0));
393 uePhy->SetAttribute("NoiseFigure", DoubleValue(9.0));
394
395 Time statsDuration = Seconds(1.0);
396 Simulator::Stop(m_statsStartTime + statsDuration - Seconds(0.0001));
397
398 lena->EnableRlcTraces();
399 Ptr<RadioBearerStatsCalculator> rlcStats = lena->GetRlcStats();
400 rlcStats->SetAttribute("StartTime", TimeValue(m_statsStartTime));
401 rlcStats->SetAttribute("EpochDuration", TimeValue(statsDuration));
402
404
405 NS_LOG_INFO("\tTest downlink control channels (PCFICH+PDCCH)");
406 NS_LOG_INFO("Test with " << m_nEnb << " eNB(s) at distance " << m_dist << " expected BLER "
407 << m_blerRef);
408 int nUser = 1;
409 for (int i = 0; i < nUser; i++)
410 {
411 // get the imsi
412 uint64_t imsi = ueDevs.Get(i)->GetObject<LteUeNetDevice>()->GetImsi();
413 uint8_t lcId = 3;
414 double dlRxPackets = rlcStats->GetDlRxPackets(imsi, lcId);
415 double dlTxPackets = rlcStats->GetDlTxPackets(imsi, lcId);
416 double dlBler [[maybe_unused]] = 1.0 - (dlRxPackets / dlTxPackets);
417 double expectedDlRxPackets = dlTxPackets - dlTxPackets * m_blerRef;
418 NS_LOG_INFO("\tUser " << i << " imsi " << imsi << " DOWNLINK"
419 << " pkts rx " << dlRxPackets << " tx " << dlTxPackets << " BLER "
420 << dlBler << " Err " << std::fabs(m_blerRef - dlBler)
421 << " expected rx " << expectedDlRxPackets << " difference "
422 << std::abs(expectedDlRxPackets - dlRxPackets) << " tolerance "
424
425 // sanity check for whether the tx packets reported by the stats are correct
426 // we expect one packet per TTI
427 auto expectedDlTxPackets = static_cast<double>(statsDuration.GetMilliSeconds());
428 NS_TEST_ASSERT_MSG_EQ_TOL(dlTxPackets,
429 expectedDlTxPackets,
430 expectedDlTxPackets * 0.005,
431 " too different DL TX packets reported");
432
433 // this is the main test condition: check that the RX packets are within the expected range
434 NS_TEST_ASSERT_MSG_EQ_TOL(dlRxPackets,
435 expectedDlRxPackets,
437 "too different DL RX packets reported");
438 }
439
441}
This system test program creates different test cases with a single eNB and several UEs,...
LenaDataPhyErrorModelTestCase(uint16_t nUser, uint16_t dist, double blerRef, uint16_t toleranceRxPackets, Time statsStartTime, uint32_t rngRun)
Constructor.
static std::string BuildNameString(uint16_t nUser, uint16_t dist, uint32_t rngRun)
Builds the test name string based on provided parameter values.
uint16_t m_nUser
number of UE nodes
double m_dist
the distance between nodes
void DoRun() override
Implementation to actually run this TestCase.
uint16_t m_toleranceRxPackets
receive packet tolerance loss
Time m_statsStartTime
Extra time in the beginning of simulation to allow RRC connection establishment + SRS.
Lena Dl Ctrl Phy Error Model Test Case.
LenaDlCtrlPhyErrorModelTestCase(uint16_t nEnb, uint16_t dist, double blerRef, uint16_t toleranceRxPackets, Time statsStartTime, uint32_t rngRun)
Constructor.
uint16_t m_nEnb
the number of ENB nodes
static std::string BuildNameString(uint16_t nUser, uint16_t dist, uint32_t rngRun)
Build name string.
void DoRun() override
Implementation to actually run this TestCase.
Time m_statsStartTime
Extra time in the beginning of simulation to allow RRC connection establishment + SRS.
double m_dist
the distance between nodes
uint16_t m_toleranceRxPackets
receive packet tolerance loss
Lena Test Phy Error Model Suite.
static void Install(Ptr< Node > node)
Install the MobilityBuildingInfo to a node.
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition double.h:31
Hold variables of type enum.
Definition enum.h:52
This class contains the specification of EPS Bearers.
Definition eps-bearer.h:80
Qci
QoS Class Indicator.
Definition eps-bearer.h:95
@ GBR_CONV_VOICE
GBR Conversational Voice.
Definition eps-bearer.h:96
The eNodeB device implementation.
The LteUeNetDevice class implements the UE net device.
Helper class used to assign positions and mobility models to nodes.
Keep track of the current position and velocity of an object.
holds a vector of ns3::NetDevice pointers
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
keep track of a set of node pointers.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
Definition object.h:511
Smart pointer class similar to boost::intrusive_ptr.
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
Definition simulator.cc:131
static void Run()
Run the simulation.
Definition simulator.cc:167
static void Stop()
Tell the Simulator the calling event should be the last one executed.
Definition simulator.cc:175
Hold variables of type string.
Definition string.h:45
encapsulates test code
Definition test.h:1050
void AddTestCase(TestCase *testCase, Duration duration=Duration::QUICK)
Add an individual child TestCase to this test suite.
Definition test.cc:292
std::string CreateTempDirFilename(std::string filename)
Construct the full path to a file in a temporary directory.
Definition test.cc:432
A suite of tests to run.
Definition test.h:1267
Type
Type of test.
Definition test.h:1274
Simulation virtual time values and global simulation resolution.
Definition nstime.h:94
int64_t GetMilliSeconds() const
Get an approximation of the time stored in this instance in the indicated unit.
Definition nstime.h:397
Hold an unsigned integer type.
Definition uinteger.h:34
void SetGlobal(std::string name, const AttributeValue &value)
Definition config.cc:929
void SetDefault(std::string name, const AttributeValue &value)
Definition config.cc:883
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition log.h:191
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition log.h:264
static LenaTestPhyErrorModelSuite lenaTestPhyErrorModelSuite
Static variable for test initialization.
Ptr< T > CreateObject(Args &&... args)
Create an object by type, with varying number of constructor parameters.
Definition object.h:619
#define NS_TEST_ASSERT_MSG_EQ_TOL(actual, limit, tol, msg)
Test that actual and expected (limit) values are equal to plus or minus some tolerance and report and...
Definition test.h:327
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition nstime.h:1308
Every class exported by the ns3 library is enclosed in the ns3 namespace.