]> git.stg.codes - stg.git/blob - tests/test_raw_ip.cpp
Use std::jthread and C++17.
[stg.git] / tests / test_raw_ip.cpp
1 #include <sys/socket.h>
2 #include <netinet/in.h>
3 #include <arpa/inet.h>
4
5 #include <cstdlib>
6 #include <cstdint>
7 #include <ctime>
8 #include <iostream>
9
10 #include "tut/tut.hpp"
11
12 #include "raw_ip_packet_old.h"
13 #include "stg/raw_ip_packet.h"
14
15 #ifndef ITERATIONS
16 #define ITERATIONS 1000
17 #endif
18
19 void genVector(uint8_t * buf);
20
21 namespace STG
22 {
23 std::ostream & operator<<(std::ostream & stream, const RawPacket & p);
24 }
25
26 namespace tut
27 {
28     struct rp_data {
29     };
30
31     typedef test_group<rp_data> tg;
32     tg rp_test_group("STG::RawPacket tests group");
33
34     typedef tg::object testobject;
35
36     template<>
37     template<>
38     void testobject::test<1>()
39     {
40         set_test_name("Check structure consistency");
41
42         STG::RawPacket rp;
43         rp.rawPacket.header.ipHeader.ip_v = 4;
44         rp.rawPacket.header.ipHeader.ip_hl = 5;
45         rp.rawPacket.header.ipHeader.ip_tos = 0;
46         rp.rawPacket.header.ipHeader.ip_len = htons(40); // 20 of header + 20 of data
47         rp.rawPacket.header.ipHeader.ip_p = 6;
48         rp.rawPacket.header.ipHeader.ip_src.s_addr = inet_addr("192.168.0.1");
49         rp.rawPacket.header.ipHeader.ip_dst.s_addr = inet_addr("192.168.0.101");
50         rp.rawPacket.header.sPort = htons(80);
51         rp.rawPacket.header.dPort = htons(38546);
52
53         ensure_equals("IP header size (explicitly)", sizeof(rp.rawPacket.header.ipHeader), static_cast<size_t>(20));
54         ensure_equals("IP version", rp.GetIPVersion(), 4);
55         ensure_equals("IP header size (with options)", rp.GetHeaderLen(), 20);
56         ensure_equals("Underlying protocol version", rp.GetProto(), 6);
57         ensure_equals("Packet length", rp.GetLen(), static_cast<uint32_t>(40));
58         ensure_equals("Source IP address", rp.GetSrcIP(), inet_addr("192.168.0.1"));
59         ensure_equals("Destination IP address", rp.GetDstIP(), inet_addr("192.168.0.101"));
60         ensure_equals("Source port number", rp.GetSrcPort(), 80);
61         ensure_equals("Destination port number", rp.GetDstPort(), 38546);
62     }
63
64     template<>
65     template<>
66     void testobject::test<2>()
67     {
68         srand(time(NULL));
69         for (size_t i = 0; i < ITERATIONS; ++i) {
70             RAW_PACKET_OLD p1;
71             STG::RawPacket p2;
72             STG::RawPacket p3;
73
74             uint8_t buf[68];
75             genVector(buf);
76
77             memcpy(p1.pckt, buf, 68);
78             memcpy(p2.rawPacket.data, buf, 68);
79             memcpy(p3.rawPacket.data, buf, 68);
80
81             ensure_equals("IP versions", p1.GetIPVersion(), p2.GetIPVersion());
82             ensure_equals("IP headers length", p1.GetHeaderLen(), p2.GetHeaderLen());
83             ensure_equals("Protocols", p1.GetProto(), p2.GetProto());
84             ensure_equals("Source IPs", p1.GetSrcIP(), p2.GetSrcIP());
85             ensure_equals("Destination IPs", p1.GetDstIP(), p2.GetDstIP());
86             ensure_equals("Source ports", p1.GetSrcPort(), p2.GetSrcPort());
87             ensure_equals("Destination ports", p1.GetDstPort(), p2.GetDstPort());
88
89             ensure_equals("Self equallity", p2, p3);
90             ensure_equals("Reverse self equallity", p3, p2);
91         }
92     }
93 }
94
95 inline
96 void genVector(uint8_t * buf)
97 {
98     for (size_t i = 0; i < 68; ++i) {
99         buf[i] = rand() % 256;
100     }
101     buf[0] = (buf[0] & 0xF0) | 0x05; // Fix header length
102 }
103
104 std::ostream & STG::operator<<(std::ostream & stream, const RawPacket & p)
105 {
106     stream.unsetf(std::ios::dec);
107     stream.setf(std::ios::hex);
108     for (size_t i = 0; i < sizeof(p.rawPacket.data); ++i) {
109         stream << static_cast<unsigned>(p.rawPacket.data[i]);
110     }
111     stream.unsetf(std::ios::hex);
112     stream.setf(std::ios::dec);
113     return stream;
114 }