2020-09-07 09:10:56 +01:00
|
|
|
package home
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2021-01-20 14:27:53 +00:00
|
|
|
"net"
|
2020-09-07 09:10:56 +01:00
|
|
|
"testing"
|
2021-03-11 14:32:58 +00:00
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/stretchr/testify/require"
|
2020-09-07 09:10:56 +01:00
|
|
|
)
|
|
|
|
|
2021-03-11 14:32:58 +00:00
|
|
|
func testParseOK(t *testing.T, ss ...string) options {
|
|
|
|
t.Helper()
|
|
|
|
|
2020-09-07 09:10:56 +01:00
|
|
|
o, _, err := parse("", ss)
|
2021-03-11 14:32:58 +00:00
|
|
|
require.Nil(t, err)
|
|
|
|
|
2020-09-07 09:10:56 +01:00
|
|
|
return o
|
|
|
|
}
|
|
|
|
|
|
|
|
func testParseErr(t *testing.T, descr string, ss ...string) {
|
2021-03-11 14:32:58 +00:00
|
|
|
t.Helper()
|
|
|
|
|
2020-09-07 09:10:56 +01:00
|
|
|
_, _, err := parse("", ss)
|
2021-03-11 14:32:58 +00:00
|
|
|
require.NotNilf(t, err, "expected an error because %s but no error returned", descr)
|
2020-09-07 09:10:56 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
func testParseParamMissing(t *testing.T, param string) {
|
2021-03-11 14:32:58 +00:00
|
|
|
t.Helper()
|
|
|
|
|
2020-09-07 09:10:56 +01:00
|
|
|
testParseErr(t, fmt.Sprintf("%s parameter missing", param), param)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestParseVerbose(t *testing.T) {
|
2021-03-11 14:32:58 +00:00
|
|
|
assert.False(t, testParseOK(t).verbose, "empty is not verbose")
|
|
|
|
assert.True(t, testParseOK(t, "-v").verbose, "-v is verbose")
|
|
|
|
assert.True(t, testParseOK(t, "--verbose").verbose, "--verbose is verbose")
|
2020-09-07 09:10:56 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestParseConfigFilename(t *testing.T) {
|
2021-03-11 14:32:58 +00:00
|
|
|
assert.Equal(t, "", testParseOK(t).configFilename, "empty is no config filename")
|
|
|
|
assert.Equal(t, "path", testParseOK(t, "-c", "path").configFilename, "-c is config filename")
|
2020-09-07 09:10:56 +01:00
|
|
|
testParseParamMissing(t, "-c")
|
2021-03-11 14:32:58 +00:00
|
|
|
|
|
|
|
assert.Equal(t, "path", testParseOK(t, "--config", "path").configFilename, "--config is config filename")
|
2020-09-07 09:10:56 +01:00
|
|
|
testParseParamMissing(t, "--config")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestParseWorkDir(t *testing.T) {
|
2021-03-11 14:32:58 +00:00
|
|
|
assert.Equal(t, "", testParseOK(t).workDir, "empty is no work dir")
|
|
|
|
assert.Equal(t, "path", testParseOK(t, "-w", "path").workDir, "-w is work dir")
|
2020-09-07 09:10:56 +01:00
|
|
|
testParseParamMissing(t, "-w")
|
2021-03-11 14:32:58 +00:00
|
|
|
|
|
|
|
assert.Equal(t, "path", testParseOK(t, "--work-dir", "path").workDir, "--work-dir is work dir")
|
2020-09-07 09:10:56 +01:00
|
|
|
testParseParamMissing(t, "--work-dir")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestParseBindHost(t *testing.T) {
|
2021-03-11 14:32:58 +00:00
|
|
|
assert.Nil(t, testParseOK(t).bindHost, "empty is not host")
|
|
|
|
assert.Equal(t, net.IPv4(1, 2, 3, 4), testParseOK(t, "-h", "1.2.3.4").bindHost, "-h is host")
|
2020-09-07 09:10:56 +01:00
|
|
|
testParseParamMissing(t, "-h")
|
2021-03-11 14:32:58 +00:00
|
|
|
|
|
|
|
assert.Equal(t, net.IPv4(1, 2, 3, 4), testParseOK(t, "--host", "1.2.3.4").bindHost, "--host is host")
|
2020-09-07 09:10:56 +01:00
|
|
|
testParseParamMissing(t, "--host")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestParseBindPort(t *testing.T) {
|
2021-03-11 14:32:58 +00:00
|
|
|
assert.Equal(t, 0, testParseOK(t).bindPort, "empty is port 0")
|
|
|
|
assert.Equal(t, 65535, testParseOK(t, "-p", "65535").bindPort, "-p is port")
|
2020-09-07 09:10:56 +01:00
|
|
|
testParseParamMissing(t, "-p")
|
2021-03-11 14:32:58 +00:00
|
|
|
|
|
|
|
assert.Equal(t, 65535, testParseOK(t, "--port", "65535").bindPort, "--port is port")
|
2020-09-07 09:10:56 +01:00
|
|
|
testParseParamMissing(t, "--port")
|
|
|
|
|
|
|
|
testParseErr(t, "not an int", "-p", "x")
|
|
|
|
testParseErr(t, "hex not supported", "-p", "0x100")
|
|
|
|
testParseErr(t, "port negative", "-p", "-1")
|
|
|
|
testParseErr(t, "port too high", "-p", "65536")
|
|
|
|
testParseErr(t, "port too high", "-p", "4294967297") // 2^32 + 1
|
|
|
|
testParseErr(t, "port too high", "-p", "18446744073709551617") // 2^64 + 1
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestParseLogfile(t *testing.T) {
|
2021-03-11 14:32:58 +00:00
|
|
|
assert.Equal(t, "", testParseOK(t).logFile, "empty is no log file")
|
|
|
|
assert.Equal(t, "path", testParseOK(t, "-l", "path").logFile, "-l is log file")
|
|
|
|
assert.Equal(t, "path", testParseOK(t, "--logfile", "path").logFile, "--logfile is log file")
|
2020-09-07 09:10:56 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestParsePidfile(t *testing.T) {
|
2021-03-11 14:32:58 +00:00
|
|
|
assert.Equal(t, "", testParseOK(t).pidFile, "empty is no pid file")
|
|
|
|
assert.Equal(t, "path", testParseOK(t, "--pidfile", "path").pidFile, "--pidfile is pid file")
|
2020-09-07 09:10:56 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestParseCheckConfig(t *testing.T) {
|
2021-03-11 14:32:58 +00:00
|
|
|
assert.False(t, testParseOK(t).checkConfig, "empty is not check config")
|
|
|
|
assert.True(t, testParseOK(t, "--check-config").checkConfig, "--check-config is check config")
|
2020-09-07 09:10:56 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestParseDisableUpdate(t *testing.T) {
|
2021-03-11 14:32:58 +00:00
|
|
|
assert.False(t, testParseOK(t).disableUpdate, "empty is not disable update")
|
|
|
|
assert.True(t, testParseOK(t, "--no-check-update").disableUpdate, "--no-check-update is disable update")
|
2020-09-07 09:10:56 +01:00
|
|
|
}
|
|
|
|
|
2020-09-11 11:21:37 +01:00
|
|
|
func TestParseDisableMemoryOptimization(t *testing.T) {
|
2021-03-11 14:32:58 +00:00
|
|
|
assert.False(t, testParseOK(t).disableMemoryOptimization, "empty is not disable update")
|
|
|
|
assert.True(t, testParseOK(t, "--no-mem-optimization").disableMemoryOptimization, "--no-mem-optimization is disable update")
|
2020-09-11 11:21:37 +01:00
|
|
|
}
|
|
|
|
|
2020-09-07 09:10:56 +01:00
|
|
|
func TestParseService(t *testing.T) {
|
2021-03-11 14:32:58 +00:00
|
|
|
assert.Equal(t, "", testParseOK(t).serviceControlAction, "empty is not service cmd")
|
|
|
|
assert.Equal(t, "cmd", testParseOK(t, "-s", "cmd").serviceControlAction, "-s is service cmd")
|
|
|
|
assert.Equal(t, "cmd", testParseOK(t, "--service", "cmd").serviceControlAction, "--service is service cmd")
|
2020-09-07 09:10:56 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestParseGLInet(t *testing.T) {
|
2021-03-11 14:32:58 +00:00
|
|
|
assert.False(t, testParseOK(t).glinetMode, "empty is not GL-Inet mode")
|
|
|
|
assert.True(t, testParseOK(t, "--glinet").glinetMode, "--glinet is GL-Inet mode")
|
2020-09-07 09:10:56 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestParseUnknown(t *testing.T) {
|
|
|
|
testParseErr(t, "unknown word", "x")
|
|
|
|
testParseErr(t, "unknown short", "-x")
|
|
|
|
testParseErr(t, "unknown long", "--x")
|
|
|
|
testParseErr(t, "unknown triple", "---x")
|
|
|
|
testParseErr(t, "unknown plus", "+x")
|
|
|
|
testParseErr(t, "unknown dash", "-")
|
|
|
|
}
|
2020-09-07 09:53:16 +01:00
|
|
|
|
2021-03-11 14:32:58 +00:00
|
|
|
func TestSerialize(t *testing.T) {
|
|
|
|
const reportFmt = "expected %s but got %s"
|
|
|
|
|
|
|
|
testCases := []struct {
|
|
|
|
name string
|
|
|
|
opts options
|
|
|
|
ss []string
|
|
|
|
}{{
|
|
|
|
name: "empty",
|
|
|
|
opts: options{},
|
|
|
|
ss: []string{},
|
|
|
|
}, {
|
|
|
|
name: "config_filename",
|
|
|
|
opts: options{configFilename: "path"},
|
|
|
|
ss: []string{"-c", "path"},
|
|
|
|
}, {
|
|
|
|
name: "work_dir",
|
|
|
|
opts: options{workDir: "path"},
|
|
|
|
ss: []string{"-w", "path"},
|
|
|
|
}, {
|
|
|
|
name: "bind_host",
|
|
|
|
opts: options{bindHost: net.IP{1, 2, 3, 4}},
|
|
|
|
ss: []string{"-h", "1.2.3.4"},
|
|
|
|
}, {
|
|
|
|
name: "bind_port",
|
|
|
|
opts: options{bindPort: 666},
|
|
|
|
ss: []string{"-p", "666"},
|
|
|
|
}, {
|
|
|
|
name: "log_file",
|
|
|
|
opts: options{logFile: "path"},
|
|
|
|
ss: []string{"-l", "path"},
|
|
|
|
}, {
|
|
|
|
name: "pid_file",
|
|
|
|
opts: options{pidFile: "path"},
|
|
|
|
ss: []string{"--pidfile", "path"},
|
|
|
|
}, {
|
|
|
|
name: "disable_update",
|
|
|
|
opts: options{disableUpdate: true},
|
|
|
|
ss: []string{"--no-check-update"},
|
|
|
|
}, {
|
|
|
|
name: "control_action",
|
|
|
|
opts: options{serviceControlAction: "run"},
|
|
|
|
ss: []string{"-s", "run"},
|
|
|
|
}, {
|
|
|
|
name: "glinet_mode",
|
|
|
|
opts: options{glinetMode: true},
|
|
|
|
ss: []string{"--glinet"},
|
|
|
|
}, {
|
|
|
|
name: "disable_mem_opt",
|
|
|
|
opts: options{disableMemoryOptimization: true},
|
|
|
|
ss: []string{"--no-mem-optimization"},
|
|
|
|
}, {
|
|
|
|
name: "multiple",
|
|
|
|
opts: options{
|
|
|
|
serviceControlAction: "run",
|
|
|
|
configFilename: "config",
|
|
|
|
workDir: "work",
|
|
|
|
pidFile: "pid",
|
|
|
|
disableUpdate: true,
|
|
|
|
disableMemoryOptimization: true,
|
|
|
|
},
|
|
|
|
ss: []string{
|
|
|
|
"-c", "config",
|
|
|
|
"-w", "work",
|
|
|
|
"-s", "run",
|
|
|
|
"--pidfile", "pid",
|
|
|
|
"--no-check-update",
|
|
|
|
"--no-mem-optimization",
|
|
|
|
},
|
|
|
|
}}
|
|
|
|
|
|
|
|
for _, tc := range testCases {
|
|
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
|
|
result := serialize(tc.opts)
|
|
|
|
require.Lenf(t, result, len(tc.ss), reportFmt, tc.ss, result)
|
|
|
|
|
|
|
|
for i, r := range result {
|
|
|
|
assert.Equalf(t, tc.ss[i], r, reportFmt, tc.ss, result)
|
|
|
|
}
|
|
|
|
})
|
2020-09-07 09:53:16 +01:00
|
|
|
}
|
|
|
|
}
|