|
|
| 27 |
|
27 |
|
| 28 |
namespace ns3 { |
28 |
namespace ns3 { |
| 29 |
|
29 |
|
|
|
30 |
#define GET_RANDOM_UINT32(RandomVariable) \ |
| 31 |
static_cast<uint32_t> (RandomVariable->GetInteger (0, UINT32_MAX)) |
| 32 |
|
| 33 |
#define GET_RANDOM_UINT16(RandomVariable) \ |
| 34 |
static_cast<uint16_t> (RandomVariable->GetInteger (0, UINT16_MAX)) |
| 35 |
|
| 36 |
#define GET_RANDOM_UINT8(RandomVariable) \ |
| 37 |
static_cast<uint8_t> (RandomVariable->GetInteger (0, UINT8_MAX)) |
| 38 |
|
| 39 |
#define GET_RANDOM_UINT6(RandomVariable) \ |
| 40 |
static_cast<uint8_t> (RandomVariable->GetInteger (0, UINT8_MAX >> 2)) |
| 41 |
|
| 30 |
class TcpHeaderGetSetTestCase : public TestCase |
42 |
class TcpHeaderGetSetTestCase : public TestCase |
| 31 |
{ |
43 |
{ |
| 32 |
public: |
44 |
public: |
| 33 |
TcpHeaderGetSetTestCase (uint16_t sourcePort, uint16_t destinationPort, |
45 |
TcpHeaderGetSetTestCase (std::string name); |
| 34 |
SequenceNumber32 sequenceNumber, SequenceNumber32 ackNumber, |
|
|
| 35 |
uint8_t flags, uint16_t m_windowSize, uint16_t m_urgentPointer, |
| 36 |
std::string name); |
| 37 |
protected: |
46 |
protected: |
| 38 |
uint16_t m_sourcePort; //!< Source port |
|
|
| 39 |
uint16_t m_destinationPort; //!< Destination port |
| 40 |
SequenceNumber32 m_sequenceNumber; //!< Sequence number |
| 41 |
SequenceNumber32 m_ackNumber; //!< ACK number |
| 42 |
uint8_t m_flags; //!< Flags (really a uint6_t) |
| 43 |
uint16_t m_windowSize; //!< Window size |
| 44 |
uint16_t m_urgentPointer; //!< Urgent pointer |
| 45 |
|
| 46 |
private: |
47 |
private: |
| 47 |
virtual void DoRun (void); |
48 |
virtual void DoRun (void); |
| 48 |
virtual void DoTeardown (void); |
49 |
virtual void DoTeardown (void); |
| 49 |
|
50 |
|
| 50 |
TcpHeader m_header; |
|
|
| 51 |
Buffer m_buffer; |
| 52 |
}; |
51 |
}; |
| 53 |
|
52 |
|
| 54 |
TcpHeaderGetSetTestCase::TcpHeaderGetSetTestCase ( |
53 |
TcpHeaderGetSetTestCase::TcpHeaderGetSetTestCase (std::string name) : TestCase (name) |
| 55 |
uint16_t sourcePort, uint16_t destinationPort, |
|
|
| 56 |
SequenceNumber32 sequenceNumber, SequenceNumber32 ackNumber, |
| 57 |
uint8_t flags, uint16_t windowSize, uint16_t urgentPointer, |
| 58 |
std::string name) : TestCase (name) |
| 59 |
{ |
54 |
{ |
| 60 |
m_sourcePort = sourcePort; |
55 |
} |
| 61 |
m_destinationPort = destinationPort; |
56 |
void TcpHeaderGetSetTestCase::DoRun (void) |
| 62 |
m_sequenceNumber = sequenceNumber; |
57 |
{ |
| 63 |
m_ackNumber = ackNumber; |
58 |
uint16_t sourcePort; //!< Source port |
| 64 |
m_flags = flags; |
59 |
uint16_t destinationPort; //!< Destination port |
| 65 |
m_windowSize = windowSize; |
60 |
SequenceNumber32 sequenceNumber; //!< Sequence number |
| 66 |
m_urgentPointer = urgentPointer; |
61 |
SequenceNumber32 ackNumber; //!< ACK number |
|
|
62 |
uint8_t flags; //!< Flags (really a uint6_t) |
| 63 |
uint16_t windowSize; //!< Window size |
| 64 |
uint16_t urgentPointer; //!< Urgent pointer |
| 65 |
TcpHeader header; |
| 66 |
Buffer buffer; |
| 67 |
|
67 |
|
| 68 |
m_header.SetSourcePort (m_sourcePort); |
68 |
Ptr<UniformRandomVariable> x = CreateObject<UniformRandomVariable> (); |
| 69 |
m_header.SetDestinationPort (m_destinationPort); |
69 |
for (uint32_t i = 0; i < 1000; ++i) |
| 70 |
m_header.SetSequenceNumber (m_sequenceNumber); |
70 |
{ |
| 71 |
m_header.SetAckNumber (m_ackNumber); |
71 |
sourcePort = GET_RANDOM_UINT16 (x); |
| 72 |
m_header.SetFlags (m_flags); |
72 |
destinationPort = GET_RANDOM_UINT16 (x); |
| 73 |
m_header.SetWindowSize (m_windowSize); |
73 |
sequenceNumber = SequenceNumber32 (GET_RANDOM_UINT32 (x)); |
| 74 |
m_header.SetUrgentPointer (m_urgentPointer); |
74 |
ackNumber = SequenceNumber32 (GET_RANDOM_UINT32 (x)); |
|
|
75 |
flags = GET_RANDOM_UINT6 (x); |
| 76 |
windowSize = GET_RANDOM_UINT16 (x); |
| 77 |
urgentPointer = GET_RANDOM_UINT16 (x); |
| 75 |
|
78 |
|
| 76 |
NS_TEST_ASSERT_MSG_EQ (m_header.GetLength (), 5, "TcpHeader without option is" |
79 |
header.SetSourcePort (sourcePort); |
|
|
80 |
header.SetDestinationPort (destinationPort); |
| 81 |
header.SetSequenceNumber (sequenceNumber); |
| 82 |
header.SetAckNumber (ackNumber); |
| 83 |
header.SetFlags (flags); |
| 84 |
header.SetWindowSize (windowSize); |
| 85 |
header.SetUrgentPointer (urgentPointer); |
| 86 |
|
| 87 |
NS_TEST_ASSERT_MSG_EQ (header.GetLength (), 5, "TcpHeader without option is" |
| 77 |
" not 5 word"); |
88 |
" not 5 word"); |
| 78 |
|
89 |
|
| 79 |
m_buffer.AddAtStart (m_header.GetSerializedSize ()); |
90 |
buffer.AddAtStart (header.GetSerializedSize ()); |
| 80 |
m_header.Serialize (m_buffer.Begin ()); |
91 |
header.Serialize (buffer.Begin ()); |
| 81 |
} |
|
|
| 82 |
|
92 |
|
| 83 |
void TcpHeaderGetSetTestCase::DoRun (void) |
93 |
NS_TEST_ASSERT_MSG_EQ (sourcePort, header.GetSourcePort (), |
| 84 |
{ |
|
|
| 85 |
NS_TEST_ASSERT_MSG_EQ (m_sourcePort, m_header.GetSourcePort (), |
| 86 |
"Different source port found"); |
94 |
"Different source port found"); |
| 87 |
NS_TEST_ASSERT_MSG_EQ (m_destinationPort, m_header.GetDestinationPort (), |
95 |
NS_TEST_ASSERT_MSG_EQ (destinationPort, header.GetDestinationPort (), |
| 88 |
"Different destination port found"); |
96 |
"Different destination port found"); |
| 89 |
NS_TEST_ASSERT_MSG_EQ (m_sequenceNumber, m_header.GetSequenceNumber (), |
97 |
NS_TEST_ASSERT_MSG_EQ (sequenceNumber, header.GetSequenceNumber (), |
| 90 |
"Different sequence number found"); |
98 |
"Different sequence number found"); |
| 91 |
NS_TEST_ASSERT_MSG_EQ (m_ackNumber, m_header.GetAckNumber (), |
99 |
NS_TEST_ASSERT_MSG_EQ (ackNumber, header.GetAckNumber (), |
| 92 |
"Different ack number found"); |
100 |
"Different ack number found"); |
| 93 |
NS_TEST_ASSERT_MSG_EQ (m_flags, m_header.GetFlags (), |
101 |
NS_TEST_ASSERT_MSG_EQ (flags, header.GetFlags (), |
| 94 |
"Different flags found"); |
102 |
"Different flags found"); |
| 95 |
NS_TEST_ASSERT_MSG_EQ (m_windowSize, m_header.GetWindowSize (), |
103 |
NS_TEST_ASSERT_MSG_EQ (windowSize, header.GetWindowSize (), |
| 96 |
"Different window size found"); |
104 |
"Different window size found"); |
| 97 |
NS_TEST_ASSERT_MSG_EQ (m_urgentPointer, m_header.GetUrgentPointer (), |
105 |
NS_TEST_ASSERT_MSG_EQ (urgentPointer, header.GetUrgentPointer (), |
| 98 |
"Different urgent pointer found"); |
106 |
"Different urgent pointer found"); |
| 99 |
|
107 |
|
| 100 |
NS_TEST_ASSERT_MSG_EQ (m_header.GetLength (), 5, "TcpHeader without option is" |
108 |
NS_TEST_ASSERT_MSG_EQ (header.GetLength (), 5, "TcpHeader without option is" |
| 101 |
" not 5 word"); |
109 |
" not 5 word"); |
| 102 |
|
110 |
|
| 103 |
TcpHeader copyHeader; |
111 |
TcpHeader copyHeader; |
| 104 |
|
112 |
|
| 105 |
copyHeader.Deserialize (m_buffer.Begin ()); |
113 |
copyHeader.Deserialize (buffer.Begin ()); |
| 106 |
|
114 |
|
| 107 |
NS_TEST_ASSERT_MSG_EQ (m_sourcePort, copyHeader.GetSourcePort (), |
115 |
NS_TEST_ASSERT_MSG_EQ (sourcePort, copyHeader.GetSourcePort (), |
| 108 |
"Different source port found in deserialized header"); |
116 |
"Different source port found in deserialized header"); |
| 109 |
NS_TEST_ASSERT_MSG_EQ (m_destinationPort, copyHeader.GetDestinationPort (), |
117 |
NS_TEST_ASSERT_MSG_EQ (destinationPort, copyHeader.GetDestinationPort (), |
| 110 |
"Different destination port found in deserialized header"); |
118 |
"Different destination port found in deserialized header"); |
| 111 |
NS_TEST_ASSERT_MSG_EQ (m_sequenceNumber, copyHeader.GetSequenceNumber (), |
119 |
NS_TEST_ASSERT_MSG_EQ (sequenceNumber, copyHeader.GetSequenceNumber (), |
| 112 |
"Different sequence number found in deserialized header"); |
120 |
"Different sequence number found in deserialized header"); |
| 113 |
NS_TEST_ASSERT_MSG_EQ (m_ackNumber, copyHeader.GetAckNumber (), |
121 |
NS_TEST_ASSERT_MSG_EQ (ackNumber, copyHeader.GetAckNumber (), |
| 114 |
"Different ack number found in deserialized header"); |
122 |
"Different ack number found in deserialized header"); |
| 115 |
NS_TEST_ASSERT_MSG_EQ (m_flags, copyHeader.GetFlags (), |
123 |
NS_TEST_ASSERT_MSG_EQ (flags, copyHeader.GetFlags (), |
| 116 |
"Different flags found in deserialized header"); |
124 |
"Different flags found in deserialized header"); |
| 117 |
NS_TEST_ASSERT_MSG_EQ (m_windowSize, copyHeader.GetWindowSize (), |
125 |
NS_TEST_ASSERT_MSG_EQ (windowSize, copyHeader.GetWindowSize (), |
| 118 |
"Different window size found in deserialized header"); |
126 |
"Different window size found in deserialized header"); |
| 119 |
NS_TEST_ASSERT_MSG_EQ (m_urgentPointer, copyHeader.GetUrgentPointer (), |
127 |
NS_TEST_ASSERT_MSG_EQ (urgentPointer, copyHeader.GetUrgentPointer (), |
| 120 |
"Different urgent pointer found in deserialized header"); |
128 |
"Different urgent pointer found in deserialized header"); |
|
|
129 |
} |
| 121 |
} |
130 |
} |
| 122 |
|
131 |
|
| 123 |
void TcpHeaderGetSetTestCase::DoTeardown (void) |
132 |
void TcpHeaderGetSetTestCase::DoTeardown (void) |
|
|
| 313 |
|
322 |
|
| 314 |
} |
323 |
} |
| 315 |
|
324 |
|
| 316 |
#define GET_RANDOM_UINT32(RandomVariable) \ |
|
|
| 317 |
static_cast<uint32_t> (RandomVariable->GetInteger (0, UINT32_MAX)) |
| 318 |
|
| 319 |
#define GET_RANDOM_UINT16(RandomVariable) \ |
| 320 |
static_cast<uint16_t> (RandomVariable->GetInteger (0, UINT16_MAX)) |
| 321 |
|
| 322 |
#define GET_RANDOM_UINT8(RandomVariable) \ |
| 323 |
static_cast<uint8_t> (RandomVariable->GetInteger (0, UINT8_MAX)) |
| 324 |
|
| 325 |
#define GET_RANDOM_UINT6(RandomVariable) \ |
| 326 |
static_cast<uint8_t> (RandomVariable->GetInteger (0, UINT8_MAX >> 2)) |
| 327 |
|
| 328 |
static class TcpHeaderTestSuite : public TestSuite |
325 |
static class TcpHeaderTestSuite : public TestSuite |
| 329 |
{ |
326 |
{ |
| 330 |
public: |
327 |
public: |
| 331 |
TcpHeaderTestSuite () |
328 |
TcpHeaderTestSuite () |
| 332 |
: TestSuite ("tcp-header", UNIT) |
329 |
: TestSuite ("tcp-header", UNIT) |
| 333 |
{ |
330 |
{ |
| 334 |
Ptr<UniformRandomVariable> x = CreateObject<UniformRandomVariable> (); |
331 |
AddTestCase (new TcpHeaderGetSetTestCase ("GetSet test cases"), TestCase::QUICK); |
| 335 |
|
332 |
AddTestCase (new TcpHeaderWithRFC793OptionTestCase ("Test for options in RFC 793"), TestCase::QUICK); |
| 336 |
for (uint32_t i = 0; i < 1000; ++i) |
|
|
| 337 |
{ |
| 338 |
std::stringstream ss; |
| 339 |
ss << i; |
| 340 |
|
| 341 |
AddTestCase (new TcpHeaderGetSetTestCase (GET_RANDOM_UINT16 (x), |
| 342 |
GET_RANDOM_UINT16 (x), |
| 343 |
SequenceNumber32 (GET_RANDOM_UINT32 (x)), |
| 344 |
SequenceNumber32 (GET_RANDOM_UINT32 (x)), |
| 345 |
GET_RANDOM_UINT6 (x), |
| 346 |
GET_RANDOM_UINT16 (x), |
| 347 |
GET_RANDOM_UINT16 (x), |
| 348 |
"Case number " + ss.str ()), |
| 349 |
TestCase::QUICK); |
| 350 |
} |
| 351 |
|
| 352 |
AddTestCase (new TcpHeaderWithRFC793OptionTestCase ("Test for options in RFC 793"), |
| 353 |
TestCase::QUICK); |
| 354 |
} |
333 |
} |
| 355 |
|
334 |
|
| 356 |
} g_TcpHeaderTestSuite; |
335 |
} g_TcpHeaderTestSuite; |