mirror of
https://github.com/caddyserver/caddy.git
synced 2025-11-11 00:56:56 -05:00
more storage tests
Signed-off-by: Mohammed Al Sahaf <msaa1990@gmail.com>
This commit is contained in:
parent
c8bc9971b4
commit
f35ea4665d
339
storage_test.go
339
storage_test.go
@ -755,6 +755,345 @@ func TestDirectory_Creation_Validation(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestAppConfigDir_ErrorFallback tests the error handling when os.UserConfigDir() fails
|
||||||
|
// This is difficult to test directly, but we can at least test the fallback behavior
|
||||||
|
func TestAppConfigDir_ErrorFallback(t *testing.T) {
|
||||||
|
// Save original environment
|
||||||
|
originalXDG := os.Getenv("XDG_CONFIG_HOME")
|
||||||
|
defer func() {
|
||||||
|
if originalXDG == "" {
|
||||||
|
os.Unsetenv("XDG_CONFIG_HOME")
|
||||||
|
} else {
|
||||||
|
os.Setenv("XDG_CONFIG_HOME", originalXDG)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
// Clear XDG to force use of os.UserConfigDir()
|
||||||
|
os.Unsetenv("XDG_CONFIG_HOME")
|
||||||
|
|
||||||
|
// Call AppConfigDir - it should not panic even if there are issues
|
||||||
|
result := AppConfigDir()
|
||||||
|
|
||||||
|
// Result should never be empty
|
||||||
|
if result == "" {
|
||||||
|
t.Error("AppConfigDir should never return empty string")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Should contain "caddy" or "Caddy"
|
||||||
|
if !strings.Contains(result, "caddy") && !strings.Contains(result, "Caddy") {
|
||||||
|
t.Errorf("AppConfigDir should contain 'caddy' or 'Caddy': got '%s'", result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestAppDataDir_Darwin_Path tests macOS-specific path construction
|
||||||
|
func TestAppDataDir_Darwin_Path(t *testing.T) {
|
||||||
|
if runtime.GOOS != "darwin" {
|
||||||
|
t.Skip("macOS-specific test")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save original environment
|
||||||
|
originalXDG := os.Getenv("XDG_DATA_HOME")
|
||||||
|
defer func() {
|
||||||
|
if originalXDG == "" {
|
||||||
|
os.Unsetenv("XDG_DATA_HOME")
|
||||||
|
} else {
|
||||||
|
os.Setenv("XDG_DATA_HOME", originalXDG)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
// Clear XDG to use platform-specific logic
|
||||||
|
os.Unsetenv("XDG_DATA_HOME")
|
||||||
|
|
||||||
|
result := AppDataDir()
|
||||||
|
|
||||||
|
// On macOS, should contain "Library/Application Support/Caddy"
|
||||||
|
if !strings.Contains(result, "Library") || !strings.Contains(result, "Application Support") {
|
||||||
|
t.Errorf("macOS AppDataDir should contain 'Library/Application Support': got '%s'", result)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !strings.HasSuffix(result, "Caddy") {
|
||||||
|
t.Errorf("macOS AppDataDir should end with 'Caddy': got '%s'", result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestAppDataDir_Windows_Path tests Windows-specific path construction
|
||||||
|
func TestAppDataDir_Windows_Path(t *testing.T) {
|
||||||
|
if runtime.GOOS != "windows" {
|
||||||
|
t.Skip("Windows-specific test")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save original environment
|
||||||
|
originalXDG := os.Getenv("XDG_DATA_HOME")
|
||||||
|
originalAppData := os.Getenv("AppData")
|
||||||
|
defer func() {
|
||||||
|
if originalXDG == "" {
|
||||||
|
os.Unsetenv("XDG_DATA_HOME")
|
||||||
|
} else {
|
||||||
|
os.Setenv("XDG_DATA_HOME", originalXDG)
|
||||||
|
}
|
||||||
|
if originalAppData == "" {
|
||||||
|
os.Unsetenv("AppData")
|
||||||
|
} else {
|
||||||
|
os.Setenv("AppData", originalAppData)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
// Clear XDG to use platform-specific logic
|
||||||
|
os.Unsetenv("XDG_DATA_HOME")
|
||||||
|
|
||||||
|
// Set AppData
|
||||||
|
os.Setenv("AppData", "C:\\Users\\TestUser\\AppData\\Roaming")
|
||||||
|
|
||||||
|
result := AppDataDir()
|
||||||
|
|
||||||
|
// On Windows, should use AppData and end with "Caddy"
|
||||||
|
if !strings.Contains(result, "AppData") {
|
||||||
|
t.Errorf("Windows AppDataDir should contain 'AppData': got '%s'", result)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !strings.HasSuffix(result, "Caddy") {
|
||||||
|
t.Errorf("Windows AppDataDir should end with 'Caddy': got '%s'", result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Should this be kept? We cannot test plan9. We don't have plan9 CI.
|
||||||
|
// TestAppDataDir_Plan9_Path tests Plan9-specific path construction
|
||||||
|
// func TestAppDataDir_Plan9_Path(t *testing.T) {
|
||||||
|
// if runtime.GOOS != "plan9" {
|
||||||
|
// t.Skip("Plan9-specific test")
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // Save original environment
|
||||||
|
// originalXDG := os.Getenv("XDG_DATA_HOME")
|
||||||
|
// originalHome := os.Getenv("home")
|
||||||
|
// defer func() {
|
||||||
|
// if originalXDG == "" {
|
||||||
|
// os.Unsetenv("XDG_DATA_HOME")
|
||||||
|
// } else {
|
||||||
|
// os.Setenv("XDG_DATA_HOME", originalXDG)
|
||||||
|
// }
|
||||||
|
// if originalHome == "" {
|
||||||
|
// os.Unsetenv("home")
|
||||||
|
// } else {
|
||||||
|
// os.Setenv("home", originalHome)
|
||||||
|
// }
|
||||||
|
// }()
|
||||||
|
|
||||||
|
// // Clear XDG to use platform-specific logic
|
||||||
|
// os.Unsetenv("XDG_DATA_HOME")
|
||||||
|
// os.Setenv("home", "/usr/testuser")
|
||||||
|
|
||||||
|
// result := AppDataDir()
|
||||||
|
|
||||||
|
// // On Plan9, should contain "lib/caddy"
|
||||||
|
// expectedPath := filepath.Join("/usr/testuser", "lib", "caddy")
|
||||||
|
// if result != expectedPath {
|
||||||
|
// t.Errorf("Plan9 AppDataDir: expected '%s', got '%s'", expectedPath, result)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// TestAppDataDir_Linux_Path tests Linux/Unix-specific path construction
|
||||||
|
func TestAppDataDir_Linux_Path(t *testing.T) {
|
||||||
|
if runtime.GOOS != "linux" {
|
||||||
|
t.Skip("Linux-specific test")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save original environment
|
||||||
|
originalXDG := os.Getenv("XDG_DATA_HOME")
|
||||||
|
originalHOME := os.Getenv("HOME")
|
||||||
|
defer func() {
|
||||||
|
if originalXDG == "" {
|
||||||
|
os.Unsetenv("XDG_DATA_HOME")
|
||||||
|
} else {
|
||||||
|
os.Setenv("XDG_DATA_HOME", originalXDG)
|
||||||
|
}
|
||||||
|
if originalHOME == "" {
|
||||||
|
os.Unsetenv("HOME")
|
||||||
|
} else {
|
||||||
|
os.Setenv("HOME", originalHOME)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
// Clear XDG to use platform-specific logic
|
||||||
|
os.Unsetenv("XDG_DATA_HOME")
|
||||||
|
os.Setenv("HOME", "/home/testuser")
|
||||||
|
|
||||||
|
result := AppDataDir()
|
||||||
|
|
||||||
|
// On Linux, should contain ".local/share/caddy"
|
||||||
|
expectedPath := filepath.Join("/home/testuser", ".local", "share", "caddy")
|
||||||
|
if result != expectedPath {
|
||||||
|
t.Errorf("Linux AppDataDir: expected '%s', got '%s'", expectedPath, result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Should this be kept? We cannot test plan9. We don't have plan9 CI.
|
||||||
|
// TestHomeDirUnsafe_Plan9 tests Plan9-specific home directory detection
|
||||||
|
// func TestHomeDirUnsafe_Plan9(t *testing.T) {
|
||||||
|
// if runtime.GOOS != "plan9" {
|
||||||
|
// t.Skip("Plan9-specific test")
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // Save original environment
|
||||||
|
// originalHome := os.Getenv("HOME")
|
||||||
|
// originalHomeLC := os.Getenv("home")
|
||||||
|
// defer func() {
|
||||||
|
// if originalHome == "" {
|
||||||
|
// os.Unsetenv("HOME")
|
||||||
|
// } else {
|
||||||
|
// os.Setenv("HOME", originalHome)
|
||||||
|
// }
|
||||||
|
// if originalHomeLC == "" {
|
||||||
|
// os.Unsetenv("home")
|
||||||
|
// } else {
|
||||||
|
// os.Setenv("home", originalHomeLC)
|
||||||
|
// }
|
||||||
|
// }()
|
||||||
|
|
||||||
|
// // Test with Plan9's lowercase "home" variable
|
||||||
|
// os.Unsetenv("HOME")
|
||||||
|
// os.Setenv("home", "/usr/plan9user")
|
||||||
|
|
||||||
|
// result := homeDirUnsafe()
|
||||||
|
|
||||||
|
// if result != "/usr/plan9user" {
|
||||||
|
// t.Errorf("Plan9 homeDirUnsafe: expected '/usr/plan9user', got '%s'", result)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// TestHomeDirUnsafe_Windows tests Windows-specific home directory detection
|
||||||
|
func TestHomeDirUnsafe_Windows(t *testing.T) {
|
||||||
|
if runtime.GOOS != "windows" {
|
||||||
|
t.Skip("Windows-specific test")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save original environment
|
||||||
|
originalEnv := map[string]string{
|
||||||
|
"HOME": os.Getenv("HOME"),
|
||||||
|
"HOMEDRIVE": os.Getenv("HOMEDRIVE"),
|
||||||
|
"HOMEPATH": os.Getenv("HOMEPATH"),
|
||||||
|
"USERPROFILE": os.Getenv("USERPROFILE"),
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
for key, value := range originalEnv {
|
||||||
|
if value == "" {
|
||||||
|
os.Unsetenv(key)
|
||||||
|
} else {
|
||||||
|
os.Setenv(key, value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
// Test HOMEDRIVE + HOMEPATH combination
|
||||||
|
os.Unsetenv("HOME")
|
||||||
|
os.Setenv("HOMEDRIVE", "C:")
|
||||||
|
os.Setenv("HOMEPATH", "\\Users\\TestUser")
|
||||||
|
os.Unsetenv("USERPROFILE")
|
||||||
|
|
||||||
|
result := homeDirUnsafe()
|
||||||
|
expected := "C:\\Users\\TestUser"
|
||||||
|
|
||||||
|
if result != expected {
|
||||||
|
t.Errorf("Windows homeDirUnsafe with HOMEDRIVE+HOMEPATH: expected '%s', got '%s'", expected, result)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test USERPROFILE fallback when HOMEDRIVE or HOMEPATH is missing
|
||||||
|
os.Unsetenv("HOME")
|
||||||
|
os.Unsetenv("HOMEDRIVE")
|
||||||
|
os.Setenv("HOMEPATH", "\\Users\\TestUser")
|
||||||
|
os.Setenv("USERPROFILE", "C:\\Users\\TestUser")
|
||||||
|
|
||||||
|
result = homeDirUnsafe()
|
||||||
|
expected = "C:\\Users\\TestUser"
|
||||||
|
|
||||||
|
if result != expected {
|
||||||
|
t.Errorf("Windows homeDirUnsafe with USERPROFILE: expected '%s', got '%s'", expected, result)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test when only HOMEDRIVE is set (should use USERPROFILE)
|
||||||
|
os.Unsetenv("HOME")
|
||||||
|
os.Setenv("HOMEDRIVE", "C:")
|
||||||
|
os.Unsetenv("HOMEPATH")
|
||||||
|
os.Setenv("USERPROFILE", "C:\\Users\\TestUser")
|
||||||
|
|
||||||
|
result = homeDirUnsafe()
|
||||||
|
expected = "C:\\Users\\TestUser"
|
||||||
|
|
||||||
|
if result != expected {
|
||||||
|
t.Errorf("Windows homeDirUnsafe with only HOMEDRIVE: expected '%s', got '%s'", expected, result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestConfigAutosavePath_NotEmpty tests that ConfigAutosavePath is always set
|
||||||
|
func TestConfigAutosavePath_NotEmpty(t *testing.T) {
|
||||||
|
if ConfigAutosavePath == "" {
|
||||||
|
t.Error("ConfigAutosavePath should not be empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
if !strings.HasSuffix(ConfigAutosavePath, "autosave.json") {
|
||||||
|
t.Errorf("ConfigAutosavePath should end with 'autosave.json': got '%s'", ConfigAutosavePath)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Should be an absolute path
|
||||||
|
if !filepath.IsAbs(ConfigAutosavePath) {
|
||||||
|
t.Errorf("ConfigAutosavePath should be absolute: got '%s'", ConfigAutosavePath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestDefaultStorage_NotNil tests that DefaultStorage is initialized
|
||||||
|
func TestDefaultStorage_NotNil(t *testing.T) {
|
||||||
|
if DefaultStorage == nil {
|
||||||
|
t.Fatal("DefaultStorage should not be nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
if DefaultStorage.Path == "" {
|
||||||
|
t.Error("DefaultStorage.Path should not be empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path should be absolute
|
||||||
|
if !filepath.IsAbs(DefaultStorage.Path) {
|
||||||
|
t.Errorf("DefaultStorage.Path should be absolute: got '%s'", DefaultStorage.Path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestAppDataDir_NoHome_Fallback tests fallback when no home directory can be determined
|
||||||
|
func TestAppDataDir_NoHome_Fallback(t *testing.T) {
|
||||||
|
// Skip on platforms where we can't easily clear all home-related variables
|
||||||
|
if runtime.GOOS == "windows" || runtime.GOOS == "darwin" || runtime.GOOS == "plan9" {
|
||||||
|
t.Skip("Skipping on platforms where clearing home is complex")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save original environment
|
||||||
|
originalEnv := map[string]string{
|
||||||
|
"XDG_DATA_HOME": os.Getenv("XDG_DATA_HOME"),
|
||||||
|
"HOME": os.Getenv("HOME"),
|
||||||
|
"AppData": os.Getenv("AppData"),
|
||||||
|
"home": os.Getenv("home"),
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
for key, value := range originalEnv {
|
||||||
|
if value == "" {
|
||||||
|
os.Unsetenv(key)
|
||||||
|
} else {
|
||||||
|
os.Setenv(key, value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
// Clear all relevant environment variables
|
||||||
|
os.Unsetenv("XDG_DATA_HOME")
|
||||||
|
os.Unsetenv("HOME")
|
||||||
|
os.Unsetenv("AppData")
|
||||||
|
os.Unsetenv("home")
|
||||||
|
|
||||||
|
result := AppDataDir()
|
||||||
|
|
||||||
|
// Should fall back to "./caddy"
|
||||||
|
if result != "./caddy" {
|
||||||
|
t.Errorf("AppDataDir with no home should return './caddy', got '%s'", result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func BenchmarkHomeDir(b *testing.B) {
|
func BenchmarkHomeDir(b *testing.B) {
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
HomeDir()
|
HomeDir()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user