summaryrefslogtreecommitdiff
path: root/tests/src/snap_test.cpp
blob: 5a17af130f10b6042f09417275f1da96b90d4426 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <gtest/gtest.h>
#include <cstring>
#include <string>
#include <stdint.h>
#include <tins/snap.h>

using namespace std;
using namespace Tins;

class SNAPTest : public testing::Test {
public:
    static const uint8_t expected_packet[];
    
    void test_equals(const SNAP& snap1, const SNAP& snap2);
};

const uint8_t SNAPTest::expected_packet[] = {
    170, 170, 3, 0, 0, 1, 8, 0
};

TEST_F(SNAPTest, DefaultConstructor) {
    SNAP snap;
    EXPECT_EQ(snap.pdu_type(), PDU::SNAP);
    EXPECT_EQ(snap.dsap(), 0xaa);
    EXPECT_EQ(snap.ssap(), 0xaa);
    EXPECT_EQ(snap.eth_type(), 0);
    EXPECT_EQ(snap.org_code(), 0U);
    EXPECT_EQ(snap.control(), 3);
}

TEST_F(SNAPTest, CopyConstructor) {
    SNAP snap1;
    snap1.eth_type(0xfab1);
    snap1.org_code(0xfab1c3);
    snap1.control(0x1);
    SNAP snap2(snap1);
    test_equals(snap1, snap2);
}

TEST_F(SNAPTest, CopyAssignmentOperator) {
    SNAP snap1;
    snap1.eth_type(0xfab1);
    snap1.org_code(0xfab1c3);
    snap1.control(0x1);
    SNAP snap2 = snap1;
    test_equals(snap1, snap2);
}

TEST_F(SNAPTest, OrgCode) {
    SNAP snap; 
    snap.org_code(0xfab1c3); 
    
    EXPECT_EQ(snap.org_code(), 0xfab1c3U);
    EXPECT_EQ(snap.control(), 3);
}

TEST_F(SNAPTest, Control) {
    SNAP snap; 
    snap.control(0xfa); 
    
    EXPECT_EQ(snap.control(), 0xfa);
    EXPECT_EQ(snap.org_code(), 0U);
}

TEST_F(SNAPTest, EthType) {
    SNAP snap;
    snap.eth_type(0xfab1);
    EXPECT_EQ(snap.eth_type(), 0xfab1);
}

TEST_F(SNAPTest, Serialize) {
    SNAP snap1;
    snap1.eth_type(0xfab1);
    snap1.org_code(0xfab1c3);
    snap1.control(0x1);
    
    PDU::serialization_type buffer = snap1.serialize();
    
    SNAP snap2(snap1);
    PDU::serialization_type buffer2 = snap2.serialize();
    EXPECT_EQ(buffer, buffer2);
}

TEST_F(SNAPTest, ClonePDU) {
    SNAP snap1;
    snap1.eth_type(0xfab1);
    snap1.org_code(0xfab1c3);
    snap1.control(0x1);
    SNAP* snap2 = static_cast<SNAP*>(snap1.clone());
    ASSERT_TRUE(snap2 != NULL);
    test_equals(snap1, *snap2);
    
    delete snap2;
}

TEST_F(SNAPTest, ConstructorFromBuffer) {
    SNAP snap1(expected_packet, sizeof(expected_packet));
    PDU::serialization_type buffer = snap1.serialize();
    
    EXPECT_EQ(3, snap1.control());
    EXPECT_EQ(0xaa, snap1.dsap());
    EXPECT_EQ(0xaa, snap1.ssap());
    EXPECT_EQ(0x0800, snap1.eth_type()); 
    EXPECT_EQ(1U, snap1.org_code()); 
    
    SNAP snap2(&buffer[0], (uint32_t)buffer.size());
    test_equals(snap1, snap2);
}

void SNAPTest::test_equals(const SNAP& snap1, const SNAP& snap2) {
    EXPECT_EQ(snap1.dsap(), snap2.dsap());
    EXPECT_EQ(snap1.ssap(), snap2.ssap());
    EXPECT_EQ(snap1.control(), snap2.control());
    EXPECT_EQ(snap1.eth_type(), snap2.eth_type());
}