2023-03-15 09:44:06 +00:00
|
|
|
//go:build darwin || freebsd || linux || openbsd
|
|
|
|
|
|
|
|
package dhcpd
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"encoding/json"
|
|
|
|
"net"
|
|
|
|
"net/http"
|
|
|
|
"net/http/httptest"
|
|
|
|
"net/netip"
|
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestServer_handleDHCPStatus(t *testing.T) {
|
2023-03-16 11:14:43 +00:00
|
|
|
const staticName = "static-client"
|
2023-03-15 09:44:06 +00:00
|
|
|
|
|
|
|
staticIP := netip.MustParseAddr("192.168.10.10")
|
|
|
|
staticMAC := net.HardwareAddr{0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA}
|
|
|
|
|
|
|
|
conf4 := defaultV4ServerConf()
|
|
|
|
conf4.LeaseDuration = 86400
|
|
|
|
|
|
|
|
serverConf := &ServerConfig{
|
|
|
|
Enabled: true,
|
|
|
|
Conf4: *conf4,
|
|
|
|
WorkDir: t.TempDir(),
|
|
|
|
DBFilePath: dbFilename,
|
|
|
|
ConfigModified: func() {},
|
|
|
|
}
|
|
|
|
|
|
|
|
wantConf := dhcpStatusResponse{
|
|
|
|
IfaceName: "",
|
|
|
|
V4: *conf4,
|
|
|
|
V6: V6ServerConf{},
|
|
|
|
Leases: []*Lease{},
|
|
|
|
StaticLeases: []*Lease{},
|
|
|
|
Enabled: true,
|
|
|
|
}
|
|
|
|
|
2023-03-16 11:14:43 +00:00
|
|
|
wantLease := Lease{
|
2023-03-15 09:44:06 +00:00
|
|
|
Expiry: time.Unix(leaseExpireStatic, 0),
|
|
|
|
Hostname: staticName,
|
|
|
|
HWAddr: staticMAC,
|
|
|
|
IP: staticIP,
|
|
|
|
}
|
|
|
|
|
|
|
|
s, err := Create(serverConf)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
t.Run("status", func(t *testing.T) {
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
var r *http.Request
|
|
|
|
r, err = http.NewRequest(http.MethodGet, "", nil)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
wantResp := dhcpStatusResponse{
|
|
|
|
IfaceName: "",
|
|
|
|
V4: *conf4,
|
|
|
|
V6: V6ServerConf{},
|
|
|
|
Leases: []*Lease{},
|
|
|
|
StaticLeases: []*Lease{},
|
|
|
|
Enabled: true,
|
|
|
|
}
|
|
|
|
|
|
|
|
b := &bytes.Buffer{}
|
|
|
|
err = json.NewEncoder(b).Encode(&wantResp)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
s.handleDHCPStatus(w, r)
|
|
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
|
|
|
|
|
|
assert.JSONEq(t, b.String(), w.Body.String())
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("add_static_lease", func(t *testing.T) {
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
|
|
|
|
b := &bytes.Buffer{}
|
|
|
|
err = json.NewEncoder(b).Encode(&wantLease)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
var r *http.Request
|
|
|
|
r, err = http.NewRequest(http.MethodPost, "", b)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
s.handleDHCPAddStaticLease(w, r)
|
|
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
|
|
|
|
|
|
wantConf := wantConf
|
2023-03-16 11:14:43 +00:00
|
|
|
wantConf.StaticLeases = []*Lease{&wantLease}
|
2023-03-15 09:44:06 +00:00
|
|
|
|
|
|
|
err = json.NewEncoder(b).Encode(&wantConf)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
s.handleDHCPStatus(w, r)
|
|
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
|
|
|
|
|
|
assert.JSONEq(t, b.String(), w.Body.String())
|
|
|
|
})
|
|
|
|
|
2023-03-16 11:14:43 +00:00
|
|
|
t.Run("add_invalid_lease", func(t *testing.T) {
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
|
|
|
|
b := &bytes.Buffer{}
|
|
|
|
|
|
|
|
lease := wantLease
|
|
|
|
lease.IP = netip.Addr{}
|
|
|
|
|
|
|
|
err = json.NewEncoder(b).Encode(&lease)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
var r *http.Request
|
|
|
|
r, err = http.NewRequest(http.MethodPost, "", b)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
s.handleDHCPAddStaticLease(w, r)
|
|
|
|
assert.Equal(t, http.StatusBadRequest, w.Code)
|
|
|
|
|
|
|
|
assert.Equal(t, "invalid IP\n", w.Body.String())
|
|
|
|
})
|
|
|
|
|
2023-03-15 09:44:06 +00:00
|
|
|
t.Run("remove_static_lease", func(t *testing.T) {
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
|
|
|
|
b := &bytes.Buffer{}
|
|
|
|
err = json.NewEncoder(b).Encode(&wantLease)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
var r *http.Request
|
|
|
|
r, err = http.NewRequest(http.MethodPost, "", b)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
s.handleDHCPRemoveStaticLease(w, r)
|
|
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
|
|
|
|
|
|
err = json.NewEncoder(b).Encode(&wantConf)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
s.handleDHCPStatus(w, r)
|
|
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
|
|
|
|
|
|
assert.JSONEq(t, b.String(), w.Body.String())
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("set_config", func(t *testing.T) {
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
|
|
|
|
conf := wantConf
|
|
|
|
conf.Enabled = false
|
|
|
|
|
|
|
|
b := &bytes.Buffer{}
|
|
|
|
err = json.NewEncoder(b).Encode(&conf)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
var r *http.Request
|
|
|
|
r, err = http.NewRequest(http.MethodPost, "", b)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
s.handleDHCPSetConfig(w, r)
|
|
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
|
|
})
|
|
|
|
}
|