@@ -99,88 +99,106 @@ PTF_TEST_CASE(TestPcapFileReadWrite)
9999 PTF_ASSERT_FALSE (readerDev2.isOpened ());
100100} // TestPcapFileReadWrite
101101
102- PTF_TEST_CASE (TestPcapFilePrecision )
102+ PTF_TEST_CASE (TestPcapFileMicroPrecision )
103103{
104104 std::array<uint8_t , 16 > testPayload = { 0x00 , 0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 ,
105105 0x08 , 0x09 , 0x0A , 0x0B , 0x0C , 0x0D , 0x0E , 0x0F };
106- pcpp::RawPacket rawPacketNano (testPayload. data (), testPayload. size (), timespec ({ 1 , 1234 }), false ); // 1.000001234
106+
107107 pcpp::RawPacket rawPacketMicro (testPayload.data (), testPayload.size (), timeval ({ 1 , 2 }), false ); // 1.000002000
108+ pcpp::RawPacket rawPacketNano (testPayload.data (), testPayload.size (), timespec ({ 1 , 1234 }), false ); // 1.000001234
109+
110+ // Write micro precision file
111+ pcpp::PcapFileWriterDevice writerDevMicro (EXAMPLE_PCAP_MICRO_WRITE_PATH , pcpp::LINKTYPE_ETHERNET , false );
112+ PTF_ASSERT_EQUAL (writerDevMicro.getTimestampPrecision (), pcpp::FileTimestampPrecision::Microseconds, enumclass);
113+ PTF_ASSERT_TRUE (writerDevMicro.open ());
114+ PTF_ASSERT_EQUAL (writerDevMicro.getTimestampPrecision (), pcpp::FileTimestampPrecision::Microseconds, enumclass);
115+
116+ // File precision should remain Micro. Nano precision will be truncated to micro precision.
117+ PTF_ASSERT_TRUE (writerDevMicro.writePacket (rawPacketMicro));
118+ PTF_ASSERT_TRUE (writerDevMicro.writePacket (rawPacketNano));
119+ writerDevMicro.close ();
120+
121+ pcpp::FileTimestampPrecision expectedPrecision = pcpp::PcapFileWriterDevice::isNanoSecondPrecisionSupported ()
122+ ? pcpp::FileTimestampPrecision::Nanoseconds
123+ : pcpp::FileTimestampPrecision::Microseconds;
124+
125+ // Read micro precision file, both original and written
126+ for (auto const path : { EXAMPLE_PCAP_MICRO_PATH , EXAMPLE_PCAP_MICRO_WRITE_PATH })
127+ {
128+ // Read micro precision file
129+ pcpp::PcapFileReaderDevice readerDevMicro (path);
130+ PTF_ASSERT_EQUAL (readerDevMicro.getTimestampPrecision (), pcpp::FileTimestampPrecision::Unknown, enumclass);
131+ PTF_ASSERT_TRUE (readerDevMicro.open ());
132+ PTF_ASSERT_EQUAL (readerDevMicro.getTimestampPrecision (), expectedPrecision, enumclass);
133+
134+ pcpp::RawPacket readPacketNano2, readPacketMicro2;
135+ PTF_ASSERT_TRUE (readerDevMicro.getNextPacket (readPacketMicro2));
136+ PTF_ASSERT_EQUAL (readPacketMicro2.getPacketTimeStamp ().tv_sec , 1 );
137+ PTF_ASSERT_EQUAL (readPacketMicro2.getPacketTimeStamp ().tv_nsec , 2000 );
138+
139+ PTF_ASSERT_TRUE (readerDevMicro.getNextPacket (readPacketNano2));
140+ PTF_ASSERT_EQUAL (readPacketNano2.getPacketTimeStamp ().tv_sec , 1 );
141+ PTF_ASSERT_EQUAL (readPacketNano2.getPacketTimeStamp ().tv_nsec , 1000 );
142+ readerDevMicro.close ();
143+ }
144+ } // TestPcapFileMicroPrecision
108145
146+ PTF_TEST_CASE (TestPcapFileNanoPrecision)
147+ {
109148 // Writer precision support should equal to reader precision support
110149 PTF_ASSERT_EQUAL (pcpp::PcapFileWriterDevice::isNanoSecondPrecisionSupported (),
111150 pcpp::PcapFileReaderDevice::isNanoSecondPrecisionSupported ());
112151
152+ if (!pcpp::PcapFileWriterDevice::isNanoSecondPrecisionSupported ())
153+ {
154+ PTF_PRINT_VERBOSE (" Pcap nano precision is not supported on the current platform! "
155+ " The test will check for proper failure messages.\n " );
156+ PTF_ASSERT_RAISES (pcpp::PcapFileWriterDevice (EXAMPLE_PCAP_NANO_WRITE_PATH , pcpp::LINKTYPE_ETHERNET , true ),
157+ std::runtime_error,
158+ " PcapPlusPlus was compiled without nano precision support which requires libpcap > 1.5.1. "
159+ " Please recompile PcapPlusPlus with nano precision support to use this feature." );
160+
161+ pcpp::PcapFileReaderDevice readerDevNano (EXAMPLE_PCAP_NANO_PATH );
162+ PTF_ASSERT_FALSE (readerDevNano.open ());
163+ return ;
164+ }
165+
166+ std::array<uint8_t , 16 > testPayload = { 0x00 , 0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 ,
167+ 0x08 , 0x09 , 0x0A , 0x0B , 0x0C , 0x0D , 0x0E , 0x0F };
168+
169+ pcpp::RawPacket rawPacketMicro (testPayload.data (), testPayload.size (), timeval ({ 1 , 2 }), false ); // 1.000002000
170+ pcpp::RawPacket rawPacketNano (testPayload.data (), testPayload.size (), timespec ({ 1 , 1234 }), false ); // 1.000001234
171+
113172 // Write nano precision file
114- pcpp::Logger::getInstance ().suppressLogs ();
115- pcpp::PcapFileWriterDevice writerDevNano (EXAMPLE_PCAP_NANO_PATH , pcpp::LINKTYPE_ETHERNET , true );
116- pcpp::Logger::getInstance ().enableLogs ();
117- PTF_ASSERT_EQUAL (writerDevNano.getTimestampPrecision (),
118- pcpp::PcapFileWriterDevice::isNanoSecondPrecisionSupported ()
119- ? pcpp::FileTimestampPrecision::Nanoseconds
120- : pcpp::FileTimestampPrecision::Microseconds,
121- enumclass);
173+ pcpp::PcapFileWriterDevice writerDevNano (EXAMPLE_PCAP_NANO_WRITE_PATH , pcpp::LINKTYPE_ETHERNET , true );
174+ PTF_ASSERT_EQUAL (writerDevNano.getTimestampPrecision (), pcpp::FileTimestampPrecision::Nanoseconds, enumclass);
122175 PTF_ASSERT_TRUE (writerDevNano.open ());
123- PTF_ASSERT_EQUAL (writerDevNano.getTimestampPrecision (),
124- pcpp::PcapFileWriterDevice::isNanoSecondPrecisionSupported ()
125- ? pcpp::FileTimestampPrecision::Nanoseconds
126- : pcpp::FileTimestampPrecision::Microseconds,
127- enumclass);
176+ PTF_ASSERT_EQUAL (writerDevNano.getTimestampPrecision (), pcpp::FileTimestampPrecision::Nanoseconds, enumclass);
177+
178+ // File precision should remain Nano. Micro precision packet will be scaled to Nano precision.
128179 PTF_ASSERT_TRUE (writerDevNano.writePacket (rawPacketMicro));
129180 PTF_ASSERT_TRUE (writerDevNano.writePacket (rawPacketNano));
130181 writerDevNano.close ();
131182
132- // Write micro precision file
133- pcpp::PcapFileWriterDevice writerDevMicro (EXAMPLE_PCAP_MICRO_PATH , pcpp::LINKTYPE_ETHERNET , false );
134- PTF_ASSERT_EQUAL (writerDevMicro.getTimestampPrecision (), pcpp::FileTimestampPrecision::Microseconds, enumclass);
135- PTF_ASSERT_TRUE (writerDevMicro.open ());
136- PTF_ASSERT_EQUAL (writerDevMicro.getTimestampPrecision (), pcpp::FileTimestampPrecision::Microseconds, enumclass);
137- PTF_ASSERT_TRUE (writerDevMicro.writePacket (rawPacketMicro));
138- PTF_ASSERT_TRUE (writerDevMicro.writePacket (rawPacketNano));
139- writerDevMicro.close ();
140-
141- // Read nano precision file
142- pcpp::PcapFileReaderDevice readerDevNano (EXAMPLE_PCAP_NANO_PATH );
143- PTF_ASSERT_EQUAL (readerDevNano.getTimestampPrecision (), pcpp::FileTimestampPrecision::Unknown, enumclass);
144- PTF_ASSERT_TRUE (readerDevNano.open ());
145- PTF_ASSERT_EQUAL (readerDevNano.getTimestampPrecision (),
146- pcpp::PcapFileReaderDevice::isNanoSecondPrecisionSupported ()
147- ? pcpp::FileTimestampPrecision::Nanoseconds
148- : pcpp::FileTimestampPrecision::Microseconds,
149- enumclass);
150-
151- pcpp::RawPacket readPacketNano, readPacketMicro;
152- PTF_ASSERT_TRUE (readerDevNano.getNextPacket (readPacketMicro));
153- PTF_ASSERT_EQUAL (readPacketMicro.getPacketTimeStamp ().tv_sec , 1 );
154- PTF_ASSERT_EQUAL (readPacketMicro.getPacketTimeStamp ().tv_nsec , 2000 );
155-
156- PTF_ASSERT_TRUE (readerDevNano.getNextPacket (readPacketNano));
157- PTF_ASSERT_EQUAL (readPacketNano.getPacketTimeStamp ().tv_sec , 1 );
158- PTF_ASSERT_EQUAL (readPacketNano.getPacketTimeStamp ().tv_nsec ,
159- pcpp::PcapFileReaderDevice::isNanoSecondPrecisionSupported () ? 1234 : 1000 );
160-
161- readerDevNano.close ();
162-
163- // Read micro precision file
164- pcpp::PcapFileReaderDevice readerDevMicro (EXAMPLE_PCAP_MICRO_PATH );
165- PTF_ASSERT_EQUAL (readerDevMicro.getTimestampPrecision (), pcpp::FileTimestampPrecision::Unknown, enumclass);
166- PTF_ASSERT_TRUE (readerDevMicro.open ());
167- PTF_ASSERT_EQUAL (readerDevMicro.getTimestampPrecision (),
168- pcpp::PcapFileReaderDevice::isNanoSecondPrecisionSupported ()
169- ? pcpp::FileTimestampPrecision::Nanoseconds
170- : pcpp::FileTimestampPrecision::Microseconds,
171- enumclass);
172-
173- pcpp::RawPacket readPacketNano2, readPacketMicro2;
174- PTF_ASSERT_TRUE (readerDevMicro.getNextPacket (readPacketMicro2));
175- PTF_ASSERT_EQUAL (readPacketMicro2.getPacketTimeStamp ().tv_sec , 1 );
176- PTF_ASSERT_EQUAL (readPacketMicro2.getPacketTimeStamp ().tv_nsec , 2000 );
177-
178- PTF_ASSERT_TRUE (readerDevMicro.getNextPacket (readPacketNano2));
179- PTF_ASSERT_EQUAL (readPacketNano2.getPacketTimeStamp ().tv_sec , 1 );
180- PTF_ASSERT_EQUAL (readPacketNano2.getPacketTimeStamp ().tv_nsec , 1000 );
181-
182- readerDevMicro.close ();
183- } // TestPcapFilePrecision
183+ // Read nano precision file, both original and written
184+ for (auto const path : { EXAMPLE_PCAP_NANO_PATH , EXAMPLE_PCAP_NANO_WRITE_PATH })
185+ {
186+ pcpp::PcapFileReaderDevice readerDevNano (path);
187+ PTF_ASSERT_EQUAL (readerDevNano.getTimestampPrecision (), pcpp::FileTimestampPrecision::Unknown, enumclass);
188+ PTF_ASSERT_TRUE (readerDevNano.open ());
189+ PTF_ASSERT_EQUAL (readerDevNano.getTimestampPrecision (), pcpp::FileTimestampPrecision::Nanoseconds, enumclass);
190+
191+ pcpp::RawPacket readPacketNano, readPacketMicro;
192+ PTF_ASSERT_TRUE (readerDevNano.getNextPacket (readPacketMicro));
193+ PTF_ASSERT_EQUAL (readPacketMicro.getPacketTimeStamp ().tv_sec , 1 );
194+ PTF_ASSERT_EQUAL (readPacketMicro.getPacketTimeStamp ().tv_nsec , 2000 );
195+
196+ PTF_ASSERT_TRUE (readerDevNano.getNextPacket (readPacketNano));
197+ PTF_ASSERT_EQUAL (readPacketNano.getPacketTimeStamp ().tv_sec , 1 );
198+ PTF_ASSERT_EQUAL (readPacketNano.getPacketTimeStamp ().tv_nsec , 1234 );
199+ readerDevNano.close ();
200+ }
201+ } // TestPcapFileNanoPrecision
184202
185203PTF_TEST_CASE (TestPcapNgFilePrecision)
186204{
0 commit comments