fcf9b83256
This commit adds a new AppDataDir function that can be used to get an operating system and application specific directory to be used for storing application data. For example: dir := AppDataDir("myapp", false) Would result in: POSIX (Linux/BSD): ~/.myapp Mac OS: $HOME/Library/Application Support/Myapp Windows: %LOCALAPPDATA%\Myapp Plan 9: $home/myapp This is work toward conformal/btcd#30.
132 lines
5.3 KiB
Go
132 lines
5.3 KiB
Go
// Copyright (c) 2013 Conformal Systems LLC.
|
|
// Use of this source code is governed by an ISC
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package btcutil_test
|
|
|
|
import (
|
|
"github.com/conformal/btcutil"
|
|
"os"
|
|
"os/user"
|
|
"path/filepath"
|
|
"runtime"
|
|
"testing"
|
|
"unicode"
|
|
)
|
|
|
|
// TestAppDataDir tests the API for AppDataDir to ensure it gives expected
|
|
// results for various operating systems.
|
|
func TestAppDataDir(t *testing.T) {
|
|
// App name plus upper and lowercase variants.
|
|
appName := "myapp"
|
|
appNameUpper := string(unicode.ToUpper(rune(appName[0]))) + appName[1:]
|
|
appNameLower := string(unicode.ToLower(rune(appName[0]))) + appName[1:]
|
|
|
|
// When we're on Windows, set the expected local and roaming directories
|
|
// per the environment vars. When we aren't on Windows, the function
|
|
// should return the current directory when forced to provide the
|
|
// Windows path since the environment variables won't exist.
|
|
winLocal := "."
|
|
winRoaming := "."
|
|
if runtime.GOOS == "windows" {
|
|
localAppData := os.Getenv("LOCALAPPDATA")
|
|
roamingAppData := os.Getenv("APPDATA")
|
|
if localAppData == "" {
|
|
localAppData = roamingAppData
|
|
}
|
|
winLocal = filepath.Join(localAppData, appNameUpper)
|
|
winRoaming = filepath.Join(roamingAppData, appNameUpper)
|
|
}
|
|
|
|
// Get the home directory to use for testing expected results.
|
|
var homeDir string
|
|
usr, err := user.Current()
|
|
if err != nil {
|
|
t.Errorf("user.Current: %v", err)
|
|
return
|
|
}
|
|
homeDir = usr.HomeDir
|
|
|
|
// Mac app data directory.
|
|
macAppData := filepath.Join(homeDir, "Library", "Application Support")
|
|
|
|
tests := []struct {
|
|
goos string
|
|
appName string
|
|
roaming bool
|
|
want string
|
|
}{
|
|
// Various combinations of application name casing, leading
|
|
// period, operating system, and roaming flags.
|
|
{"windows", appNameLower, false, winLocal},
|
|
{"windows", appNameUpper, false, winLocal},
|
|
{"windows", "." + appNameLower, false, winLocal},
|
|
{"windows", "." + appNameUpper, false, winLocal},
|
|
{"windows", appNameLower, true, winRoaming},
|
|
{"windows", appNameUpper, true, winRoaming},
|
|
{"windows", "." + appNameLower, true, winRoaming},
|
|
{"windows", "." + appNameUpper, true, winRoaming},
|
|
{"linux", appNameLower, false, filepath.Join(homeDir, "."+appNameLower)},
|
|
{"linux", appNameUpper, false, filepath.Join(homeDir, "."+appNameLower)},
|
|
{"linux", "." + appNameLower, false, filepath.Join(homeDir, "."+appNameLower)},
|
|
{"linux", "." + appNameUpper, false, filepath.Join(homeDir, "."+appNameLower)},
|
|
{"darwin", appNameLower, false, filepath.Join(macAppData, appNameUpper)},
|
|
{"darwin", appNameUpper, false, filepath.Join(macAppData, appNameUpper)},
|
|
{"darwin", "." + appNameLower, false, filepath.Join(macAppData, appNameUpper)},
|
|
{"darwin", "." + appNameUpper, false, filepath.Join(macAppData, appNameUpper)},
|
|
{"openbsd", appNameLower, false, filepath.Join(homeDir, "."+appNameLower)},
|
|
{"openbsd", appNameUpper, false, filepath.Join(homeDir, "."+appNameLower)},
|
|
{"openbsd", "." + appNameLower, false, filepath.Join(homeDir, "."+appNameLower)},
|
|
{"openbsd", "." + appNameUpper, false, filepath.Join(homeDir, "."+appNameLower)},
|
|
{"freebsd", appNameLower, false, filepath.Join(homeDir, "."+appNameLower)},
|
|
{"freebsd", appNameUpper, false, filepath.Join(homeDir, "."+appNameLower)},
|
|
{"freebsd", "." + appNameLower, false, filepath.Join(homeDir, "."+appNameLower)},
|
|
{"freebsd", "." + appNameUpper, false, filepath.Join(homeDir, "."+appNameLower)},
|
|
{"netbsd", appNameLower, false, filepath.Join(homeDir, "."+appNameLower)},
|
|
{"netbsd", appNameUpper, false, filepath.Join(homeDir, "."+appNameLower)},
|
|
{"netbsd", "." + appNameLower, false, filepath.Join(homeDir, "."+appNameLower)},
|
|
{"netbsd", "." + appNameUpper, false, filepath.Join(homeDir, "."+appNameLower)},
|
|
{"plan9", appNameLower, false, filepath.Join(homeDir, appNameLower)},
|
|
{"plan9", appNameUpper, false, filepath.Join(homeDir, appNameLower)},
|
|
{"plan9", "." + appNameLower, false, filepath.Join(homeDir, appNameLower)},
|
|
{"plan9", "." + appNameUpper, false, filepath.Join(homeDir, appNameLower)},
|
|
{"unrecognized", appNameLower, false, filepath.Join(homeDir, "."+appNameLower)},
|
|
{"unrecognized", appNameUpper, false, filepath.Join(homeDir, "."+appNameLower)},
|
|
{"unrecognized", "." + appNameLower, false, filepath.Join(homeDir, "."+appNameLower)},
|
|
{"unrecognized", "." + appNameUpper, false, filepath.Join(homeDir, "."+appNameLower)},
|
|
|
|
// No application name provided, so expect current directory.
|
|
{"windows", "", false, "."},
|
|
{"windows", "", true, "."},
|
|
{"linux", "", false, "."},
|
|
{"darwin", "", false, "."},
|
|
{"openbsd", "", false, "."},
|
|
{"freebsd", "", false, "."},
|
|
{"netbsd", "", false, "."},
|
|
{"plan9", "", false, "."},
|
|
{"unrecognized", "", false, "."},
|
|
|
|
// Single dot provided for application name, so expect current
|
|
// directory.
|
|
{"windows", ".", false, "."},
|
|
{"windows", ".", true, "."},
|
|
{"linux", ".", false, "."},
|
|
{"darwin", ".", false, "."},
|
|
{"openbsd", ".", false, "."},
|
|
{"freebsd", ".", false, "."},
|
|
{"netbsd", ".", false, "."},
|
|
{"plan9", ".", false, "."},
|
|
{"unrecognized", ".", false, "."},
|
|
}
|
|
|
|
t.Logf("Running %d tests", len(tests))
|
|
for i, test := range tests {
|
|
ret := btcutil.TstAppDataDir(test.goos, test.appName, test.roaming)
|
|
if ret != test.want {
|
|
t.Errorf("appDataDir #%d (%s) does not match - "+
|
|
"expected got %s, want %s", i, test.goos, ret,
|
|
test.want)
|
|
continue
|
|
}
|
|
}
|
|
}
|