File: plugin_test.go

package info (click to toggle)
golang-github-coredhcp-coredhcp 0.0.0%2Bgit.20250806.f7e98e4-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 460 kB
  • sloc: makefile: 8; sh: 6
file content (127 lines) | stat: -rw-r--r-- 3,248 bytes parent folder | download
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
// Copyright 2018-present the CoreDHCP Authors. All rights reserved
// This source code is licensed under the MIT license found in the
// LICENSE file in the root directory of this source tree.

package serverid

import (
	"net"
	"testing"

	"github.com/insomniacslk/dhcp/dhcpv6"
)

func makeTestDUID(uuid string) dhcpv6.DUID {
	var uuidb [16]byte
	copy(uuidb[:], uuid)
	return &dhcpv6.DUIDUUID{
		UUID: uuidb,
	}
}

func TestRejectBadServerIDV6(t *testing.T) {
	req, err := dhcpv6.NewMessage()
	if err != nil {
		t.Fatal(err)
	}
	v6ServerID = makeTestDUID("0000000000000000")

	req.MessageType = dhcpv6.MessageTypeRenew
	dhcpv6.WithClientID(makeTestDUID("1000000000000000"))(req)
	dhcpv6.WithServerID(makeTestDUID("0000000000000001"))(req)

	stub, err := dhcpv6.NewReplyFromMessage(req)
	if err != nil {
		t.Fatal(err)
	}

	resp, stop := Handler6(req, stub)
	if resp != nil {
		t.Error("server_id is sending a response message to a request with mismatched ServerID")
	}
	if !stop {
		t.Error("server_id did not interrupt processing on a request with mismatched ServerID")
	}
}

func TestRejectUnexpectedServerIDV6(t *testing.T) {
	req, err := dhcpv6.NewMessage()
	if err != nil {
		t.Fatal(err)
	}
	v6ServerID = makeTestDUID("0000000000000000")

	req.MessageType = dhcpv6.MessageTypeSolicit
	dhcpv6.WithClientID(makeTestDUID("1000000000000000"))(req)
	dhcpv6.WithServerID(makeTestDUID("0000000000000000"))(req)

	stub, err := dhcpv6.NewAdvertiseFromSolicit(req)
	if err != nil {
		t.Fatal(err)
	}

	resp, stop := Handler6(req, stub)
	if resp != nil {
		t.Error("server_id is sending a response message to a solicit with a ServerID")
	}
	if !stop {
		t.Error("server_id did not interrupt processing on a solicit with a ServerID")
	}
}

func TestAddServerIDV6(t *testing.T) {
	req, err := dhcpv6.NewMessage()
	if err != nil {
		t.Fatal(err)
	}
	v6ServerID = makeTestDUID("0000000000000000")

	req.MessageType = dhcpv6.MessageTypeRebind
	dhcpv6.WithClientID(makeTestDUID("1000000000000000"))(req)

	stub, err := dhcpv6.NewReplyFromMessage(req)
	if err != nil {
		t.Fatal(err)
	}

	resp, _ := Handler6(req, stub)
	if resp == nil {
		t.Fatal("plugin did not return an answer")
	}

	if opt := resp.(*dhcpv6.Message).Options.ServerID(); opt == nil {
		t.Fatal("plugin did not add a ServerID option")
	} else if !opt.Equal(v6ServerID) {
		t.Fatalf("Got unexpected DUID: expected %v, got %v", v6ServerID, opt)
	}
}

func TestRejectInnerMessageServerID(t *testing.T) {
	req, err := dhcpv6.NewMessage()
	if err != nil {
		t.Fatal(err)
	}
	v6ServerID = makeTestDUID("0000000000000000")

	req.MessageType = dhcpv6.MessageTypeSolicit
	dhcpv6.WithClientID(makeTestDUID("1000000000000000"))(req)
	dhcpv6.WithServerID(makeTestDUID("0000000000000000"))(req)

	stub, err := dhcpv6.NewAdvertiseFromSolicit(req)
	if err != nil {
		t.Fatal(err)
	}

	relayedRequest, err := dhcpv6.EncapsulateRelay(req, dhcpv6.MessageTypeRelayForward, net.IPv6loopback, net.IPv6loopback)
	if err != nil {
		t.Fatal(err)
	}

	resp, stop := Handler6(relayedRequest, stub)
	if resp != nil {
		t.Error("server_id is sending a response message to a relayed solicit with a ServerID")
	}
	if !stop {
		t.Error("server_id did not interrupt processing on a relayed solicit with a ServerID")
	}
}