101 lines
3.3 KiB
Go
101 lines
3.3 KiB
Go
package netconfig
|
|
|
|
import (
|
|
"net"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
// parseIPRoutes is a pure transform from raw whitespace-split route fields to
|
|
// Route structs; exercise its branches directly rather than via fixtures.
|
|
func TestParseIPRoutes(t *testing.T) {
|
|
t.Run("full route", func(t *testing.T) {
|
|
routes := parseIPRoutes([][]string{
|
|
{"10.0.0.0/24", "via", "10.0.0.1", "metric", "100"},
|
|
})
|
|
require.Len(t, routes, 1)
|
|
r := routes[0]
|
|
assert.Equal(t, "10.0.0.0/24", r.Destination.String())
|
|
assert.True(t, r.Gateway.Equal(net.ParseIP("10.0.0.1")))
|
|
assert.Equal(t, 100, r.Metric)
|
|
})
|
|
|
|
t.Run("default metric when absent", func(t *testing.T) {
|
|
routes := parseIPRoutes([][]string{{"10.0.0.0/24", "via", "10.0.0.1"}})
|
|
require.Len(t, routes, 1)
|
|
assert.Equal(t, 256, routes[0].Metric)
|
|
})
|
|
|
|
t.Run("metric zero falls back to default", func(t *testing.T) {
|
|
routes := parseIPRoutes([][]string{{"10.0.0.0/24", "metric", "0"}})
|
|
require.Len(t, routes, 1)
|
|
assert.Equal(t, 256, routes[0].Metric)
|
|
})
|
|
|
|
t.Run("invalid metric falls back to default", func(t *testing.T) {
|
|
routes := parseIPRoutes([][]string{{"10.0.0.0/24", "metric", "notanumber"}})
|
|
require.Len(t, routes, 1)
|
|
assert.Equal(t, 256, routes[0].Metric)
|
|
})
|
|
|
|
t.Run("empty and invalid entries are skipped", func(t *testing.T) {
|
|
routes := parseIPRoutes([][]string{
|
|
{}, // empty: skipped
|
|
{"not-a-cidr"}, // invalid CIDR: skipped
|
|
{"10.0.0.0/24", "via", "nope"}, // bad gateway: skipped
|
|
{"192.168.0.0/16", "via", "192.168.0.1"}, // valid
|
|
})
|
|
require.Len(t, routes, 1)
|
|
assert.Equal(t, "192.168.0.0/16", routes[0].Destination.String())
|
|
})
|
|
}
|
|
|
|
// ParseIP derives a *net.IPNet from network-scripts style key/value config.
|
|
func TestNetworkScriptsParseIP(t *testing.T) {
|
|
ns := &networkScripts{}
|
|
|
|
t.Run("missing IPADDR returns nil", func(t *testing.T) {
|
|
assert.Nil(t, ns.ParseIP(map[string]string{}, ""))
|
|
})
|
|
|
|
t.Run("empty IPADDR returns nil", func(t *testing.T) {
|
|
assert.Nil(t, ns.ParseIP(map[string]string{"IPADDR": ""}, ""))
|
|
})
|
|
|
|
t.Run("explicit prefix", func(t *testing.T) {
|
|
got := ns.ParseIP(map[string]string{"IPADDR": "192.168.1.5", "PREFIX": "24"}, "")
|
|
require.NotNil(t, got)
|
|
assert.True(t, got.IP.Equal(net.ParseIP("192.168.1.5")))
|
|
ones, _ := got.Mask.Size()
|
|
assert.Equal(t, 24, ones)
|
|
})
|
|
|
|
t.Run("prefix derived from netmask", func(t *testing.T) {
|
|
got := ns.ParseIP(map[string]string{"IPADDR": "10.1.2.3", "NETMASK": "255.255.255.0"}, "")
|
|
require.NotNil(t, got)
|
|
ones, _ := got.Mask.Size()
|
|
assert.Equal(t, 24, ones)
|
|
})
|
|
|
|
t.Run("defaults to /16 with no prefix or netmask", func(t *testing.T) {
|
|
got := ns.ParseIP(map[string]string{"IPADDR": "10.1.2.3"}, "")
|
|
require.NotNil(t, got)
|
|
ones, _ := got.Mask.Size()
|
|
assert.Equal(t, 16, ones)
|
|
})
|
|
|
|
t.Run("indexed keys", func(t *testing.T) {
|
|
cfg := map[string]string{"IPADDR0": "172.16.0.9", "PREFIX0": "30"}
|
|
got := ns.ParseIP(cfg, "0")
|
|
require.NotNil(t, got)
|
|
assert.True(t, got.IP.Equal(net.ParseIP("172.16.0.9")))
|
|
ones, _ := got.Mask.Size()
|
|
assert.Equal(t, 30, ones)
|
|
})
|
|
|
|
t.Run("invalid address returns nil", func(t *testing.T) {
|
|
assert.Nil(t, ns.ParseIP(map[string]string{"IPADDR": "not-an-ip", "PREFIX": "24"}, ""))
|
|
})
|
|
}
|