Skip to content

Commit

Permalink
dhcpv4: better tests
Browse files Browse the repository at this point in the history
  • Loading branch information
105th committed Oct 18, 2021
1 parent 1098bef commit 720b896
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 33 deletions.
67 changes: 37 additions & 30 deletions internal/dhcpd/dhcpd_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,44 +141,51 @@ func TestNormalizeLeases(t *testing.T) {
func TestV4SubnetRange(t *testing.T) {
var err error

_, err = v4Create(V4ServerConf{
baseConf := V4ServerConf{
Enabled: true,
RangeStart: net.IP{192, 168, 10, 100},
RangeEnd: net.IP{192, 168, 10, 200},
GatewayIP: net.IP{192, 168, 10, 1},
SubnetMask: net.IP{255, 255, 255, 240},
notify: testNotify,
})
require.Error(t, err)

_, err = v4Create(V4ServerConf{
Enabled: true,
RangeStart: net.IP{192, 168, 10, 222},
RangeEnd: net.IP{192, 168, 10, 111},
GatewayIP: net.IP{192, 168, 10, 1},
SubnetMask: net.IP{255, 255, 255, 0},
notify: testNotify,
})
require.Error(t, err)
}

_, err = v4Create(V4ServerConf{
Enabled: true,
RangeStart: net.IP{192, 168, 10, 111},
RangeEnd: net.IP{192, 168, 10, 222},
GatewayIP: net.IP{192, 168, 10, 199},
SubnetMask: net.IP{255, 255, 255, 0},
notify: testNotify,
})
require.Error(t, err)
testCases := []struct {
name string
lastBytes []byte
want error
}{{
name: "outside range",
lastBytes: []byte{
100, 200, 1, 240,
},
want: errBadRange,
}, {
name: "outside range end",
lastBytes: []byte{
5, 200, 1, 240,
},
want: errBadRange,
}, {
name: "gateway in range",
lastBytes: []byte{
111, 222, 199, 0,
},
want: errBadRange,
}}

_, err = v4Create(V4ServerConf{
Enabled: true,
RangeStart: net.IP{192, 168, 10, 111},
GatewayIP: net.IP{192, 168, 10, 199},
SubnetMask: net.IP{255, 255, 255, 0},
notify: testNotify,
})
require.Error(t, err)
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
conf := baseConf
conf.RangeStart[3] = tc.lastBytes[0]
conf.RangeEnd[3] = tc.lastBytes[1]
conf.GatewayIP[3] = tc.lastBytes[2]
conf.SubnetMask[3] = tc.lastBytes[3]

_, err = v4Create(conf)
assert.ErrorIs(t, err, tc.want)
})
}
}

// cloneUDPAddr returns a deep copy of a.
Expand Down
11 changes: 8 additions & 3 deletions internal/dhcpd/v4.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ func (s *v4Server) WriteDiskConfig4(c *V4ServerConf) {
func (s *v4Server) WriteDiskConfig6(c *V6ServerConf) {
}

const errBadRange errors.Error = "bad range"

// normalizeHostname normalizes a hostname sent by the client. If err is not
// nil, norm is an empty string.
func normalizeHostname(hostname string) (norm string, err error) {
Expand Down Expand Up @@ -1127,24 +1129,27 @@ func v4Create(conf V4ServerConf) (srv DHCPServer, err error) {
}

if s.conf.ipRange.contains(routerIP) {
return s, fmt.Errorf("dhcpv4: gateway ip %v in the ip range: %v-%v",
return s, fmt.Errorf("dhcpv4: gateway ip %v in the ip range: %v-%v: %w",
routerIP,
conf.RangeStart,
conf.RangeEnd,
errBadRange,
)
}

if !s.conf.subnet.Contains(conf.RangeStart) {
return s, fmt.Errorf("dhcpv4: range start %v is outside network: %v",
return s, fmt.Errorf("dhcpv4: range start %v is outside network: %v: %w",
conf.RangeStart,
s.conf.subnet,
errBadRange,
)
}

if !s.conf.subnet.Contains(conf.RangeEnd) {
return s, fmt.Errorf("dhcpv4: range end %v is outside network: %v",
return s, fmt.Errorf("dhcpv4: range end %v is outside network: %v: %w",
conf.RangeEnd,
s.conf.subnet,
errBadRange,
)
}

Expand Down

0 comments on commit 720b896

Please sign in to comment.