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
|
// SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly>
// SPDX-License-Identifier: MIT
package recordlayer
import (
"testing"
"github.com/pion/dtls/v3/pkg/protocol"
"github.com/stretchr/testify/assert"
)
func TestUDPDecode(t *testing.T) {
for _, test := range []struct {
Name string
Data []byte
Want [][]byte
WantError error
}{
{
Name: "Change Cipher Spec, single packet",
Data: []byte{0x14, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x01},
Want: [][]byte{
{0x14, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x01},
},
},
{
Name: "Change Cipher Spec, multi packet",
Data: []byte{
0x14, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x01,
0x14, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x01, 0x01,
},
Want: [][]byte{
{0x14, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x01},
{0x14, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x01, 0x01},
},
},
{
Name: "Invalid packet length",
Data: []byte{0x14, 0xfe},
WantError: ErrInvalidPacketLength,
},
{
Name: "Packet declared invalid length",
Data: []byte{0x14, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0xFF, 0x01},
WantError: ErrInvalidPacketLength,
},
} {
dtlsPkts, err := UnpackDatagram(test.Data)
assert.ErrorIs(t, err, test.WantError)
assert.Equal(t, test.Want, dtlsPkts, "UDP decode: %s", test.Name)
}
}
func TestRecordLayerRoundTrip(t *testing.T) {
for _, test := range []struct {
Name string
Data []byte
Want *RecordLayer
WantMarshalError error
WantUnmarshalError error
}{
{
Name: "Change Cipher Spec, single packet",
Data: []byte{0x14, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x01},
Want: &RecordLayer{
Header: Header{
ContentType: protocol.ContentTypeChangeCipherSpec,
Version: protocol.Version{Major: 0xfe, Minor: 0xff},
Epoch: 0,
SequenceNumber: 18,
},
Content: &protocol.ChangeCipherSpec{},
},
},
} {
r := &RecordLayer{}
assert.ErrorIs(t, r.Unmarshal(test.Data), test.WantUnmarshalError)
assert.Equal(t, test.Want, r, "RecordLayer should match expected value after unmarshal")
data, marshalErr := r.Marshal()
assert.ErrorIs(t, marshalErr, test.WantMarshalError)
assert.Equal(t, test.Data, data, "RecordLayer should match expected value after marshal")
}
}
|