2017-09-25 18:40:42 +00:00
|
|
|
package config
|
|
|
|
|
|
|
|
import (
|
2017-10-20 10:02:05 +00:00
|
|
|
"flag"
|
2017-09-25 18:40:42 +00:00
|
|
|
"strings"
|
|
|
|
"testing"
|
|
|
|
|
2020-06-17 19:14:40 +00:00
|
|
|
"github.com/stretchr/testify/require"
|
2017-09-25 18:40:42 +00:00
|
|
|
)
|
|
|
|
|
2020-06-17 19:14:40 +00:00
|
|
|
// TestAddFlags_WithParse tests whether command line flags are properly parsed
|
2017-09-25 18:40:42 +00:00
|
|
|
// into the Flags/File structure. It contains an example for every type
|
|
|
|
// that is parsed. It does not test the conversion into the final
|
|
|
|
// runtime configuration. See TestConfig for that.
|
2020-06-17 19:14:40 +00:00
|
|
|
func TestAddFlags_WithParse(t *testing.T) {
|
2017-09-25 18:40:42 +00:00
|
|
|
tests := []struct {
|
2020-06-17 19:14:40 +00:00
|
|
|
args []string
|
|
|
|
expected BuilderOpts
|
|
|
|
extra []string
|
2017-09-25 18:40:42 +00:00
|
|
|
}{
|
|
|
|
{},
|
|
|
|
{
|
2020-06-17 19:14:40 +00:00
|
|
|
args: []string{`-bind`, `a`},
|
|
|
|
expected: BuilderOpts{Config: Config{BindAddr: pString("a")}},
|
2017-09-25 18:40:42 +00:00
|
|
|
},
|
|
|
|
{
|
2020-06-17 19:14:40 +00:00
|
|
|
args: []string{`-bootstrap`},
|
|
|
|
expected: BuilderOpts{Config: Config{Bootstrap: pBool(true)}},
|
2017-09-25 18:40:42 +00:00
|
|
|
},
|
|
|
|
{
|
2020-06-17 19:14:40 +00:00
|
|
|
args: []string{`-bootstrap=true`},
|
|
|
|
expected: BuilderOpts{Config: Config{Bootstrap: pBool(true)}},
|
2017-09-25 18:40:42 +00:00
|
|
|
},
|
|
|
|
{
|
2020-06-17 19:14:40 +00:00
|
|
|
args: []string{`-bootstrap=false`},
|
|
|
|
expected: BuilderOpts{Config: Config{Bootstrap: pBool(false)}},
|
2017-09-25 18:40:42 +00:00
|
|
|
},
|
|
|
|
{
|
2020-06-17 19:14:40 +00:00
|
|
|
args: []string{`-config-file`, `a`, `-config-dir`, `b`, `-config-file`, `c`, `-config-dir`, `d`},
|
|
|
|
expected: BuilderOpts{ConfigFiles: []string{"a", "b", "c", "d"}},
|
2017-09-25 18:40:42 +00:00
|
|
|
},
|
|
|
|
{
|
2020-06-17 19:14:40 +00:00
|
|
|
args: []string{`-datacenter`, `a`},
|
|
|
|
expected: BuilderOpts{Config: Config{Datacenter: pString("a")}},
|
2017-09-25 18:40:42 +00:00
|
|
|
},
|
|
|
|
{
|
2020-06-17 19:14:40 +00:00
|
|
|
args: []string{`-dns-port`, `1`},
|
|
|
|
expected: BuilderOpts{Config: Config{Ports: Ports{DNS: pInt(1)}}},
|
2017-09-25 18:40:42 +00:00
|
|
|
},
|
2018-10-03 13:05:28 +00:00
|
|
|
{
|
2020-06-17 19:14:40 +00:00
|
|
|
args: []string{`-grpc-port`, `1`},
|
|
|
|
expected: BuilderOpts{Config: Config{Ports: Ports{GRPC: pInt(1)}}},
|
2018-10-03 13:05:28 +00:00
|
|
|
},
|
2020-01-22 10:32:17 +00:00
|
|
|
{
|
2020-06-17 19:14:40 +00:00
|
|
|
args: []string{`-http-port`, `1`},
|
|
|
|
expected: BuilderOpts{Config: Config{Ports: Ports{HTTP: pInt(1)}}},
|
2020-01-22 10:32:17 +00:00
|
|
|
},
|
|
|
|
{
|
2020-06-17 19:14:40 +00:00
|
|
|
args: []string{`-https-port`, `1`},
|
|
|
|
expected: BuilderOpts{Config: Config{Ports: Ports{HTTPS: pInt(1)}}},
|
2020-01-22 10:32:17 +00:00
|
|
|
},
|
2018-07-06 18:05:06 +00:00
|
|
|
{
|
2020-06-17 19:14:40 +00:00
|
|
|
args: []string{`-serf-lan-port`, `1`},
|
|
|
|
expected: BuilderOpts{Config: Config{Ports: Ports{SerfLAN: pInt(1)}}},
|
2018-07-06 18:05:06 +00:00
|
|
|
},
|
|
|
|
{
|
2020-06-17 19:14:40 +00:00
|
|
|
args: []string{`-serf-wan-port`, `1`},
|
|
|
|
expected: BuilderOpts{Config: Config{Ports: Ports{SerfWAN: pInt(1)}}},
|
2018-07-06 18:05:06 +00:00
|
|
|
},
|
|
|
|
{
|
2020-06-17 19:14:40 +00:00
|
|
|
args: []string{`-server-port`, `1`},
|
|
|
|
expected: BuilderOpts{Config: Config{Ports: Ports{Server: pInt(1)}}},
|
2018-07-06 18:05:06 +00:00
|
|
|
},
|
2017-09-25 18:40:42 +00:00
|
|
|
{
|
2020-06-17 19:14:40 +00:00
|
|
|
args: []string{`-join`, `a`, `-join`, `b`},
|
|
|
|
expected: BuilderOpts{Config: Config{StartJoinAddrsLAN: []string{"a", "b"}}},
|
2017-09-25 18:40:42 +00:00
|
|
|
},
|
|
|
|
{
|
2020-06-17 19:14:40 +00:00
|
|
|
args: []string{`-node-meta`, `a:b`, `-node-meta`, `c:d`},
|
|
|
|
expected: BuilderOpts{Config: Config{NodeMeta: map[string]string{"a": "b", "c": "d"}}},
|
2017-09-25 18:40:42 +00:00
|
|
|
},
|
2017-10-20 10:02:05 +00:00
|
|
|
{
|
2020-06-17 19:14:40 +00:00
|
|
|
args: []string{`-bootstrap`, `true`},
|
|
|
|
expected: BuilderOpts{Config: Config{Bootstrap: pBool(true)}},
|
|
|
|
extra: []string{"true"},
|
2017-10-20 10:02:05 +00:00
|
|
|
},
|
2020-03-09 20:59:02 +00:00
|
|
|
{
|
|
|
|
args: []string{`-primary-gateway`, `foo.local`, `-primary-gateway`, `bar.local`},
|
2020-06-17 19:14:40 +00:00
|
|
|
expected: BuilderOpts{Config: Config{PrimaryGateways: []string{
|
2020-03-09 20:59:02 +00:00
|
|
|
"foo.local", "bar.local",
|
|
|
|
}}},
|
|
|
|
},
|
2017-09-25 18:40:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
for _, tt := range tests {
|
|
|
|
t.Run(strings.Join(tt.args, " "), func(t *testing.T) {
|
2020-06-17 19:14:40 +00:00
|
|
|
flags := BuilderOpts{}
|
2017-10-20 10:02:05 +00:00
|
|
|
fs := flag.NewFlagSet("", flag.ContinueOnError)
|
|
|
|
AddFlags(fs, &flags)
|
2020-06-17 19:14:40 +00:00
|
|
|
|
2017-10-20 10:02:05 +00:00
|
|
|
err := fs.Parse(tt.args)
|
2020-06-17 19:14:40 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
// Normalize the expected value because require.Equal considers
|
|
|
|
// empty slices/maps and nil slices/maps to be different.
|
|
|
|
if tt.extra == nil && fs.Args() != nil {
|
|
|
|
tt.extra = []string{}
|
2017-09-25 18:40:42 +00:00
|
|
|
}
|
2020-06-17 19:14:40 +00:00
|
|
|
if len(tt.expected.Config.NodeMeta) == 0 {
|
|
|
|
tt.expected.Config.NodeMeta = map[string]string{}
|
2017-09-25 18:40:42 +00:00
|
|
|
}
|
2020-06-17 19:14:40 +00:00
|
|
|
require.Equal(t, tt.extra, fs.Args())
|
|
|
|
require.Equal(t, tt.expected, flags)
|
2017-09-25 18:40:42 +00:00
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|