110 lines
2.6 KiB
Go
110 lines
2.6 KiB
Go
|
package dhcpd
|
||
|
|
||
|
import (
|
||
|
"testing"
|
||
|
|
||
|
"github.com/stretchr/testify/assert"
|
||
|
"github.com/stretchr/testify/require"
|
||
|
)
|
||
|
|
||
|
func TestDHCPOptionParser(t *testing.T) {
|
||
|
testCasesA := []struct {
|
||
|
name string
|
||
|
in string
|
||
|
wantErrMsg string
|
||
|
wantData []byte
|
||
|
wantCode uint8
|
||
|
}{{
|
||
|
name: "hex_success",
|
||
|
in: "6 hex c0a80101c0a80102",
|
||
|
wantErrMsg: "",
|
||
|
wantData: []byte{0xC0, 0xA8, 0x01, 0x01, 0xC0, 0xA8, 0x01, 0x02},
|
||
|
wantCode: 6,
|
||
|
}, {
|
||
|
name: "ip_success",
|
||
|
in: "6 ip 1.2.3.4",
|
||
|
wantErrMsg: "",
|
||
|
wantData: []byte{0x01, 0x02, 0x03, 0x04},
|
||
|
wantCode: 6,
|
||
|
}, {
|
||
|
name: "ip_success_v6",
|
||
|
in: "6 ip ::1234",
|
||
|
wantErrMsg: "",
|
||
|
wantData: []byte{
|
||
|
0x00, 0x00, 0x00, 0x00,
|
||
|
0x00, 0x00, 0x00, 0x00,
|
||
|
0x00, 0x00, 0x00, 0x00,
|
||
|
0x00, 0x00, 0x12, 0x34,
|
||
|
},
|
||
|
wantCode: 6,
|
||
|
}, {
|
||
|
name: "ips_success",
|
||
|
in: "6 ips 192.168.1.1,192.168.1.2",
|
||
|
wantErrMsg: "",
|
||
|
wantData: []byte{0xC0, 0xA8, 0x01, 0x01, 0xC0, 0xA8, 0x01, 0x02},
|
||
|
wantCode: 6,
|
||
|
}, {
|
||
|
name: "text_success",
|
||
|
in: "252 text http://192.168.1.1/",
|
||
|
wantErrMsg: "",
|
||
|
wantData: []byte("http://192.168.1.1/"),
|
||
|
wantCode: 252,
|
||
|
}, {
|
||
|
name: "bad_parts",
|
||
|
in: "6 ip",
|
||
|
wantErrMsg: `invalid option string "6 ip": need at least three fields`,
|
||
|
wantCode: 0,
|
||
|
wantData: nil,
|
||
|
}, {
|
||
|
name: "bad_code",
|
||
|
in: "256 ip 1.1.1.1",
|
||
|
wantErrMsg: `invalid option string "256 ip 1.1.1.1": parsing option code: ` +
|
||
|
`strconv.ParseUint: parsing "256": value out of range`,
|
||
|
wantCode: 0,
|
||
|
wantData: nil,
|
||
|
}, {
|
||
|
name: "bad_type",
|
||
|
in: "6 bad 1.1.1.1",
|
||
|
wantErrMsg: `invalid option string "6 bad 1.1.1.1": unknown option type "bad"`,
|
||
|
wantCode: 0,
|
||
|
wantData: nil,
|
||
|
}, {
|
||
|
name: "hex_error",
|
||
|
in: "6 hex ZZZ",
|
||
|
wantErrMsg: `invalid option string "6 hex ZZZ": decoding hex: ` +
|
||
|
`encoding/hex: invalid byte: U+005A 'Z'`,
|
||
|
wantData: nil,
|
||
|
wantCode: 0,
|
||
|
}, {
|
||
|
name: "ip_error",
|
||
|
in: "6 ip 1.2.3.x",
|
||
|
wantErrMsg: `invalid option string "6 ip 1.2.3.x": invalid ip`,
|
||
|
wantData: nil,
|
||
|
wantCode: 0,
|
||
|
}, {
|
||
|
name: "ips_error",
|
||
|
in: "6 ips 192.168.1.1,192.168.1.x",
|
||
|
wantErrMsg: `invalid option string "6 ips 192.168.1.1,192.168.1.x": ` +
|
||
|
`parsing ip at index 1: invalid ip`,
|
||
|
wantData: nil,
|
||
|
wantCode: 0,
|
||
|
}}
|
||
|
|
||
|
p := newDHCPOptionParser()
|
||
|
|
||
|
for _, tc := range testCasesA {
|
||
|
t.Run(tc.name, func(t *testing.T) {
|
||
|
code, data, err := p.parse(tc.in)
|
||
|
if tc.wantErrMsg == "" {
|
||
|
assert.Nil(t, err)
|
||
|
} else {
|
||
|
require.NotNil(t, err)
|
||
|
assert.Equal(t, tc.wantErrMsg, err.Error())
|
||
|
}
|
||
|
|
||
|
assert.Equal(t, tc.wantCode, code)
|
||
|
assert.Equal(t, tc.wantData, data)
|
||
|
})
|
||
|
}
|
||
|
}
|