Files
netbird/util/capture/pcap_test.go
2026-04-15 19:19:09 +02:00

69 lines
2.3 KiB
Go

package capture
import (
"bytes"
"encoding/binary"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestPcapWriter_GlobalHeader(t *testing.T) {
var buf bytes.Buffer
pw := NewPcapWriter(&buf, 0)
// Header is lazy, so write a dummy packet to trigger it.
err := pw.WritePacket(time.Now(), []byte{0x45, 0, 0, 20, 0, 0, 0, 0, 64, 1, 0, 0, 10, 0, 0, 1, 10, 0, 0, 2})
require.NoError(t, err)
data := buf.Bytes()
require.GreaterOrEqual(t, len(data), 24, "should contain global header")
assert.Equal(t, uint32(pcapMagic), binary.LittleEndian.Uint32(data[0:4]), "magic number")
assert.Equal(t, uint16(pcapVersionMaj), binary.LittleEndian.Uint16(data[4:6]), "version major")
assert.Equal(t, uint16(pcapVersionMin), binary.LittleEndian.Uint16(data[6:8]), "version minor")
assert.Equal(t, uint32(defaultSnapLen), binary.LittleEndian.Uint32(data[16:20]), "snap length")
assert.Equal(t, uint32(linkTypeRaw), binary.LittleEndian.Uint32(data[20:24]), "link type")
}
func TestPcapWriter_WritePacket(t *testing.T) {
var buf bytes.Buffer
pw := NewPcapWriter(&buf, 100)
ts := time.Date(2025, 6, 15, 12, 30, 45, 123456000, time.UTC)
payload := make([]byte, 50)
for i := range payload {
payload[i] = byte(i)
}
err := pw.WritePacket(ts, payload)
require.NoError(t, err)
data := buf.Bytes()[24:] // skip global header
require.Len(t, data, 16+50, "packet header + payload")
assert.Equal(t, uint32(ts.Unix()), binary.LittleEndian.Uint32(data[0:4]), "timestamp seconds")
assert.Equal(t, uint32(123456), binary.LittleEndian.Uint32(data[4:8]), "timestamp microseconds")
assert.Equal(t, uint32(50), binary.LittleEndian.Uint32(data[8:12]), "included length")
assert.Equal(t, uint32(50), binary.LittleEndian.Uint32(data[12:16]), "original length")
assert.Equal(t, payload, data[16:], "packet data")
}
func TestPcapWriter_SnapLen(t *testing.T) {
var buf bytes.Buffer
pw := NewPcapWriter(&buf, 10)
ts := time.Now()
payload := make([]byte, 50)
err := pw.WritePacket(ts, payload)
require.NoError(t, err)
data := buf.Bytes()[24:]
assert.Equal(t, uint32(10), binary.LittleEndian.Uint32(data[8:12]), "included length should be truncated")
assert.Equal(t, uint32(50), binary.LittleEndian.Uint32(data[12:16]), "original length preserved")
assert.Len(t, data[16:], 10, "only snap_len bytes written")
}