package server import ( "os" "testing" "time" ) func TestGetBoolOption(t *testing.T) { for _, tc := range []struct { name string envName string exportEnv map[string]string option string options map[string]interface{} defaultValue bool expected bool expectedError bool }{ { name: "default to false", defaultValue: false, option: "opt", expected: false, }, { name: "default to true", defaultValue: true, option: "opt", envName: "VBOOL", expected: true, }, { name: "given option", defaultValue: false, option: "opt", options: map[string]interface{}{"opt": "true"}, expected: true, }, { name: "env value with missing option", defaultValue: true, option: "opt", envName: "VBOOL", exportEnv: map[string]string{"VBOOL": "false"}, expected: false, }, { name: "given option and env var", defaultValue: false, option: "opt", options: map[string]interface{}{"opt": "false"}, envName: "VAR", exportEnv: map[string]string{"VAR": "true"}, expected: true, }, { name: "disable with env var", defaultValue: true, option: "opt", options: map[string]interface{}{"opt": "true"}, envName: "VAR", exportEnv: map[string]string{"VAR": "false"}, expected: false, }, { name: "given option with bad env value", defaultValue: false, option: "opt", options: map[string]interface{}{"opt": "true"}, envName: "VAR", exportEnv: map[string]string{"VAR": "falsed"}, expected: true, expectedError: true, }, { name: "env value with wrong option type", defaultValue: true, option: "opt", options: map[string]interface{}{"opt": 1}, envName: "VAR", exportEnv: map[string]string{"VAR": "true"}, expected: true, expectedError: true, }, { name: "env value with bad option value", defaultValue: true, option: "opt", options: map[string]interface{}{"opt": "falsed"}, envName: "VAR", exportEnv: map[string]string{"VAR": "false"}, expected: false, expectedError: true, }, { name: "bad env value with bad option value", defaultValue: false, option: "opt", options: map[string]interface{}{"opt": "turk"}, envName: "VAR", exportEnv: map[string]string{"VAR": "truth"}, expected: false, expectedError: true, }, } { for key, value := range tc.exportEnv { os.Setenv(key, value) } d, err := getBoolOption(tc.envName, tc.option, tc.defaultValue, tc.options) if err == nil && tc.expectedError { t.Errorf("[%s] unexpected non-error", tc.name) } else if err != nil && !tc.expectedError { t.Errorf("[%s] unexpected error: %v", tc.name, err) } if d != tc.expected { t.Errorf("[%s] got unexpected duration: %t != %t", tc.name, d, tc.expected) } } } func TestGetDurationOption(t *testing.T) { for _, tc := range []struct { name string envName string exportEnv map[string]string option string options map[string]interface{} defaultValue time.Duration expectedDuration time.Duration expectedError bool }{ { name: "no option, no env", defaultValue: time.Minute, option: "opt", expectedDuration: time.Minute, }, { name: "given option", defaultValue: time.Minute, option: "opt", options: map[string]interface{}{"opt": "4000ns"}, expectedDuration: 4000, }, { name: "env value with missing option", defaultValue: time.Minute, option: "opt", envName: "VAR", exportEnv: map[string]string{"VAR": "1s"}, expectedDuration: time.Second, }, { name: "given option and env var", defaultValue: time.Minute, option: "opt", options: map[string]interface{}{"opt": "4000us"}, envName: "VAR", exportEnv: map[string]string{"VAR": "1s"}, expectedDuration: time.Second, }, { name: "given option with bad env value", defaultValue: time.Minute, option: "opt", options: map[string]interface{}{"opt": "1s"}, envName: "VAR", exportEnv: map[string]string{"VAR": "bad"}, expectedDuration: time.Second, expectedError: true, }, { name: "env value with wrong option type", defaultValue: time.Minute, option: "opt", options: map[string]interface{}{"opt": false}, envName: "VAR", exportEnv: map[string]string{"VAR": "2s"}, expectedDuration: time.Second * 2, expectedError: true, }, { name: "env value with bad option value", defaultValue: time.Minute, option: "opt", options: map[string]interface{}{"opt": "bad"}, envName: "VAR", exportEnv: map[string]string{"VAR": "2s"}, expectedDuration: time.Second * 2, expectedError: true, }, { name: "bad env value with bad option value", defaultValue: time.Minute, option: "opt", options: map[string]interface{}{"opt": "bad"}, envName: "VAR", exportEnv: map[string]string{"VAR": "bad"}, expectedDuration: time.Minute, expectedError: true, }, } { for key, value := range tc.exportEnv { os.Setenv(key, value) } d, err := getDurationOption(tc.envName, tc.option, tc.defaultValue, tc.options) if err == nil && tc.expectedError { t.Errorf("[%s] unexpected non-error", tc.name) } else if err != nil && !tc.expectedError { t.Errorf("[%s] unexpected error: %v", tc.name, err) } if d != tc.expectedDuration { t.Errorf("[%s] got unexpected duration: %s != %s", tc.name, d.String(), tc.expectedDuration.String()) } } }