|
|
|
package configfilearg
|
|
|
|
|
|
|
|
import (
|
|
|
|
"os"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestFindStart(t *testing.T) {
|
|
|
|
testCases := []struct {
|
|
|
|
input []string
|
|
|
|
prefix []string
|
|
|
|
suffix []string
|
|
|
|
found bool
|
|
|
|
what string
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
input: nil,
|
|
|
|
prefix: nil,
|
|
|
|
suffix: nil,
|
|
|
|
found: false,
|
|
|
|
what: "default case",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
input: []string{"server"},
|
|
|
|
prefix: []string{"server"},
|
|
|
|
suffix: []string{},
|
|
|
|
found: true,
|
|
|
|
what: "simple case",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
input: []string{"server", "foo"},
|
|
|
|
prefix: []string{"server"},
|
|
|
|
suffix: []string{"foo"},
|
|
|
|
found: true,
|
|
|
|
what: "also simple case",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
input: []string{"server", "foo", "bar"},
|
|
|
|
prefix: []string{"server"},
|
|
|
|
suffix: []string{"foo", "bar"},
|
|
|
|
found: true,
|
|
|
|
what: "longer simple case",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
input: []string{"not-server", "foo", "bar"},
|
|
|
|
prefix: []string{"not-server", "foo", "bar"},
|
|
|
|
found: false,
|
|
|
|
what: "not found",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
p := Parser{
|
|
|
|
After: []string{"server", "agent"},
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, testCase := range testCases {
|
|
|
|
prefix, suffix, found := p.findStart(testCase.input)
|
|
|
|
assert.Equal(t, testCase.prefix, prefix)
|
|
|
|
assert.Equal(t, testCase.suffix, suffix)
|
|
|
|
assert.Equal(t, testCase.found, found)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestConfigFile(t *testing.T) {
|
|
|
|
testCases := []struct {
|
|
|
|
input []string
|
|
|
|
env string
|
|
|
|
def string
|
|
|
|
configFile string
|
|
|
|
found bool
|
|
|
|
what string
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
input: nil,
|
|
|
|
found: false,
|
|
|
|
what: "default case",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
input: []string{"asdf", "-c", "value"},
|
|
|
|
configFile: "value",
|
|
|
|
found: true,
|
|
|
|
what: "simple case",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
input: []string{"-c"},
|
|
|
|
found: false,
|
|
|
|
what: "invalid args string",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
input: []string{"-c="},
|
|
|
|
found: true,
|
|
|
|
what: "empty arg value",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
def: "def",
|
|
|
|
input: []string{"-c="},
|
|
|
|
found: true,
|
|
|
|
what: "empty arg value override default",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
def: "def",
|
|
|
|
input: []string{"-c"},
|
|
|
|
found: false,
|
|
|
|
what: "invalid args always return no value",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
def: "def",
|
|
|
|
input: []string{"-c", "value"},
|
|
|
|
configFile: "value",
|
|
|
|
found: true,
|
|
|
|
what: "value override default",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
def: "def",
|
|
|
|
configFile: "def",
|
|
|
|
found: false,
|
|
|
|
what: "default gets used when nothing is passed",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
def: "def",
|
|
|
|
input: []string{"-c", "value"},
|
|
|
|
env: "env",
|
|
|
|
configFile: "env",
|
|
|
|
found: true,
|
|
|
|
what: "env override args",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
def: "def",
|
|
|
|
input: []string{"before", "-c", "value", "after"},
|
|
|
|
configFile: "value",
|
|
|
|
found: true,
|
|
|
|
what: "garbage in start and end",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, testCase := range testCases {
|
|
|
|
p := Parser{
|
|
|
|
FlagNames: []string{"--config", "-c"},
|
|
|
|
EnvName: "_TEST_FLAG_ENV",
|
|
|
|
DefaultConfig: testCase.def,
|
|
|
|
}
|
|
|
|
os.Setenv(p.EnvName, testCase.env)
|
|
|
|
configFile, found := p.findConfigFileFlag(testCase.input)
|
|
|
|
assert.Equal(t, testCase.configFile, configFile, testCase.what)
|
|
|
|
assert.Equal(t, testCase.found, found, testCase.what)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestParse(t *testing.T) {
|
|
|
|
testDataOutput := []string{
|
|
|
|
"--foo-bar=bar-foo",
|
|
|
|
"--a-slice=1",
|
|
|
|
"--a-slice=1.5",
|
|
|
|
"--a-slice=2",
|
|
|
|
"--a-slice=",
|
|
|
|
"--a-slice=three",
|
|
|
|
"--isempty=",
|
|
|
|
"-c=b",
|
|
|
|
"--isfalse=false",
|
|
|
|
"--islast=true",
|
|
|
|
"--b-string=one",
|
|
|
|
"--b-string=two",
|
|
|
|
"--c-slice=one",
|
|
|
|
"--c-slice=two",
|
|
|
|
"--c-slice=three",
|
|
|
|
"--d-slice=three",
|
|
|
|
"--d-slice=four",
|
|
|
|
"--e-slice=one",
|
|
|
|
"--e-slice=two",
|
|
|
|
}
|
|
|
|
|
|
|
|
defParser := Parser{
|
|
|
|
After: []string{"server", "agent"},
|
|
|
|
FlagNames: []string{"-c", "--config"},
|
|
|
|
EnvName: "_TEST_ENV",
|
|
|
|
DefaultConfig: "./testdata/data.yaml",
|
|
|
|
}
|
|
|
|
|
|
|
|
testCases := []struct {
|
|
|
|
parser Parser
|
|
|
|
env string
|
|
|
|
input []string
|
|
|
|
output []string
|
|
|
|
err string
|
|
|
|
what string
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
parser: defParser,
|
|
|
|
what: "default case",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
parser: defParser,
|
|
|
|
input: []string{"server"},
|
|
|
|
output: append([]string{"server"}, testDataOutput...),
|
|
|
|
what: "read config file when not specified",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
parser: Parser{
|
|
|
|
After: []string{"server", "agent"},
|
|
|
|
FlagNames: []string{"-c", "--config"},
|
|
|
|
DefaultConfig: "missing",
|
|
|
|
},
|
|
|
|
input: []string{"server"},
|
|
|
|
output: []string{"server"},
|
|
|
|
what: "ignore missing config when not set",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
parser: Parser{
|
|
|
|
After: []string{"server", "agent"},
|
|
|
|
FlagNames: []string{"-c", "--config"},
|
|
|
|
DefaultConfig: "missing",
|
|
|
|
},
|
|
|
|
input: []string{"server", "-c=missing"},
|
|
|
|
output: []string{"server", "-c=missing"},
|
|
|
|
what: "fail when missing config",
|
|
|
|
err: "stat missing: no such file or directory",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
parser: Parser{
|
|
|
|
After: []string{"server", "agent"},
|
|
|
|
FlagNames: []string{"-c", "--config"},
|
|
|
|
DefaultConfig: "missing",
|
|
|
|
},
|
|
|
|
input: []string{"before", "server", "before", "-c", "./testdata/data.yaml", "after"},
|
|
|
|
output: append(append([]string{"before", "server"}, testDataOutput...), "before", "-c", "./testdata/data.yaml", "after"),
|
|
|
|
what: "read config file",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
parser: Parser{
|
|
|
|
After: []string{"server", "agent"},
|
|
|
|
FlagNames: []string{"-c", "--config"},
|
|
|
|
DefaultConfig: "missing",
|
|
|
|
},
|
|
|
|
input: []string{"before", "server", "before", "-c", "./testdata/data.yaml.d/02-data.yaml", "after"},
|
|
|
|
output: []string{"before", "server",
|
|
|
|
"--foo-bar=bar-foo",
|
|
|
|
"--b-string=two",
|
|
|
|
"--c-slice=three",
|
|
|
|
"--d-slice=three",
|
|
|
|
"--d-slice=four",
|
|
|
|
"--e-slice=one",
|
|
|
|
"--e-slice=two",
|
|
|
|
"before", "-c", "./testdata/data.yaml.d/02-data.yaml", "after"},
|
|
|
|
what: "read single config file",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, testCase := range testCases {
|
|
|
|
os.Setenv(testCase.parser.EnvName, testCase.env)
|
|
|
|
output, err := testCase.parser.Parse(testCase.input)
|
|
|
|
if err == nil {
|
|
|
|
assert.Equal(t, testCase.err, "", testCase.what)
|
|
|
|
} else {
|
|
|
|
assert.Equal(t, testCase.err, err.Error(), testCase.what)
|
|
|
|
}
|
|
|
|
if testCase.err == "" {
|
|
|
|
assert.Equal(t, testCase.output, output, testCase.what)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|