PROFINET IO Controller Stack 1.0.0
Modern C++ implementation of a PROFINET IO Controller stack
Loading...
Searching...
No Matches
test_wire.cpp
Go to the documentation of this file.
1
12
13#include <gtest/gtest.h>
14
15#include <array>
16#include <cstdint>
17#include <string>
18#include <vector>
19
20#include "profinet/wire.h"
21
22namespace profinet::wire
23{
24
26TEST(WireWriterTest, PutBigEndianU8)
27{
28 std::vector<std::uint8_t> data;
29
30 PutBigEndian<std::uint8_t>(data, 0x42U);
31
32 EXPECT_EQ(data, (std::vector<std::uint8_t>{0x42U}));
33}
34
37TEST(WireWriterTest, PutBigEndianU16)
38{
39 std::vector<std::uint8_t> data;
40
41 PutBigEndian<std::uint16_t>(data, 0x1234U);
42
43 EXPECT_EQ(data, (std::vector<std::uint8_t>{0x12U, 0x34U}));
44}
45
48TEST(WireWriterTest, PutBigEndianU32)
49{
50 std::vector<std::uint8_t> data;
51
52 PutBigEndian<std::uint32_t>(data, 0x12345678U);
53
54 EXPECT_EQ(
55 data,
56 (std::vector<std::uint8_t>{
57 0x12U,
58 0x34U,
59 0x56U,
60 0x78U,
61 }));
62}
63
66TEST(WireWriterTest, PutBigEndianU64)
67{
68 std::vector<std::uint8_t> data;
69
70 PutBigEndian<std::uint64_t>(data, 0x0123456789ABCDEFULL);
71
72 EXPECT_EQ(
73 data,
74 (std::vector<std::uint8_t>{
75 0x01U,
76 0x23U,
77 0x45U,
78 0x67U,
79 0x89U,
80 0xABU,
81 0xCDU,
82 0xEFU,
83 }));
84}
85
87TEST(WireWriterTest, PutBigEndianZero)
88{
89 std::vector<std::uint8_t> data;
90
91 PutBigEndian<std::uint32_t>(data, 0U);
92
93 EXPECT_EQ(
94 data,
95 (std::vector<std::uint8_t>{
96 0x00U,
97 0x00U,
98 0x00U,
99 0x00U,
100 }));
101}
102
104TEST(WireWriterTest, PutBigEndianMaximumU32)
105{
106 std::vector<std::uint8_t> data;
107
108 PutBigEndian<std::uint32_t>(data, UINT32_MAX);
109
110 EXPECT_EQ(
111 data,
112 (std::vector<std::uint8_t>{
113 0xFFU,
114 0xFFU,
115 0xFFU,
116 0xFFU,
117 }));
118}
119
122TEST(WireWriterTest, PutBigEndianAppends)
123{
124 std::vector<std::uint8_t> data = {
125 0xAAU,
126 0xBBU,
127 };
128
129 PutBigEndian<std::uint16_t>(data, 0x1234U);
130
131 EXPECT_EQ(
132 data,
133 (std::vector<std::uint8_t>{
134 0xAAU,
135 0xBBU,
136 0x12U,
137 0x34U,
138 }));
139}
140
142TEST(WireWriterTest, PutLittleEndianU8)
143{
144 std::vector<std::uint8_t> data;
145
146 PutLittleEndian<std::uint8_t>(data, 0x42U);
147
148 EXPECT_EQ(data, (std::vector<std::uint8_t>{0x42U}));
149}
150
153TEST(WireWriterTest, PutLittleEndianU16)
154{
155 std::vector<std::uint8_t> data;
156
157 PutLittleEndian<std::uint16_t>(data, 0x1234U);
158
159 EXPECT_EQ(data, (std::vector<std::uint8_t>{0x34U, 0x12U}));
160}
161
164TEST(WireWriterTest, PutLittleEndianU32)
165{
166 std::vector<std::uint8_t> data;
167
168 PutLittleEndian<std::uint32_t>(data, 0x12345678U);
169
170 EXPECT_EQ(
171 data,
172 (std::vector<std::uint8_t>{
173 0x78U,
174 0x56U,
175 0x34U,
176 0x12U,
177 }));
178}
179
182TEST(WireWriterTest, PutLittleEndianU64)
183{
184 std::vector<std::uint8_t> data;
185
186 PutLittleEndian<std::uint64_t>(data, 0x0123456789ABCDEFULL);
187
188 EXPECT_EQ(
189 data,
190 (std::vector<std::uint8_t>{
191 0xEFU,
192 0xCDU,
193 0xABU,
194 0x89U,
195 0x67U,
196 0x45U,
197 0x23U,
198 0x01U,
199 }));
200}
201
203TEST(WireWriterTest, PutLittleEndianZero)
204{
205 std::vector<std::uint8_t> data;
206
207 PutLittleEndian<std::uint32_t>(data, 0U);
208
209 EXPECT_EQ(
210 data,
211 (std::vector<std::uint8_t>{
212 0x00U,
213 0x00U,
214 0x00U,
215 0x00U,
216 }));
217}
218
220TEST(WireWriterTest, PutLittleEndianMaximumU32)
221{
222 std::vector<std::uint8_t> data;
223
224 PutLittleEndian<std::uint32_t>(data, UINT32_MAX);
225
226 EXPECT_EQ(
227 data,
228 (std::vector<std::uint8_t>{
229 0xFFU,
230 0xFFU,
231 0xFFU,
232 0xFFU,
233 }));
234}
235
238TEST(WireWriterTest, PutLittleEndianAppends)
239{
240 std::vector<std::uint8_t> data = {
241 0xAAU,
242 0xBBU,
243 };
244
245 PutLittleEndian<std::uint16_t>(data, 0x1234U);
246
247 EXPECT_EQ(
248 data,
249 (std::vector<std::uint8_t>{
250 0xAAU,
251 0xBBU,
252 0x34U,
253 0x12U,
254 }));
255}
256
259TEST(WireWriterTest, PutLittleEndianPointerU16)
260{
261 std::array<std::uint8_t, 4U> data = {
262 0xAAU,
263 0xBBU,
264 0xCCU,
265 0xDDU,
266 };
267
268 PutLittleEndian<std::uint16_t>(data.data() + 1U, 0x1234U);
269
270 EXPECT_EQ(
271 data,
272 (std::array<std::uint8_t, 4U>{
273 0xAAU,
274 0x34U,
275 0x12U,
276 0xDDU,
277 }));
278}
279
282TEST(WireWriterTest, PutLittleEndianPointerU32)
283{
284 std::array<std::uint8_t, 6U> data = {
285 0xAAU,
286 0xBBU,
287 0xCCU,
288 0xDDU,
289 0xEEU,
290 0xFFU,
291 };
292
293 PutLittleEndian<std::uint32_t>(data.data() + 1U, 0x12345678U);
294
295 EXPECT_EQ(
296 data,
297 (std::array<std::uint8_t, 6U>{
298 0xAAU,
299 0x78U,
300 0x56U,
301 0x34U,
302 0x12U,
303 0xFFU,
304 }));
305}
306
308TEST(WireWriterTest, PutU8)
309{
310 std::vector<std::uint8_t> data = {0xAAU};
311
312 PutU8(data, 0x42U);
313
314 EXPECT_EQ(data, (std::vector<std::uint8_t>{0xAAU, 0x42U}));
315}
316
319TEST(WireWriterTest, PutU16)
320{
321 std::vector<std::uint8_t> data;
322
323 PutU16(data, 0x1234U);
324
325 EXPECT_EQ(data, (std::vector<std::uint8_t>{0x12U, 0x34U}));
326}
327
330TEST(WireWriterTest, PutU32)
331{
332 std::vector<std::uint8_t> data;
333
334 PutU32(data, 0x12345678U);
335
336 EXPECT_EQ(
337 data,
338 (std::vector<std::uint8_t>{
339 0x12U,
340 0x34U,
341 0x56U,
342 0x78U,
343 }));
344}
345
347TEST(WireWriterTest, PutBytes)
348{
349 const std::array<std::uint8_t, 3U> source = {
350 0x10U,
351 0x20U,
352 0x30U,
353 };
354 std::vector<std::uint8_t> data = {0xAAU};
355
356 PutBytes(data, source.data(), source.size());
357
358 EXPECT_EQ(
359 data,
360 (std::vector<std::uint8_t>{
361 0xAAU,
362 0x10U,
363 0x20U,
364 0x30U,
365 }));
366}
367
370TEST(WireWriterTest, PutBytesZeroLength)
371{
372 const std::array<std::uint8_t, 1U> source = {0x42U};
373 std::vector<std::uint8_t> data = {0xAAU};
374
375 PutBytes(data, source.data(), 0U);
376
377 EXPECT_EQ(data, (std::vector<std::uint8_t>{0xAAU}));
378}
379
381TEST(WireWriterTest, PutFixedArray)
382{
383 const std::array<std::uint8_t, 3U> source = {
384 0x10U,
385 0x20U,
386 0x30U,
387 };
388 std::vector<std::uint8_t> data = {0xAAU};
389
390 PutFixed(data, source);
391
392 EXPECT_EQ(
393 data,
394 (std::vector<std::uint8_t>{
395 0xAAU,
396 0x10U,
397 0x20U,
398 0x30U,
399 }));
400}
401
403TEST(WireWriterTest, PutFixedEmptyArray)
404{
405 const std::array<std::uint8_t, 0U> source{};
406 std::vector<std::uint8_t> data = {0xAAU};
407
408 PutFixed(data, source);
409
410 EXPECT_EQ(data, (std::vector<std::uint8_t>{0xAAU}));
411}
412
414TEST(WireWriterTest, PutFixedVector)
415{
416 const std::vector<std::uint8_t> source = {
417 0x10U,
418 0x20U,
419 0x30U,
420 };
421 std::vector<std::uint8_t> data = {0xAAU};
422
423 PutFixed(data, source);
424
425 EXPECT_EQ(
426 data,
427 (std::vector<std::uint8_t>{
428 0xAAU,
429 0x10U,
430 0x20U,
431 0x30U,
432 }));
433}
434
436TEST(WireWriterTest, PutFixedEmptyVector)
437{
438 const std::vector<std::uint8_t> source;
439 std::vector<std::uint8_t> data = {0xAAU};
440
441 PutFixed(data, source);
442
443 EXPECT_EQ(data, (std::vector<std::uint8_t>{0xAAU}));
444}
445
448TEST(WireWriterTest, PutFixedString)
449{
450 const std::string source = "ABC";
451 std::vector<std::uint8_t> data;
452
453 PutFixed(data, source);
454
455 EXPECT_EQ(
456 data,
457 (std::vector<std::uint8_t>{
458 0x41U,
459 0x42U,
460 0x43U,
461 }));
462}
463
465TEST(WireWriterTest, PutFixedEmptyString)
466{
467 const std::string source;
468 std::vector<std::uint8_t> data = {0xAAU};
469
470 PutFixed(data, source);
471
472 EXPECT_EQ(data, (std::vector<std::uint8_t>{0xAAU}));
473}
474
476TEST(WireReaderTest, ReadBigEndianU8)
477{
478 const std::array<std::uint8_t, 1U> data = {0x42U};
479
480 EXPECT_EQ(ReadBigEndian<std::uint8_t>(data.data()), 0x42U);
481}
482
484TEST(WireReaderTest, ReadBigEndianU16)
485{
486 const std::array<std::uint8_t, 2U> data = {
487 0x12U,
488 0x34U,
489 };
490
491 EXPECT_EQ(ReadBigEndian<std::uint16_t>(data.data()), 0x1234U);
492}
493
495TEST(WireReaderTest, ReadBigEndianU32)
496{
497 const std::array<std::uint8_t, 4U> data = {
498 0x12U,
499 0x34U,
500 0x56U,
501 0x78U,
502 };
503
504 EXPECT_EQ(ReadBigEndian<std::uint32_t>(data.data()), 0x12345678U);
505}
506
508TEST(WireReaderTest, ReadBigEndianU64)
509{
510 const std::array<std::uint8_t, 8U> data = {
511 0x01U,
512 0x23U,
513 0x45U,
514 0x67U,
515 0x89U,
516 0xABU,
517 0xCDU,
518 0xEFU,
519 };
520
521 EXPECT_EQ(
522 ReadBigEndian<std::uint64_t>(data.data()),
523 0x0123456789ABCDEFULL);
524}
525
527TEST(WireReaderTest, ReadBigEndianZero)
528{
529 const std::array<std::uint8_t, 4U> data = {
530 0x00U,
531 0x00U,
532 0x00U,
533 0x00U,
534 };
535
536 EXPECT_EQ(ReadBigEndian<std::uint32_t>(data.data()), 0U);
537}
538
540TEST(WireReaderTest, ReadBigEndianMaximumU32)
541{
542 const std::array<std::uint8_t, 4U> data = {
543 0xFFU,
544 0xFFU,
545 0xFFU,
546 0xFFU,
547 };
548
549 EXPECT_EQ(ReadBigEndian<std::uint32_t>(data.data()), UINT32_MAX);
550}
551
553TEST(WireReaderTest, ReadLittleEndianU8)
554{
555 const std::array<std::uint8_t, 1U> data = {0x42U};
556
557 EXPECT_EQ(ReadLittleEndian<std::uint8_t>(data.data()), 0x42U);
558}
559
561TEST(WireReaderTest, ReadLittleEndianU16)
562{
563 const std::array<std::uint8_t, 2U> data = {
564 0x34U,
565 0x12U,
566 };
567
568 EXPECT_EQ(ReadLittleEndian<std::uint16_t>(data.data()), 0x1234U);
569}
570
572TEST(WireReaderTest, ReadLittleEndianU32)
573{
574 const std::array<std::uint8_t, 4U> data = {
575 0x78U,
576 0x56U,
577 0x34U,
578 0x12U,
579 };
580
581 EXPECT_EQ(ReadLittleEndian<std::uint32_t>(data.data()), 0x12345678U);
582}
583
585TEST(WireReaderTest, ReadLittleEndianU64)
586{
587 const std::array<std::uint8_t, 8U> data = {
588 0xEFU,
589 0xCDU,
590 0xABU,
591 0x89U,
592 0x67U,
593 0x45U,
594 0x23U,
595 0x01U,
596 };
597
598 EXPECT_EQ(
599 ReadLittleEndian<std::uint64_t>(data.data()),
600 0x0123456789ABCDEFULL);
601}
602
604TEST(WireReaderTest, ReadLittleEndianZero)
605{
606 const std::array<std::uint8_t, 4U> data = {
607 0x00U,
608 0x00U,
609 0x00U,
610 0x00U,
611 };
612
613 EXPECT_EQ(ReadLittleEndian<std::uint32_t>(data.data()), 0U);
614}
615
617TEST(WireReaderTest, ReadLittleEndianMaximumU32)
618{
619 const std::array<std::uint8_t, 4U> data = {
620 0xFFU,
621 0xFFU,
622 0xFFU,
623 0xFFU,
624 };
625
626 EXPECT_EQ(ReadLittleEndian<std::uint32_t>(data.data()), UINT32_MAX);
627}
628
630TEST(WireReaderTest, ReaderReadsU8)
631{
632 const std::vector<std::uint8_t> data = {0x42U};
633
634 Reader reader(data);
635
636 EXPECT_EQ(reader.U8(), 0x42U);
637 EXPECT_EQ(reader.Position(), 1U);
638 EXPECT_EQ(reader.Remaining(), 0U);
639}
640
642TEST(WireReaderTest, ReaderRejectsU8PastEnd)
643{
644 const std::vector<std::uint8_t> data;
645
646 Reader reader(data);
647
648 EXPECT_THROW((void)reader.U8(), std::out_of_range);
649 EXPECT_EQ(reader.Position(), 0U);
650 EXPECT_EQ(reader.Remaining(), 0U);
651}
652
655TEST(WireReaderTest, ReaderReadsBigEndianU16)
656{
657 const std::vector<std::uint8_t> data = {
658 0x12U,
659 0x34U,
660 0x56U,
661 };
662
663 Reader reader(data);
664
665 EXPECT_EQ(reader.U16(), 0x1234U);
666 EXPECT_EQ(reader.Position(), 2U);
667 EXPECT_EQ(reader.Remaining(), 1U);
668}
669
672TEST(WireReaderTest, ReaderReadsBigEndianU32)
673{
674 const std::vector<std::uint8_t> data = {
675 0x12U,
676 0x34U,
677 0x56U,
678 0x78U,
679 0x90U,
680 };
681
682 Reader reader(data);
683
684 EXPECT_EQ(reader.U32(), 0x12345678U);
685 EXPECT_EQ(reader.Position(), 4U);
686 EXPECT_EQ(reader.Remaining(), 1U);
687}
688
691TEST(WireReaderTest, ReaderReadsLittleEndianU16)
692{
693 const std::vector<std::uint8_t> data = {
694 0x34U,
695 0x12U,
696 0x56U,
697 };
698
699 Reader reader(data);
700
701 EXPECT_EQ(reader.U16LittleEndian(), 0x1234U);
702 EXPECT_EQ(reader.Position(), 2U);
703 EXPECT_EQ(reader.Remaining(), 1U);
704}
705
708TEST(WireReaderTest, ReaderReadsLittleEndianU32)
709{
710 const std::vector<std::uint8_t> data = {
711 0x78U,
712 0x56U,
713 0x34U,
714 0x12U,
715 0x90U,
716 };
717
718 Reader reader(data);
719
720 EXPECT_EQ(reader.U32LittleEndian(), 0x12345678U);
721 EXPECT_EQ(reader.Position(), 4U);
722 EXPECT_EQ(reader.Remaining(), 1U);
723}
724
727TEST(WireReaderTest, ReaderReadsConsecutiveLittleEndianValues)
728{
729 const std::vector<std::uint8_t> data = {
730 0x34U,
731 0x12U,
732 0x78U,
733 0x56U,
734 0x34U,
735 0x12U,
736 };
737
738 Reader reader(data);
739
740 EXPECT_EQ(reader.U16LittleEndian(), 0x1234U);
741 EXPECT_EQ(reader.U32LittleEndian(), 0x12345678U);
742 EXPECT_EQ(reader.Position(), 6U);
743 EXPECT_EQ(reader.Remaining(), 0U);
744}
745
748TEST(WireReaderTest, ReaderMixesEndianReads)
749{
750 const std::vector<std::uint8_t> data = {
751 0x12U,
752 0x34U,
753 0x78U,
754 0x56U,
755 0xABU,
756 0xCDU,
757 };
758
759 Reader reader(data);
760
761 EXPECT_EQ(reader.U16(), 0x1234U);
762 EXPECT_EQ(reader.U16LittleEndian(), 0x5678U);
763 EXPECT_EQ(reader.U16(), 0xABCDU);
764 EXPECT_EQ(reader.Position(), 6U);
765}
766
769TEST(WireReaderTest, ReaderRejectsLittleEndianU16PastEnd)
770{
771 const std::vector<std::uint8_t> data = {
772 0x12U,
773 };
774
775 Reader reader(data);
776
777 EXPECT_THROW((void)reader.U16LittleEndian(), std::out_of_range);
778 EXPECT_EQ(reader.Position(), 0U);
779 EXPECT_EQ(reader.Remaining(), 1U);
780}
781
784TEST(WireReaderTest, ReaderRejectsLittleEndianU32PastEnd)
785{
786 const std::vector<std::uint8_t> data = {
787 0x12U,
788 0x34U,
789 0x56U,
790 };
791
792 Reader reader(data);
793
794 EXPECT_THROW((void)reader.U32LittleEndian(), std::out_of_range);
795 EXPECT_EQ(reader.Position(), 0U);
796 EXPECT_EQ(reader.Remaining(), 3U);
797}
798
801TEST(WireReaderTest, ReaderRejectsU16PastEnd)
802{
803 const std::vector<std::uint8_t> data = {
804 0x12U,
805 };
806
807 Reader reader(data);
808
809 EXPECT_THROW((void)reader.U16(), std::out_of_range);
810 EXPECT_EQ(reader.Position(), 0U);
811 EXPECT_EQ(reader.Remaining(), 1U);
812}
813
816TEST(WireReaderTest, ReaderRejectsU32PastEnd)
817{
818 const std::vector<std::uint8_t> data = {
819 0x12U,
820 0x34U,
821 0x56U,
822 };
823
824 Reader reader(data);
825
826 EXPECT_THROW((void)reader.U32(), std::out_of_range);
827 EXPECT_EQ(reader.Position(), 0U);
828 EXPECT_EQ(reader.Remaining(), 3U);
829}
830
833TEST(WireReaderTest, ReaderReadBytes)
834{
835 const std::vector<std::uint8_t> data = {
836 0x10U,
837 0x20U,
838 0x30U,
839 0x40U,
840 };
841
842 Reader reader(data);
843
844 const std::vector<std::uint8_t> result = reader.ReadBytes(2U);
845
846 EXPECT_EQ(result, (std::vector<std::uint8_t>{0x10U, 0x20U}));
847 EXPECT_EQ(reader.Position(), 2U);
848 EXPECT_EQ(reader.Remaining(), 2U);
849}
850
853TEST(WireReaderTest, ReaderReadBytesZeroLength)
854{
855 const std::vector<std::uint8_t> data = {
856 0x10U,
857 0x20U,
858 };
859
860 Reader reader(data);
861
862 const std::vector<std::uint8_t> result = reader.ReadBytes(0U);
863
864 EXPECT_TRUE(result.empty());
865 EXPECT_EQ(reader.Position(), 0U);
866 EXPECT_EQ(reader.Remaining(), 2U);
867}
868
871TEST(WireReaderTest, ReaderRejectsReadBytesPastEnd)
872{
873 const std::vector<std::uint8_t> data = {
874 0x10U,
875 0x20U,
876 0x30U,
877 };
878
879 Reader reader(data);
880
881 EXPECT_THROW((void)reader.ReadBytes(4U), std::out_of_range);
882 EXPECT_EQ(reader.Position(), 0U);
883 EXPECT_EQ(reader.Remaining(), 3U);
884}
885
887TEST(WireReaderTest, ReaderFixedArray)
888{
889 const std::vector<std::uint8_t> data = {
890 0x10U,
891 0x20U,
892 0x30U,
893 0x40U,
894 };
895
896 Reader reader(data);
897
898 const std::array<std::uint8_t, 3U> result = reader.Fixed<3U>();
899
900 EXPECT_EQ(
901 result,
902 (std::array<std::uint8_t, 3U>{
903 0x10U,
904 0x20U,
905 0x30U,
906 }));
907 EXPECT_EQ(reader.Position(), 3U);
908 EXPECT_EQ(reader.Remaining(), 1U);
909}
910
913TEST(WireReaderTest, ReaderFixedEmptyArray)
914{
915 const std::vector<std::uint8_t> data = {
916 0x10U,
917 0x20U,
918 };
919
920 Reader reader(data);
921
922 const auto result = reader.Fixed<0U>();
923
924 EXPECT_EQ(result, (std::array<std::uint8_t, 0U>{}));
925 EXPECT_EQ(reader.Position(), 0U);
926 EXPECT_EQ(reader.Remaining(), 2U);
927}
928
931TEST(WireReaderTest, ReaderRejectsFixedArrayPastEnd)
932{
933 const std::vector<std::uint8_t> data = {
934 0x10U,
935 0x20U,
936 };
937
938 Reader reader(data);
939
940 EXPECT_THROW((void)reader.Fixed<3U>(), std::out_of_range);
941 EXPECT_EQ(reader.Position(), 0U);
942 EXPECT_EQ(reader.Remaining(), 2U);
943}
944
946TEST(WireReaderTest, ReaderSkip)
947{
948 const std::vector<std::uint8_t> data = {
949 0xAAU,
950 0xBBU,
951 0x12U,
952 0x34U,
953 0x56U,
954 };
955
956 Reader reader(data);
957
958 reader.Skip(2U);
959
960 EXPECT_EQ(reader.Position(), 2U);
961 EXPECT_EQ(reader.Remaining(), 3U);
962 EXPECT_EQ(reader.U16(), 0x1234U);
963 EXPECT_EQ(reader.Position(), 4U);
964 EXPECT_EQ(reader.Remaining(), 1U);
965 EXPECT_EQ(reader.U8(), 0x56U);
966 EXPECT_EQ(reader.Position(), 5U);
967 EXPECT_EQ(reader.Remaining(), 0U);
968}
969
971TEST(WireReaderTest, ReaderSkipZero)
972{
973 const std::vector<std::uint8_t> data = {
974 0x10U,
975 0x20U,
976 };
977
978 Reader reader(data);
979
980 reader.Skip(0U);
981
982 EXPECT_EQ(reader.Position(), 0U);
983 EXPECT_EQ(reader.Remaining(), 2U);
984}
985
988TEST(WireReaderTest, ReaderRejectsSkipPastEnd)
989{
990 const std::vector<std::uint8_t> data = {
991 0x10U,
992 0x20U,
993 0x30U,
994 };
995
996 Reader reader(data);
997
998 EXPECT_THROW(reader.Skip(4U), std::out_of_range);
999 EXPECT_EQ(reader.Position(), 0U);
1000 EXPECT_EQ(reader.Remaining(), 3U);
1001}
1002
1004TEST(WireReaderTest, ReaderSkipTo)
1005{
1006 const std::vector<std::uint8_t> data = {
1007 0xAAU,
1008 0xBBU,
1009 0x12U,
1010 0x34U,
1011 0x56U,
1012 };
1013
1014 Reader reader(data);
1015
1016 reader.SkipTo(2U);
1017
1018 EXPECT_EQ(reader.Position(), 2U);
1019 EXPECT_EQ(reader.U16(), 0x1234U);
1020 EXPECT_EQ(reader.Position(), 4U);
1021}
1022
1024TEST(WireReaderTest, ReaderSkipToMovesBackwards)
1025{
1026 const std::vector<std::uint8_t> data = {
1027 0x12U,
1028 0x34U,
1029 0x56U,
1030 0x78U,
1031 };
1032
1033 Reader reader(data);
1034
1035 reader.Skip(4U);
1036 reader.SkipTo(1U);
1037
1038 EXPECT_EQ(reader.Position(), 1U);
1039 EXPECT_EQ(reader.U16(), 0x3456U);
1040}
1041
1043TEST(WireReaderTest, ReaderRejectsSkipToPastEnd)
1044{
1045 const std::vector<std::uint8_t> data = {
1046 0x10U,
1047 0x20U,
1048 0x30U,
1049 };
1050
1051 Reader reader(data);
1052
1053 EXPECT_THROW(reader.SkipTo(4U), std::out_of_range);
1054 EXPECT_EQ(reader.Position(), 0U);
1055}
1056
1058TEST(WireReaderTest, ReaderAllowsSkipToEnd)
1059{
1060 const std::vector<std::uint8_t> data = {
1061 0x10U,
1062 0x20U,
1063 0x30U,
1064 };
1065
1066 Reader reader(data);
1067
1068 reader.SkipTo(data.size());
1069
1070 EXPECT_EQ(reader.Position(), data.size());
1071 EXPECT_EQ(reader.Remaining(), 0U);
1072}
1073
1076TEST(WireReaderTest, ReaderNeedExactRemaining)
1077{
1078 const std::vector<std::uint8_t> data = {
1079 0x10U,
1080 0x20U,
1081 };
1082
1083 Reader reader(data);
1084
1085 EXPECT_NO_THROW(reader.Need(2U));
1086 EXPECT_EQ(reader.Position(), 0U);
1087}
1088
1090TEST(WireReaderTest, ReaderNeedZero)
1091{
1092 const std::vector<std::uint8_t> data;
1093
1094 Reader reader(data);
1095
1096 EXPECT_NO_THROW(reader.Need(0U));
1097}
1098
1100TEST(WireReaderTest, ReaderCursorPointsToCurrentPosition)
1101{
1102 const std::vector<std::uint8_t> data = {
1103 0xAAU,
1104 0xBBU,
1105 0xCCU,
1106 };
1107
1108 Reader reader(data);
1109
1110 EXPECT_EQ(*reader.Cursor(), 0xAAU);
1111
1112 reader.SkipTo(2U);
1113
1114 EXPECT_EQ(*reader.Cursor(), 0xCCU);
1115}
1116
1119TEST(WireReaderTest, ReaderRemainingTracksPosition)
1120{
1121 const std::vector<std::uint8_t> data = {
1122 0x10U,
1123 0x20U,
1124 0x30U,
1125 0x40U,
1126 0x50U,
1127 };
1128
1129 Reader reader(data);
1130
1131 EXPECT_EQ(reader.Remaining(), 5U);
1132
1133 reader.Skip(2U);
1134 EXPECT_EQ(reader.Remaining(), 3U);
1135
1136 reader.U8();
1137 EXPECT_EQ(reader.Remaining(), 2U);
1138
1139 reader.SkipTo(4U);
1140 EXPECT_EQ(reader.Remaining(), 1U);
1141
1142 reader.U8();
1143 EXPECT_EQ(reader.Remaining(), 0U);
1144}
1145
1148TEST(WireReaderTest, ReaderRawPointerConstructor)
1149{
1150 const std::array<std::uint8_t, 3U> data = {
1151 0x12U,
1152 0x34U,
1153 0x56U,
1154 };
1155
1156 Reader reader(data.data(), data.size());
1157
1158 EXPECT_EQ(reader.U16(), 0x1234U);
1159 EXPECT_EQ(reader.U8(), 0x56U);
1160 EXPECT_EQ(reader.Position(), 3U);
1161}
1162
1164TEST(WireReaderTest, ReaderSpanConstructor)
1165{
1166 const std::array<std::uint8_t, 2U> data = {
1167 0x12U,
1168 0x34U,
1169 };
1170
1171 const std::span<const std::uint8_t> bytes(data);
1172
1173 Reader reader(bytes);
1174
1175 EXPECT_EQ(reader.U16(), 0x1234U);
1176 EXPECT_EQ(reader.Position(), 2U);
1177}
1178
1181TEST(WireReaderTest, ReaderEmptyVector)
1182{
1183 const std::vector<std::uint8_t> data;
1184
1185 Reader reader(data);
1186
1187 EXPECT_EQ(reader.Position(), 0U);
1188 EXPECT_EQ(reader.Remaining(), 0U);
1189 EXPECT_THROW((void)reader.U8(), std::out_of_range);
1190}
1191
1192} // namespace profinet::wire
Lightweight cursor for parsing a big-endian byte buffer without copies.
Definition wire.h:192
std::uint8_t U8()
Read and consume one byte.
Definition wire.h:250
const std::uint8_t * Cursor() const
Pointer to the next unread byte.
Definition wire.h:232
std::size_t Position() const
Current read offset from the start of the buffer.
Definition wire.h:225
std::uint32_t U32()
Read and consume a big-endian 32-bit value.
Definition wire.h:268
std::size_t Remaining() const
Number of bytes not yet consumed.
Definition wire.h:218
std::array< std::uint8_t, N > Fixed()
Read and consume a fixed-size byte array.
Definition wire.h:316
void SkipTo(std::size_t offset)
Move the read position to an absolute byte offset.
Definition wire.h:343
std::uint32_t U32LittleEndian()
Read and consume a little-endian 32-bit value.
Definition wire.h:291
void Need(std::size_t n) const
Assert that at least n bytes remain.
Definition wire.h:240
void Skip(std::size_t n)
Advance the read position without returning the skipped bytes.
Definition wire.h:330
std::vector< std::uint8_t > ReadBytes(std::size_t n)
Read and consume a variable-length byte range.
Definition wire.h:304
std::uint16_t U16()
Read and consume a big-endian 16-bit value.
Definition wire.h:258
std::uint16_t U16LittleEndian()
Read and consume a little-endian 16-bit value.
Definition wire.h:279
void PutBytes(std::vector< std::uint8_t > &out, const std::uint8_t *data, std::size_t len)
Append a raw byte range to a buffer.
Definition wire.h:114
void PutFixed(std::vector< std::uint8_t > &out, const std::array< std::uint8_t, N > &data)
Append a fixed-size byte array to a buffer.
Definition wire.h:124
void PutU8(std::vector< std::uint8_t > &out, std::uint8_t value)
Append a single byte to a buffer.
Definition wire.h:89
void PutU16(std::vector< std::uint8_t > &out, std::uint16_t value)
Append a 16-bit value to a buffer in big-endian order.
Definition wire.h:97
TEST(WireWriterTest, PutBigEndianU8)
Definition test_wire.cpp:26
void PutU32(std::vector< std::uint8_t > &out, std::uint32_t value)
Append a 32-bit value to a buffer in big-endian order.
Definition wire.h:105
Generic helpers for reading and writing integer and byte data in big- and little-endian wire formats.