]> git.stg.codes - stg.git/blob - tests/test_raw_ip.cpp
a7b3e8a5bb0a845c82c586ab5aa7c92f82a939a0
[stg.git] / tests / test_raw_ip.cpp
1 #define BOOST_TEST_MODULE STGRawIP
2
3 #include "raw_ip_packet_old.h"
4 #include "stg/raw_ip_packet.h"
5
6 #pragma GCC diagnostic push
7 #pragma GCC diagnostic ignored "-Wold-style-cast"
8 #pragma GCC diagnostic ignored "-Wunused-parameter"
9 #pragma GCC diagnostic ignored "-Wsign-compare"
10 #pragma GCC diagnostic ignored "-Wparentheses"
11 #include <boost/test/unit_test.hpp>
12 #pragma GCC diagnostic pop
13
14 #include <cstdlib>
15 #include <cstdint>
16 #include <ctime>
17 #include <iostream>
18
19 #include <sys/socket.h>
20 #include <netinet/in.h>
21 #include <arpa/inet.h>
22
23 namespace
24 {
25
26 constexpr size_t ITERATIONS = 1000;
27
28 std::array<uint8_t, 68> genVector()
29 {
30     std::array<uint8_t, 68> res;
31     for (size_t i = 0; i < 68; ++i)
32         res[i] = rand() % 256;
33     res[0] = (res[0] & 0xF0) | 0x05; // Fix header length
34     return res;
35 }
36
37 }
38
39 namespace std
40 {
41
42 std::ostream & operator<<(std::ostream& stream, const STG::RawPacket& p)
43 {
44     stream.setf(std::ios::hex);
45     for (size_t i = 0; i < sizeof(p.rawPacket.data); ++i) {
46         stream << static_cast<unsigned>(p.rawPacket.data[i]);
47     }
48     stream.setf(std::ios::dec);
49     return stream;
50 }
51
52 }
53
54 BOOST_AUTO_TEST_SUITE(RawIP)
55
56 BOOST_AUTO_TEST_CASE(StructureConsistency)
57 {
58     STG::RawPacket rp;
59     rp.rawPacket.header.ipHeader.ip_v = 4;
60     rp.rawPacket.header.ipHeader.ip_hl = 5;
61     rp.rawPacket.header.ipHeader.ip_tos = 0;
62     rp.rawPacket.header.ipHeader.ip_len = htons(40); // 20 of header + 20 of data
63     rp.rawPacket.header.ipHeader.ip_p = 6;
64     rp.rawPacket.header.ipHeader.ip_src.s_addr = inet_addr("192.168.0.1");
65     rp.rawPacket.header.ipHeader.ip_dst.s_addr = inet_addr("192.168.0.101");
66     rp.rawPacket.header.sPort = htons(80);
67     rp.rawPacket.header.dPort = htons(38546);
68
69     BOOST_CHECK_EQUAL(sizeof(rp.rawPacket.header.ipHeader), static_cast<size_t>(20));
70     BOOST_CHECK_EQUAL(rp.GetIPVersion(), 4);
71     BOOST_CHECK_EQUAL(rp.GetHeaderLen(), 20);
72     BOOST_CHECK_EQUAL(rp.GetProto(), 6);
73     BOOST_CHECK_EQUAL(rp.GetLen(), static_cast<uint32_t>(40));
74     BOOST_CHECK_EQUAL(rp.GetSrcIP(), inet_addr("192.168.0.1"));
75     BOOST_CHECK_EQUAL(rp.GetDstIP(), inet_addr("192.168.0.101"));
76     BOOST_CHECK_EQUAL(rp.GetSrcPort(), 80);
77     BOOST_CHECK_EQUAL(rp.GetDstPort(), 38546);
78 }
79
80 BOOST_AUTO_TEST_CASE(RandomTests)
81 {
82     srand(time(NULL));
83     for (size_t i = 0; i < ITERATIONS; ++i)
84     {
85         RAW_PACKET_OLD p1;
86         STG::RawPacket p2;
87         STG::RawPacket p3;
88
89         const auto buf = genVector();
90
91         memcpy(p1.pckt, buf.data(), 68);
92         memcpy(p2.rawPacket.data, buf.data(), 68);
93         memcpy(p3.rawPacket.data, buf.data(), 68);
94
95         BOOST_CHECK_EQUAL(p1.GetIPVersion(), p2.GetIPVersion());
96         BOOST_CHECK_EQUAL(p1.GetHeaderLen(), p2.GetHeaderLen());
97         BOOST_CHECK_EQUAL(p1.GetProto(), p2.GetProto());
98         BOOST_CHECK_EQUAL(p1.GetSrcIP(), p2.GetSrcIP());
99         BOOST_CHECK_EQUAL(p1.GetDstIP(), p2.GetDstIP());
100         BOOST_CHECK_EQUAL(p1.GetSrcPort(), p2.GetSrcPort());
101         BOOST_CHECK_EQUAL(p1.GetDstPort(), p2.GetDstPort());
102
103         BOOST_CHECK_EQUAL(p2, p3);
104         BOOST_CHECK_EQUAL(p3, p2);
105     }
106 }
107
108 BOOST_AUTO_TEST_SUITE_END()