1package rtpdump
2
3import (
4	"errors"
5	"net"
6	"reflect"
7	"testing"
8	"time"
9)
10
11func TestHeaderRoundTrip(t *testing.T) {
12	for _, test := range []struct {
13		Header Header
14	}{
15		{
16			Header: Header{
17				Start:  time.Unix(0, 0).UTC(),
18				Source: net.IPv4(0, 0, 0, 0),
19				Port:   0,
20			},
21		},
22		{
23			Header: Header{
24				Start:  time.Date(2019, 3, 25, 1, 1, 1, 0, time.UTC),
25				Source: net.IPv4(1, 2, 3, 4),
26				Port:   8080,
27			},
28		},
29	} {
30		d, err := test.Header.Marshal()
31		if err != nil {
32			t.Fatal(err)
33		}
34
35		var hdr Header
36		if err := hdr.Unmarshal(d); err != nil {
37			t.Fatal(err)
38		}
39
40		if got, want := hdr, test.Header; !reflect.DeepEqual(got, want) {
41			t.Fatalf("Unmarshal(%v.Marshal()) = %v, want identical", got, want)
42		}
43	}
44}
45
46func TestMarshalHeader(t *testing.T) {
47	for _, test := range []struct {
48		Name    string
49		Header  Header
50		Want    []byte
51		WantErr error
52	}{
53		{
54			Name: "nil source",
55			Header: Header{
56				Start:  time.Unix(0, 0).UTC(),
57				Source: nil,
58				Port:   0,
59			},
60			Want: []byte{
61				0x00, 0x00, 0x00, 0x00,
62				0x00, 0x00, 0x00, 0x00,
63				0x00, 0x00, 0x00, 0x00,
64				0x00, 0x00, 0x00, 0x00,
65			},
66		},
67	} {
68		data, err := test.Header.Marshal()
69		if got, want := err, test.WantErr; !errors.Is(got, want) {
70			t.Fatalf("Marshal(%q) err=%v, want %v", test.Name, got, want)
71		}
72
73		if got, want := data, test.Want; !reflect.DeepEqual(got, want) {
74			t.Fatalf("Marshal(%q) = %v, want %v", test.Name, got, want)
75		}
76	}
77}
78
79func TestPacketRoundTrip(t *testing.T) {
80	for _, test := range []struct {
81		Packet Packet
82	}{
83		{
84			Packet: Packet{
85				Offset:  0,
86				IsRTCP:  false,
87				Payload: []byte{0},
88			},
89		},
90		{
91			Packet: Packet{
92				Offset:  0,
93				IsRTCP:  true,
94				Payload: []byte{0},
95			},
96		},
97		{
98			Packet: Packet{
99				Offset:  123 * time.Millisecond,
100				IsRTCP:  false,
101				Payload: []byte{1, 2, 3, 4},
102			},
103		},
104	} {
105		d, err := test.Packet.Marshal()
106		if err != nil {
107			t.Fatal(err)
108		}
109
110		var pkt Packet
111		if err := pkt.Unmarshal(d); err != nil {
112			t.Fatal(err)
113		}
114
115		if got, want := pkt, test.Packet; !reflect.DeepEqual(got, want) {
116			t.Fatalf("Unmarshal(%v.Marshal()) = %v, want identical", got, want)
117		}
118	}
119}
120