summaryrefslogtreecommitdiffhomepage
path: root/dhcpv6/option_ntp_server_test.go
blob: 105a753e206d41ecfe8fe972ae48eefdcde92ca5 (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
package dhcpv6

import (
	"net"
	"testing"

	"github.com/insomniacslk/dhcp/rfc1035label"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func TestSuboptionSrvAddr(t *testing.T) {
	ip := net.ParseIP("2a03:2880:fffe:c:face:b00c:0:35")
	so := NTPSuboptionSrvAddr(ip)
	assert.Equal(t, NTPSuboptionSrvAddrCode, so.Code())
	expected := append([]byte{0x00, 0x01, 0x00, 0x10}, ip...)
	assert.Equal(t, expected, so.ToBytes())
}

func TestSuboptionMCAddr(t *testing.T) {
	ip := net.ParseIP("2a03:2880:fffe:c:face:b00c:0:35")
	so := NTPSuboptionMCAddr(ip)
	assert.Equal(t, NTPSuboptionMCAddrCode, so.Code())
	expected := append([]byte{0x00, 0x02, 0x00, 0x10}, ip...)
	assert.Equal(t, expected, so.ToBytes())
}

func TestSuboptionSrvFQDN(t *testing.T) {
	fqdn, err := rfc1035label.FromBytes([]byte("\x03ntp\x07example\x03com"))
	require.NoError(t, err)
	so := NTPSuboptionSrvFQDN(*fqdn)
	assert.Equal(t, NTPSuboptionSrvFQDNCode, so.Code())
	expected := append([]byte{0x00, 0x03, 0x00, 0x10}, fqdn.ToBytes()...)
	assert.Equal(t, expected, so.ToBytes())
}

func TestSuboptionGeneric(t *testing.T) {
	data := []byte{
		0xff, 0xff, // unknown sub-option type
		0x00, 0x04, // length, 4 bytes
		0x74, 0x65, 0x73, 0x74, // the ASCII bytes for the string "test"
	}
	o, err := ParseOptNTPServer(data)
	require.NoError(t, err)
	require.Equal(t, 1, len(o.Suboptions))
	assert.IsType(t, &OptionGeneric{}, o.Suboptions[0])
	og := o.Suboptions[0].(*OptionGeneric)
	assert.Equal(t, []byte("test"), og.ToBytes())
}

func TestParseOptNTPServer(t *testing.T) {
	ip := net.ParseIP("2a03:2880:fffe:c:face:b00c:0:35")
	fqdn, err := rfc1035label.FromBytes([]byte("\x03ntp\x07example\x03com"))
	require.NoError(t, err)

	// add server address sub-option
	data := []byte{
		0x00, 0x01, // sub-option type
		0x00, 0x10, // length (16, IPv6 address)
	}
	data = append(data, []byte(ip)...)

	// add server FQDN sub-option
	data = append(data, []byte{
		0x00, 0x03, // sub-option type
		0x00, 0x10, // length (16, the FQDN "ntp.example.com." as rfc1035 label)
	}...)
	data = append(data, fqdn.ToBytes()...)

	o, err := ParseOptNTPServer(data)
	require.NoError(t, err)
	require.NotNil(t, o)
	assert.Equal(t, 2, len(o.Suboptions))

	optAddr, ok := o.Suboptions[0].(*NTPSuboptionSrvAddr)
	require.True(t, ok)
	assert.Equal(t, ip, net.IP(*optAddr))

	optFQDN, ok := o.Suboptions[1].(*NTPSuboptionSrvFQDN)
	require.True(t, ok)
	assert.Equal(t, *fqdn, rfc1035label.Labels(*optFQDN))

	var mo MessageOptions
	assert.Nil(t, mo.NTPServers())
	mo.Add(o)
	// MessageOptions.NTPServers only returns server address values.
	assert.Equal(t, []net.IP{ip}, mo.NTPServers())
}