summaryrefslogtreecommitdiffstats
path: root/utils/config_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'utils/config_test.go')
-rw-r--r--utils/config_test.go174
1 files changed, 163 insertions, 11 deletions
diff --git a/utils/config_test.go b/utils/config_test.go
index 75bbc420f..f57add303 100644
--- a/utils/config_test.go
+++ b/utils/config_test.go
@@ -46,20 +46,172 @@ func TestTimezoneConfig(t *testing.T) {
}
func TestFindConfigFile(t *testing.T) {
- dir, err := ioutil.TempDir("", "")
- require.NoError(t, err)
- defer os.RemoveAll(dir)
+ t.Run("config.json in current working directory, not inside config/", func(t *testing.T) {
+ // Force a unique working directory
+ cwd, err := ioutil.TempDir("", "")
+ require.NoError(t, err)
+ defer os.RemoveAll(cwd)
+
+ prevDir, err := os.Getwd()
+ require.NoError(t, err)
+ defer os.Chdir(prevDir)
+ os.Chdir(cwd)
+
+ configJson, err := filepath.Abs("config.json")
+ require.NoError(t, err)
+ require.NoError(t, ioutil.WriteFile(configJson, []byte("{}"), 0600))
+
+ // Relative paths end up getting symlinks fully resolved.
+ configJsonResolved, err := filepath.EvalSymlinks(configJson)
+ require.NoError(t, err)
+
+ assert.Equal(t, configJsonResolved, FindConfigFile("config.json"))
+ })
- path := filepath.Join(dir, "config.json")
- require.NoError(t, ioutil.WriteFile(path, []byte("{}"), 0600))
+ t.Run("config/config.json from various paths", func(t *testing.T) {
+ // Create the following directory structure:
+ // tmpDir1/
+ // config/
+ // config.json
+ // tmpDir2/
+ // tmpDir3/
+ // tmpDir4/
+ // tmpDir5/
+ tmpDir1, err := ioutil.TempDir("", "")
+ require.NoError(t, err)
+ defer os.RemoveAll(tmpDir1)
+
+ err = os.Mkdir(filepath.Join(tmpDir1, "config"), 0700)
+ require.NoError(t, err)
+
+ tmpDir2, err := ioutil.TempDir(tmpDir1, "")
+ require.NoError(t, err)
+
+ tmpDir3, err := ioutil.TempDir(tmpDir2, "")
+ require.NoError(t, err)
+
+ tmpDir4, err := ioutil.TempDir(tmpDir3, "")
+ require.NoError(t, err)
+
+ tmpDir5, err := ioutil.TempDir(tmpDir4, "")
+ require.NoError(t, err)
+
+ configJson := filepath.Join(tmpDir1, "config", "config.json")
+ require.NoError(t, ioutil.WriteFile(configJson, []byte("{}"), 0600))
+
+ // Relative paths end up getting symlinks fully resolved, so use this below as necessary.
+ configJsonResolved, err := filepath.EvalSymlinks(configJson)
+ require.NoError(t, err)
+
+ testCases := []struct {
+ Description string
+ Cwd *string
+ FileName string
+ Expected string
+ }{
+ {
+ "absolute path to config.json",
+ nil,
+ configJson,
+ configJson,
+ },
+ {
+ "absolute path to config.json from directory containing config.json",
+ &tmpDir1,
+ configJson,
+ configJson,
+ },
+ {
+ "relative path to config.json from directory containing config.json",
+ &tmpDir1,
+ "config.json",
+ configJsonResolved,
+ },
+ {
+ "subdirectory of directory containing config.json",
+ &tmpDir2,
+ "config.json",
+ configJsonResolved,
+ },
+ {
+ "twice-nested subdirectory of directory containing config.json",
+ &tmpDir3,
+ "config.json",
+ configJsonResolved,
+ },
+ {
+ "thrice-nested subdirectory of directory containing config.json",
+ &tmpDir4,
+ "config.json",
+ configJsonResolved,
+ },
+ {
+ "can't find from four nesting levels deep",
+ &tmpDir5,
+ "config.json",
+ "",
+ },
+ }
- assert.Equal(t, path, FindConfigFile(path))
+ for _, testCase := range testCases {
+ t.Run(testCase.Description, func(t *testing.T) {
+ if testCase.Cwd != nil {
+ prevDir, err := os.Getwd()
+ require.NoError(t, err)
+ defer os.Chdir(prevDir)
+ os.Chdir(*testCase.Cwd)
+ }
+
+ assert.Equal(t, testCase.Expected, FindConfigFile(testCase.FileName))
+ })
+ }
+ })
+
+ t.Run("config/config.json relative to executable", func(t *testing.T) {
+ osExecutable, err := os.Executable()
+ require.NoError(t, err)
+ osExecutableDir := filepath.Dir(osExecutable)
+
+ // Force a working directory different than the executable.
+ cwd, err := ioutil.TempDir("", "")
+ require.NoError(t, err)
+ defer os.RemoveAll(cwd)
+
+ prevDir, err := os.Getwd()
+ require.NoError(t, err)
+ defer os.Chdir(prevDir)
+ os.Chdir(cwd)
+
+ testCases := []struct {
+ Description string
+ RelativePath string
+ }{
+ {
+ "config/config.json",
+ ".",
+ },
+ {
+ "../config/config.json",
+ "../",
+ },
+ }
- prevDir, err := os.Getwd()
- require.NoError(t, err)
- defer os.Chdir(prevDir)
- os.Chdir(dir)
- assert.Equal(t, path, FindConfigFile(path))
+ for _, testCase := range testCases {
+ t.Run(testCase.Description, func(t *testing.T) {
+ // Install the config in config/config.json relative to the executable
+ configJson := filepath.Join(osExecutableDir, testCase.RelativePath, "config", "config.json")
+ require.NoError(t, os.Mkdir(filepath.Dir(configJson), 0700))
+ require.NoError(t, ioutil.WriteFile(configJson, []byte("{}"), 0600))
+ defer os.RemoveAll(filepath.Dir(configJson))
+
+ // Relative paths end up getting symlinks fully resolved.
+ configJsonResolved, err := filepath.EvalSymlinks(configJson)
+ require.NoError(t, err)
+
+ assert.Equal(t, configJsonResolved, FindConfigFile("config.json"))
+ })
+ }
+ })
}
func TestConfigFromEnviroVars(t *testing.T) {