Skip to content

Commit c51b417

Browse files
committed
Add UDP unit tests
1 parent 662df87 commit c51b417

File tree

2 files changed

+155
-1
lines changed

2 files changed

+155
-1
lines changed

protocols/udp.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,14 @@ var errInvalidUDPHeader = errors.New("UDP header must be 8 bytes")
2424
// An error is returned if the headers' constraints are not respected.
2525
func UDPPacketFromIPPacket(ip IPPacket) (*UDPPacket, error) {
2626
udpHeader, err := udpHeaderFromBytes(ip.Payload())
27+
if err != nil {
28+
return nil, err
29+
}
2730

2831
return &UDPPacket{
2932
ipPacket: ip,
3033
header: *udpHeader,
31-
}, err
34+
}, nil
3235
}
3336

3437
func udpv4PacketFromBytes(raw []byte) (*UDPPacket, error) {

protocols/udp_test.go

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
package protocols
2+
3+
import (
4+
"reflect"
5+
"testing"
6+
)
7+
8+
func TestUDPPacketFromIPPacket(t *testing.T) {
9+
tests := []struct {
10+
name string
11+
ipPacket IPPacket
12+
expectedUDPPacket *UDPPacket
13+
expectedErr error
14+
}{
15+
{
16+
name: "valid IPv4 packet with UDP payload",
17+
ipPacket: ipv4Packet{
18+
payload: []byte{0x1f, 0x90, 0x23, 0xc4, 0x00, 0x10, 0x27, 0x10},
19+
},
20+
expectedUDPPacket: &UDPPacket{
21+
ipPacket: ipv4Packet{
22+
payload: []byte{0x1f, 0x90, 0x23, 0xc4, 0x00, 0x10, 0x27, 0x10},
23+
},
24+
header: udpHeader{
25+
sourcePort: 8080,
26+
destinationPort: 9156,
27+
length: 16,
28+
checksum: 10000,
29+
},
30+
},
31+
expectedErr: nil,
32+
},
33+
{
34+
name: "IPv4 packet with too short UDP payload",
35+
ipPacket: ipv4Packet{
36+
payload: []byte{0x1f, 0x90, 0x23},
37+
},
38+
expectedUDPPacket: nil,
39+
expectedErr: errInvalidUDPHeader,
40+
},
41+
{
42+
name: "Valid IPv6 packet with UDP payload",
43+
ipPacket: ipv6Packet{
44+
payload: []byte{0x00, 0x01, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00},
45+
},
46+
expectedUDPPacket: &UDPPacket{
47+
ipPacket: ipv6Packet{
48+
payload: []byte{0x00, 0x01, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00},
49+
},
50+
header: udpHeader{
51+
sourcePort: 1,
52+
destinationPort: 2,
53+
length: 8,
54+
checksum: 0,
55+
},
56+
},
57+
expectedErr: nil,
58+
},
59+
{
60+
name: "IPv6 packet with zero length UDP payload",
61+
ipPacket: ipv6Packet{
62+
payload: []byte{0x12, 0x34, 0x56, 0x78, 0x00, 0x00, 0x9a, 0xbc},
63+
},
64+
expectedUDPPacket: &UDPPacket{
65+
ipPacket: ipv6Packet{
66+
payload: []byte{0x12, 0x34, 0x56, 0x78, 0x00, 0x00, 0x9a, 0xbc},
67+
},
68+
header: udpHeader{
69+
sourcePort: 0x1234,
70+
destinationPort: 0x5678,
71+
length: 0,
72+
checksum: 0x9abc,
73+
},
74+
},
75+
expectedErr: nil,
76+
},
77+
}
78+
79+
for _, tt := range tests {
80+
t.Run(tt.name, func(t *testing.T) {
81+
udp, err := UDPPacketFromIPPacket(tt.ipPacket)
82+
if tt.expectedErr != err {
83+
t.Errorf("expected error: %v - got %v", tt.expectedErr, err)
84+
}
85+
if tt.expectedErr == nil && !reflect.DeepEqual(udp, tt.expectedUDPPacket) {
86+
t.Errorf("expected UDP packet to be %+v - got %+v", tt.expectedUDPPacket, udp)
87+
}
88+
})
89+
}
90+
}
91+
92+
func TestUDPHeaderFromBytes(t *testing.T) {
93+
tests := []struct {
94+
name string
95+
raw []byte
96+
expectedHeader *udpHeader
97+
expectedErr error
98+
}{
99+
{
100+
name: "Valid UDP header",
101+
raw: []byte{0x1f, 0x90, 0x23, 0xc4, 0x00, 0x10, 0x27, 0x10},
102+
expectedHeader: &udpHeader{
103+
sourcePort: 8080,
104+
destinationPort: 9156,
105+
length: 16,
106+
checksum: 10000,
107+
},
108+
expectedErr: nil,
109+
},
110+
{
111+
name: "Too short header",
112+
raw: []byte{0x1f, 0x90, 0x23},
113+
expectedHeader: nil,
114+
expectedErr: errInvalidUDPHeader,
115+
},
116+
{
117+
name: "Minimum valid header",
118+
raw: []byte{0x00, 0x01, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00},
119+
expectedHeader: &udpHeader{
120+
sourcePort: 1,
121+
destinationPort: 2,
122+
length: 8,
123+
checksum: 0,
124+
},
125+
expectedErr: nil,
126+
},
127+
{
128+
name: "Zero length header",
129+
raw: []byte{0x12, 0x34, 0x56, 0x78, 0x00, 0x00, 0x9a, 0xbc},
130+
expectedHeader: &udpHeader{
131+
sourcePort: 0x1234,
132+
destinationPort: 0x5678,
133+
length: 0,
134+
checksum: 0x9abc,
135+
},
136+
expectedErr: nil,
137+
},
138+
}
139+
140+
for _, tt := range tests {
141+
t.Run(tt.name, func(t *testing.T) {
142+
h, err := udpHeaderFromBytes(tt.raw)
143+
if tt.expectedErr != err {
144+
t.Errorf("expected error: %v - got %v", tt.expectedErr, err)
145+
}
146+
if tt.expectedErr == nil && !reflect.DeepEqual(h, tt.expectedHeader) {
147+
t.Errorf("expected header to be %+v - got %+v", tt.expectedHeader, h)
148+
}
149+
})
150+
}
151+
}

0 commit comments

Comments
 (0)