summaryrefslogtreecommitdiffhomepage
path: root/dhcpv6/option_relaymsg_test.go
blob: b96c0f9c2ff5c399cfbfbdbd60724566aa165399 (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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package dhcpv6

import (
	"errors"
	"fmt"
	"reflect"
	"testing"

	"github.com/google/go-cmp/cmp"
	"github.com/stretchr/testify/require"
	"github.com/u-root/uio/uio"
)

func TestRelayMsgOptionParseAndGetter(t *testing.T) {
	for i, tt := range []struct {
		buf  []byte
		err  error
		want DHCPv6
	}{
		{
			buf: []byte{
				0, 9, // Relay Msg option
				0, 10, // length
				1,                // MessageTypeSolicit
				0xaa, 0xbb, 0xcc, // transaction ID
				0, 8, // option: elapsed time
				0, 2, // option length
				0, 0, // option value
			},
			want: &Message{
				MessageType:   MessageTypeSolicit,
				TransactionID: TransactionID{0xaa, 0xbb, 0xcc},
				Options:       MessageOptions{Options{OptElapsedTime(0)}},
			},
		},
		{
			buf: []byte{
				0, 9, // Relay Msg option
				0, 6, // length
				1,                // MessageTypeSolicit
				0xaa, 0xbb, 0xcc, // transaction ID
				0, 8, // option: elapsed time
				// no length/value for elapsed time option
			},
			err: uio.ErrUnreadBytes,
		},
		{
			buf:  []byte{0, 9, 0, 1, 0},
			want: nil,
			err:  uio.ErrBufferTooShort,
		},
		{
			buf:  []byte{0, 9, 0},
			want: nil,
			err:  uio.ErrUnreadBytes,
		},
	} {
		t.Run(fmt.Sprintf("%d", i), func(t *testing.T) {
			var ro RelayOptions
			if err := ro.FromBytes(tt.buf); !errors.Is(err, tt.err) {
				t.Errorf("FromBytes = %v, want %v", err, tt.err)
			}
			if got := ro.RelayMessage(); !reflect.DeepEqual(got, tt.want) {
				t.Errorf("RelayMessage = %v, want %v", got, tt.want)
			}

			if tt.want != nil {
				var m RelayOptions
				m.Add(OptRelayMessage(tt.want))
				got := m.ToBytes()
				if diff := cmp.Diff(tt.buf, got); diff != "" {
					t.Errorf("ToBytes mismatch (-want, +got): %s", diff)
				}
			}
		})
	}
}

func TestSample(t *testing.T) {
	// Nested relay message. This test only checks if it parses correctly, but
	// could/should be extended to check all the fields like done in other tests
	buf := []byte{
		12,                                             // relay
		1,                                              // hop count
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // linkAddr
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // peerAddr
		// relay msg
		0, 9, // opt relay msg
		0, 66, // opt len
		// relay fwd
		12,                                             // relay
		0,                                              // hop count
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // linkAddr
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // peerAddr
		// opt interface ID
		0, 18, // interface id
		0, 6, // opt len
		0xba, 0xbe, 0xb1, 0xb0, 0xbe, 0xbe, // opt value
		// relay msg
		0, 9, // relay msg
		0, 18, // msg len
		// dhcpv6 msg
		1,                // solicit
		0xaa, 0xbb, 0xcc, // transaction ID
		// client ID
		0, 1, // opt client id
		0, 10, // opt len
		0, 3, // duid type
		0, 1, // hw type
		5, 6, 7, 8, 9, 10, // duid value
	}
	_, err := FromBytes(buf)
	if err != nil {
		t.Fatal(err)
	}
}

func TestRelayMsgParseOptRelayMsgTooShort(t *testing.T) {
	var opt optRelayMsg
	err := opt.FromBytes([]byte{})
	require.Error(t, err, "ParseOptRelayMsg() should return an error if the encapsulated message is invalid")
}

func TestRelayMsgString(t *testing.T) {
	var opt optRelayMsg
	err := opt.FromBytes([]byte{
		1,                // MessageTypeSolicit
		0xaa, 0xbb, 0xcc, // transaction ID
		0, 8, // option: elapsed time
		0, 2, // option length
		0, 0, // option value
	})
	require.NoError(t, err)
	require.Contains(
		t,
		opt.String(),
		"Relay Message: Message",
		"String() should contain the relaymsg contents",
	)
}