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",
)
}
|