A Discrete-Event Network Simulator
API
tcp-timestamp-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 Natale Patriciello <natale.patriciello@gmail.com>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  */
19 
20 #include "tcp-general-test.h"
21 #include "ns3/node.h"
22 #include "ns3/log.h"
23 #include "ns3/tcp-option-ts.h"
24 #include "ns3/tcp-header.h"
25 
26 using namespace ns3;
27 
28 NS_LOG_COMPONENT_DEFINE ("TimestampTestSuite");
29 
37 {
38 public:
43  {
47  ENABLED
48  };
49 
55 
56 protected:
57  virtual Ptr<TcpSocketMsgBase> CreateReceiverSocket (Ptr<Node> node);
58  virtual Ptr<TcpSocketMsgBase> CreateSenderSocket (Ptr<Node> node);
59 
60  virtual void Tx (const Ptr<const Packet> p, const TcpHeader&h, SocketWho who);
61  virtual void Rx (const Ptr<const Packet> p, const TcpHeader&h, SocketWho who);
62 
64 };
65 
67  : TcpGeneralTest ("Testing the TCP Timestamp option")
68 {
70 }
71 
74 {
75  Ptr<TcpSocketMsgBase> socket = TcpGeneralTest::CreateReceiverSocket (node);
76 
77  switch (m_configuration)
78  {
79  case DISABLED:
80  socket->SetAttribute ("Timestamp", BooleanValue (false));
81  break;
82 
83  case ENABLED_RECEIVER:
84  socket->SetAttribute ("Timestamp", BooleanValue (true));
85  break;
86 
87  case ENABLED_SENDER:
88  socket->SetAttribute ("Timestamp", BooleanValue (false));
89  break;
90 
91  case ENABLED:
92  socket->SetAttribute ("Timestamp", BooleanValue (true));
93  break;
94  }
95 
96  return socket;
97 }
98 
101 {
102  Ptr<TcpSocketMsgBase> socket = TcpGeneralTest::CreateSenderSocket (node);
103 
104  switch (m_configuration)
105  {
106  case DISABLED:
107  socket->SetAttribute ("Timestamp", BooleanValue (false));
108  break;
109 
110  case ENABLED_RECEIVER:
111  socket->SetAttribute ("Timestamp", BooleanValue (false));
112  break;
113 
114  case ENABLED_SENDER:
115  socket->SetAttribute ("Timestamp", BooleanValue (true));
116  break;
117 
118  case ENABLED:
119  socket->SetAttribute ("Timestamp", BooleanValue (true));
120  break;
121  }
122 
123  return socket;
124 }
125 
126 void
128 {
129  if (m_configuration == DISABLED)
130  {
131  NS_TEST_ASSERT_MSG_EQ (h.HasOption (TcpOption::TS), false,
132  "timestamp disabled but option enabled");
133  }
134  else if (m_configuration == ENABLED)
135  {
136  NS_TEST_ASSERT_MSG_EQ (h.HasOption (TcpOption::TS), true,
137  "timestamp enabled but option disabled");
138  }
139 
140  NS_LOG_INFO (h);
141  if (who == SENDER)
142  {
143  if (h.GetFlags () & TcpHeader::SYN)
144  {
146  {
147  NS_TEST_ASSERT_MSG_EQ (h.HasOption (TcpOption::TS), false,
148  "timestamp disabled but option enabled");
149  }
150  else if (m_configuration == ENABLED_SENDER)
151  {
152  NS_TEST_ASSERT_MSG_EQ (h.HasOption (TcpOption::TS), true,
153  "timestamp enabled but option disabled");
154  }
155  }
156  else
157  {
158  if (m_configuration != ENABLED)
159  {
160  NS_TEST_ASSERT_MSG_EQ (h.HasOption (TcpOption::TS), false,
161  "timestamp disabled but option enabled");
162  }
163  }
164  }
165  else if (who == RECEIVER)
166  {
167  if (h.GetFlags () & TcpHeader::SYN)
168  {
169  // Sender has not sent timestamp, so implementation should disable ts
171  {
172  NS_TEST_ASSERT_MSG_EQ (h.HasOption (TcpOption::TS), false,
173  "sender has not ts, but receiver sent anyway");
174  }
175  else if (m_configuration == ENABLED_SENDER)
176  {
177  NS_TEST_ASSERT_MSG_EQ (h.HasOption (TcpOption::TS), false,
178  "receiver has not ts enabled but sent anyway");
179  }
180  }
181  else
182  {
183  if (m_configuration != ENABLED)
184  {
185  NS_TEST_ASSERT_MSG_EQ (h.HasOption (TcpOption::TS), false,
186  "timestamp disabled but option enabled");
187  }
188  }
189  }
190 }
191 
192 void
194 {
195  if (who == SENDER)
196  {
197 
198  }
199  else if (who == RECEIVER)
200  {
201 
202  }
203 }
204 
212 {
213 public:
220  TimestampValueTestCase (double startTime, double timeToWait,
221  std::string name);
222 
223 private:
224  virtual void DoRun (void);
225  virtual void DoTeardown (void);
226 
230  void Check ();
234  void Init ();
235 
236  double m_startTime;
237  double m_timeToWait;
238  double m_initValue;
239 };
240 
242  double timeToWait,
243  std::string name)
244  : TestCase (name)
245 {
247  m_timeToWait = timeToWait;
248 }
249 
250 void
252 {
253  Simulator::Schedule (Seconds (m_startTime + m_timeToWait),
255  Simulator::Schedule (Seconds (m_startTime),
257 
258  Simulator::Run ();
259 }
260 
261 void
263 {
264  Simulator::Destroy ();
265 }
266 
267 void
269 {
270  m_initValue = TcpOptionTS::NowToTsValue ();
271 }
272 
273 void
275 {
276  uint32_t lastValue = TcpOptionTS::NowToTsValue ();
277 
279  MilliSeconds (1), "Different TS values");
280 
281  NS_TEST_ASSERT_MSG_EQ_TOL (TcpOptionTS::ElapsedTimeFromTsValue (m_initValue), Seconds (m_timeToWait),
282  MilliSeconds (1), "Estimating Wrong RTT");
283 }
284 
292 {
293 public:
295  : TestSuite ("tcp-timestamp", UNIT)
296  {
301  AddTestCase (new TimestampValueTestCase (0.0, 0.01, "Value Check"), TestCase::QUICK);
302  AddTestCase (new TimestampValueTestCase (3.0, 0.5, "Value Check"), TestCase::QUICK);
303  AddTestCase (new TimestampValueTestCase (5.5, 1.0, "Value Check"), TestCase::QUICK);
304  AddTestCase (new TimestampValueTestCase (6.0, 2.0, "Value Check"), TestCase::QUICK);
305  AddTestCase (new TimestampValueTestCase (2.4, 0.7, "Value Check"), TestCase::QUICK);
306 
307  }
308 
309 };
310 
312 
TCP TimeStamp TestSuite.
TCP TimeStamp enabling Test.
virtual void Tx(const Ptr< const Packet > p, const TcpHeader &h, SocketWho who)
Packet transmitted down to IP layer.
virtual Ptr< TcpSocketMsgBase > CreateSenderSocket(Ptr< Node > node)
Create and install the socket to install on the sender.
Configuration m_configuration
Test configuration.
virtual Ptr< TcpSocketMsgBase > CreateReceiverSocket(Ptr< Node > node)
Create and install the socket to install on the receiver.
TimestampTestCase(TimestampTestCase::Configuration conf)
Constructor.
Configuration
TimeStamp configuration.
virtual void Rx(const Ptr< const Packet > p, const TcpHeader &h, SocketWho who)
Packet received from IP layer.
TCP TimeStamp values Test.
TimestampValueTestCase(double startTime, double timeToWait, std::string name)
Constructor.
double m_timeToWait
Time to wait (Seconds).
virtual void DoRun(void)
Implementation to actually run this TestCase.
double m_startTime
Start time (Seconds).
void Check()
Perform the test checks.
void Init()
Test initialization.
virtual void DoTeardown(void)
Implementation to do any local setup required for this TestCase.
double m_initValue
Initialization value (Seconds).
AttributeValue implementation for Boolean.
Definition: boolean.h:37
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:74
General infrastructure for TCP testing.
SocketWho
Used as parameter of methods, specifies on what node the caller is interested (e.g.
@ RECEIVER
Receiver node.
Header for the Transmission Control Protocol.
Definition: tcp-header.h:45
bool HasOption(uint8_t kind) const
Check if the header has the option specified.
Definition: tcp-header.cc:511
uint8_t GetFlags() const
Get the flags.
Definition: tcp-header.cc:173
encapsulates test code
Definition: test.h:994
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:299
A suite of tests to run.
Definition: test.h:1188
@ UNIT
This test suite implements a Unit Test.
Definition: test.h:1197
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:281
#define NS_TEST_ASSERT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report and abort if not.
Definition: test.h:141
#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:323
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1244
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1252
Definition: conf.py:1
Every class exported by the ns3 library is enclosed in the ns3 namespace.
double startTime
static TcpTimestampTestSuite g_tcpTimestampTestSuite
Static variable for test initialization.