26 #include "ns3/pcap-file.h"
37 return ((val >> 8) & 0x00ff) | ((val << 8) & 0xff00);
43 return ((val >> 24) & 0x000000ff) | ((val >> 8) & 0x0000ff00) | ((val << 8) & 0x00ff0000) | ((val << 24) & 0xff000000);
49 FILE * p = fopen (filename.c_str (),
"rb");
63 FILE * p = fopen (filename.c_str (),
"rb");
69 fseek (p, 0, SEEK_END);
71 uint64_t sizeActual = ftell (p);
74 return sizeActual == sizeExpected;
88 virtual void DoSetup (
void);
89 virtual void DoRun (
void);
90 virtual void DoTeardown (
void);
96 :
TestCase (
"Check to see that PcapFile::Open with mode std::ios::out works")
107 std::stringstream filename;
108 uint32_t n = rand ();
134 "Open (" <<
m_testFilename <<
", \"std::ios::out\") does not create file");
136 "Open (" <<
m_testFilename <<
", \"std::ios::out\") does not result in an empty file");
144 ", \"std::ios::out\") returns error");
146 f.
Init (1234, 5678, 7);
152 "Init () does not result in a file with a pcap file header");
160 ", \"std::ios::out\") returns error");
165 "Open (" <<
m_testFilename <<
", \"w\") does not result in an empty file");
174 f.
Init (1234, 5678, 7);
183 memset (buffer, 0,
sizeof(buffer));
184 f.
Write (0, 0, buffer, 128);
201 virtual void DoRun (
void);
208 :
TestCase (
"Check to see that PcapFile::Open with mode \"std::ios::in\" works")
219 std::stringstream filename;
220 uint32_t n = rand ();
241 ", \"std::ios::in\") does not return error");
245 ", \"std::ios::in\") unexpectedly created a file");
259 ", \"std::ios::in\") does not return error");
269 ", \"std::ios::out\") returns error");
271 f.
Init (1234, 5678, 7);
280 ", \"std::ios::in\") returns error");
287 f.
Write (0, 0, buffer, 128);
289 ") does not return error");
299 class AppendModeCreateTestCase :
public TestCase
302 AppendModeCreateTestCase ();
303 virtual ~AppendModeCreateTestCase ();
307 virtual void DoRun (
void);
310 std::string m_testFilename;
313 AppendModeCreateTestCase::AppendModeCreateTestCase ()
314 :
TestCase (
"Check to see that PcapFile::Open with mode \"std::ios::app\" works")
318 AppendModeCreateTestCase::~AppendModeCreateTestCase ()
325 std::stringstream filename;
326 uint32_t n = rand ();
328 m_testFilename = CreateTempDirFilename (filename.str () +
".pcap");
334 remove (m_testFilename.c_str ());
345 f.
Open (m_testFilename, std::ios::out | std::ios::app);
347 ", \"std::ios::app\") does not return error");
352 "Open (" << m_testFilename <<
", \"std::ios::app\") unexpectedly created a file");
357 f.
Open (m_testFilename, std::ios::out);
359 ", \"std::ios::out\") returns error");
365 f.
Open (m_testFilename, std::ios::out | std::ios::app);
367 ", \"std::ios::app\") does not return error");
374 f.
Open (m_testFilename, std::ios::out);
376 ", \"std::ios::out\") returns error");
378 f.
Init (1234, 5678, 7);
385 f.
Open (m_testFilename, std::ios::out | std::ios::app);
387 ", \"std::ios::app\") returns error");
393 memset (buffer, 0,
sizeof(buffer));
394 f.
Write (0, 0, buffer, 128);
413 virtual void DoRun (
void);
420 :
TestCase (
"Check to see that PcapFileHeader is managed correctly")
431 std::stringstream filename;
432 uint32_t n = rand ();
453 ", \"std::ios::out\") returns error");
458 f.
Init (1234, 5678, 7);
460 "Init (1234, 5678, 7) returns error");
495 bool bigEndian = u.b[3];
497 size_t result = fread (&val32,
sizeof(val32), 1, p);
499 if (bigEndian) val32 =
Swap (val32);
502 result = fread (&val16,
sizeof(val16), 1, p);
504 if (bigEndian) val16 =
Swap (val16);
507 result = fread (&val16,
sizeof(val16), 1, p);
509 if (bigEndian) val16 =
Swap (val16);
512 result = fread (&val32,
sizeof(val32), 1, p);
514 if (bigEndian) val32 =
Swap (val32);
517 result = fread (&val32,
sizeof(val32), 1, p);
519 if (bigEndian) val32 =
Swap (val32);
522 result = fread (&val32,
sizeof(val32), 1, p);
524 if (bigEndian) val32 =
Swap (val32);
527 result = fread (&val32,
sizeof(val32), 1, p);
529 if (bigEndian) val32 =
Swap (val32);
546 ", \"std::ios::in\") returns error");
562 ", \"std::ios::out\") returns error");
572 f.
Init (1234, 5678, 7,
true);
583 result = fread (&val32,
sizeof(val32), 1, p);
587 result = fread (&val16,
sizeof(val16), 1, p);
591 result = fread (&val16,
sizeof(val16), 1, p);
595 result = fread (&val32,
sizeof(val32), 1, p);
599 result = fread (&val32,
sizeof(val32), 1, p);
603 result = fread (&val32,
sizeof(val32), 1, p);
607 result = fread (&val32,
sizeof(val32), 1, p);
623 ", \"std::ios::in\") returns error");
650 virtual void DoRun (
void);
657 :
TestCase (
"Check to see that PcapRecordHeader is managed correctly")
668 std::stringstream filename;
669 uint32_t n = rand ();
690 ", \"std::ios::out\") returns error");
701 uint8_t bufferOut[128];
702 for (uint32_t i = 0; i < 128; ++i)
712 f.
Write (1234, 5678, bufferOut, 128);
728 fseek (p, 0, SEEK_END);
729 uint64_t size = ftell (p);
737 fseek (p, 24, SEEK_SET);
764 bool bigEndian = u.b[3];
766 size_t result = fread (&val32,
sizeof(val32), 1, p);
768 if (bigEndian) val32 =
Swap (val32);
771 result = fread (&val32,
sizeof(val32), 1, p);
773 if (bigEndian) val32 =
Swap (val32);
776 result = fread (&val32,
sizeof(val32), 1, p);
778 if (bigEndian) val32 =
Swap (val32);
781 result = fread (&val32,
sizeof(val32), 1, p);
783 if (bigEndian) val32 =
Swap (val32);
790 uint8_t bufferIn[128];
792 result = fread (bufferIn, 1, 43, p);
795 for (uint32_t i = 0; i < 43; ++i)
809 ", \"std::ios::in\") of existing good file returns error");
811 uint32_t tsSec, tsUsec, inclLen, origLen, readLen;
813 f.
Read (bufferIn,
sizeof(bufferIn), tsSec, tsUsec, inclLen, origLen, readLen);
816 NS_TEST_ASSERT_MSG_EQ (tsUsec, 5678,
"Incorrectly read microseconds timestap from known good packet");
819 NS_TEST_ASSERT_MSG_EQ (readLen, 43,
"Incorrectly constructed actual read length from known good packet given buffer size");
825 for (uint32_t i = 0; i < 43; ++i)
827 NS_TEST_ASSERT_MSG_EQ (bufferIn[i], bufferOut[i],
"Incorrect packet data read from known good packet");
841 ", \"std::ios::out\") returns error");
846 f.
Init (37, 43, -7,
true);
854 f.
Write (1234, 5678, bufferOut, 128);
870 fseek (p, 0, SEEK_END);
879 fseek (p, 24, SEEK_SET);
881 result = fread (&val32,
sizeof(val32), 1, p);
885 result = fread (&val32,
sizeof(val32), 1, p);
889 result = fread (&val32,
sizeof(val32), 1, p);
893 result = fread (&val32,
sizeof(val32), 1, p);
901 result = fread (bufferIn, 1, 43, p);
904 for (uint32_t i = 0; i < 43; ++i)
919 ", \"std::ios::in\") of existing good file returns error");
921 f.
Read (bufferIn,
sizeof(bufferIn), tsSec, tsUsec, inclLen, origLen, readLen);
924 NS_TEST_ASSERT_MSG_EQ (tsUsec, 5678,
"Incorrectly read microseconds timestap from known good packet");
927 NS_TEST_ASSERT_MSG_EQ (readLen, 43,
"Incorrectly constructed actual read length from known good packet given buffer size");
932 for (uint32_t i = 0; i < 43; ++i)
934 NS_TEST_ASSERT_MSG_EQ (bufferIn[i], bufferOut[i],
"Incorrect packet data read from known good packet");
952 virtual void DoRun (
void);
959 :
TestCase (
"Check to see that PcapFile can read out a known good pcap file")
980 typedef struct PACKET_ENTRY {
989 { 2, 3696, 46, 46, { 0x0001, 0x0800, 0x0604, 0x0001, 0x0000, 0x0000, 0x0003, 0x0a01,
990 0x0201, 0xffff, 0xffff, 0xffff, 0x0a01, 0x0204, 0x0000, 0x0000}},
991 { 2, 3707, 46, 46, { 0x0001, 0x0800, 0x0604, 0x0002, 0x0000, 0x0000, 0x0006, 0x0a01,
992 0x0204, 0x0000, 0x0000, 0x0003, 0x0a01, 0x0201, 0x0000, 0x0000}},
993 { 2, 3801, 1070, 1070, { 0x4500, 0x041c, 0x0000, 0x0000, 0x3f11, 0x0000, 0x0a01, 0x0101,
994 0x0a01, 0x0204, 0xc001, 0x0009, 0x0408, 0x0000, 0x0000, 0x0000}},
995 { 2, 3811, 46, 46, { 0x0001, 0x0800, 0x0604, 0x0001, 0x0000, 0x0000, 0x0006, 0x0a01,
996 0x0204, 0xffff, 0xffff, 0xffff, 0x0a01, 0x0201, 0x0000, 0x0000}},
997 { 2, 3822, 46, 46, { 0x0001, 0x0800, 0x0604, 0x0002, 0x0000, 0x0000, 0x0003, 0x0a01,
998 0x0201, 0x0000, 0x0000, 0x0006, 0x0a01, 0x0204, 0x0000, 0x0000}},
999 { 2, 3915, 1070, 1070, { 0x4500, 0x041c, 0x0000, 0x0000, 0x4011, 0x0000, 0x0a01, 0x0204,
1000 0x0a01, 0x0101, 0x0009, 0xc001, 0x0408, 0x0000, 0x0000, 0x0000}}
1012 f.
Open (filename, std::ios::in);
1014 ", \"std::ios::in\") returns error");
1025 uint32_t tsSec, tsUsec, inclLen, origLen, readLen;
1031 f.
Read (data,
sizeof(data), tsSec, tsUsec, inclLen, origLen, readLen);
1044 f.
Read (data, 1, tsSec, tsUsec, inclLen, origLen, readLen);
1059 virtual void DoRun (
void);
1063 :
TestCase (
"Check that PcapFile::Diff works as expected")
1074 uint32_t sec (0), usec (0);
1075 bool diff = PcapFile::Diff (filename, filename, sec, usec);
1081 std::string filename2 =
"different.pcap";
1084 f.
Open (filename2, std::ios::out);
1098 diff = PcapFile::Diff (filename, filename2, sec, usec);