b7b652e8c9
Flags is an overloaded term in this context. It generally is used to refer to command line flags. This struct, however, is a data object used as input to the construction. It happens to be partially populated by command line flags, but otherwise has very little to do with them. Renaming this struct should make the actual responsibility of this struct more obvious, and remove the possibility that it is confused with command line flags. This change is in preparation for adding additional fields to BuilderOpts.
117 lines
3.4 KiB
Go
117 lines
3.4 KiB
Go
package config
|
|
|
|
import (
|
|
"flag"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
// TestAddFlags_WithParse tests whether command line flags are properly parsed
|
|
// 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.
|
|
func TestAddFlags_WithParse(t *testing.T) {
|
|
tests := []struct {
|
|
args []string
|
|
expected BuilderOpts
|
|
extra []string
|
|
}{
|
|
{},
|
|
{
|
|
args: []string{`-bind`, `a`},
|
|
expected: BuilderOpts{Config: Config{BindAddr: pString("a")}},
|
|
},
|
|
{
|
|
args: []string{`-bootstrap`},
|
|
expected: BuilderOpts{Config: Config{Bootstrap: pBool(true)}},
|
|
},
|
|
{
|
|
args: []string{`-bootstrap=true`},
|
|
expected: BuilderOpts{Config: Config{Bootstrap: pBool(true)}},
|
|
},
|
|
{
|
|
args: []string{`-bootstrap=false`},
|
|
expected: BuilderOpts{Config: Config{Bootstrap: pBool(false)}},
|
|
},
|
|
{
|
|
args: []string{`-config-file`, `a`, `-config-dir`, `b`, `-config-file`, `c`, `-config-dir`, `d`},
|
|
expected: BuilderOpts{ConfigFiles: []string{"a", "b", "c", "d"}},
|
|
},
|
|
{
|
|
args: []string{`-datacenter`, `a`},
|
|
expected: BuilderOpts{Config: Config{Datacenter: pString("a")}},
|
|
},
|
|
{
|
|
args: []string{`-dns-port`, `1`},
|
|
expected: BuilderOpts{Config: Config{Ports: Ports{DNS: pInt(1)}}},
|
|
},
|
|
{
|
|
args: []string{`-grpc-port`, `1`},
|
|
expected: BuilderOpts{Config: Config{Ports: Ports{GRPC: pInt(1)}}},
|
|
},
|
|
{
|
|
args: []string{`-http-port`, `1`},
|
|
expected: BuilderOpts{Config: Config{Ports: Ports{HTTP: pInt(1)}}},
|
|
},
|
|
{
|
|
args: []string{`-https-port`, `1`},
|
|
expected: BuilderOpts{Config: Config{Ports: Ports{HTTPS: pInt(1)}}},
|
|
},
|
|
{
|
|
args: []string{`-serf-lan-port`, `1`},
|
|
expected: BuilderOpts{Config: Config{Ports: Ports{SerfLAN: pInt(1)}}},
|
|
},
|
|
{
|
|
args: []string{`-serf-wan-port`, `1`},
|
|
expected: BuilderOpts{Config: Config{Ports: Ports{SerfWAN: pInt(1)}}},
|
|
},
|
|
{
|
|
args: []string{`-server-port`, `1`},
|
|
expected: BuilderOpts{Config: Config{Ports: Ports{Server: pInt(1)}}},
|
|
},
|
|
{
|
|
args: []string{`-join`, `a`, `-join`, `b`},
|
|
expected: BuilderOpts{Config: Config{StartJoinAddrsLAN: []string{"a", "b"}}},
|
|
},
|
|
{
|
|
args: []string{`-node-meta`, `a:b`, `-node-meta`, `c:d`},
|
|
expected: BuilderOpts{Config: Config{NodeMeta: map[string]string{"a": "b", "c": "d"}}},
|
|
},
|
|
{
|
|
args: []string{`-bootstrap`, `true`},
|
|
expected: BuilderOpts{Config: Config{Bootstrap: pBool(true)}},
|
|
extra: []string{"true"},
|
|
},
|
|
{
|
|
args: []string{`-primary-gateway`, `foo.local`, `-primary-gateway`, `bar.local`},
|
|
expected: BuilderOpts{Config: Config{PrimaryGateways: []string{
|
|
"foo.local", "bar.local",
|
|
}}},
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(strings.Join(tt.args, " "), func(t *testing.T) {
|
|
flags := BuilderOpts{}
|
|
fs := flag.NewFlagSet("", flag.ContinueOnError)
|
|
AddFlags(fs, &flags)
|
|
|
|
err := fs.Parse(tt.args)
|
|
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{}
|
|
}
|
|
if len(tt.expected.Config.NodeMeta) == 0 {
|
|
tt.expected.Config.NodeMeta = map[string]string{}
|
|
}
|
|
require.Equal(t, tt.extra, fs.Args())
|
|
require.Equal(t, tt.expected, flags)
|
|
})
|
|
}
|
|
}
|