142 lines
3.2 KiB
Go
142 lines
3.2 KiB
Go
package secret
|
|
|
|
import (
|
|
"bytes"
|
|
"log/slog"
|
|
"os"
|
|
"strings"
|
|
"syscall"
|
|
"testing"
|
|
|
|
"golang.org/x/term"
|
|
)
|
|
|
|
func TestDebugLogging(t *testing.T) {
|
|
// Save original GODEBUG and restore it
|
|
originalGodebug := os.Getenv("GODEBUG")
|
|
defer func() {
|
|
if originalGodebug == "" {
|
|
os.Unsetenv("GODEBUG")
|
|
} else {
|
|
os.Setenv("GODEBUG", originalGodebug)
|
|
}
|
|
// Re-initialize debug system with original setting
|
|
initDebugLogging()
|
|
}()
|
|
|
|
tests := []struct {
|
|
name string
|
|
godebug string
|
|
expectEnabled bool
|
|
}{
|
|
{
|
|
name: "debug enabled",
|
|
godebug: "berlin.sneak.pkg.secret",
|
|
expectEnabled: true,
|
|
},
|
|
{
|
|
name: "debug enabled with other flags",
|
|
godebug: "other=1,berlin.sneak.pkg.secret,another=value",
|
|
expectEnabled: true,
|
|
},
|
|
{
|
|
name: "debug disabled",
|
|
godebug: "other=1",
|
|
expectEnabled: false,
|
|
},
|
|
{
|
|
name: "debug disabled empty",
|
|
godebug: "",
|
|
expectEnabled: false,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
// Set GODEBUG
|
|
if tt.godebug == "" {
|
|
os.Unsetenv("GODEBUG")
|
|
} else {
|
|
os.Setenv("GODEBUG", tt.godebug)
|
|
}
|
|
|
|
// Re-initialize debug system
|
|
initDebugLogging()
|
|
|
|
// Test if debug is enabled
|
|
enabled := IsDebugEnabled()
|
|
if enabled != tt.expectEnabled {
|
|
t.Errorf("IsDebugEnabled() = %v, want %v", enabled, tt.expectEnabled)
|
|
}
|
|
|
|
// If debug should be enabled, test that debug output works
|
|
if tt.expectEnabled {
|
|
// Capture debug output by redirecting the colorized handler
|
|
var buf bytes.Buffer
|
|
|
|
// Override the debug logger for testing
|
|
oldLogger := debugLogger
|
|
if term.IsTerminal(int(syscall.Stderr)) {
|
|
// TTY: use colorized handler with our buffer
|
|
debugLogger = slog.New(newColorizedHandler(&buf))
|
|
} else {
|
|
// Non-TTY: use JSON handler with our buffer
|
|
debugLogger = slog.New(slog.NewJSONHandler(&buf, &slog.HandlerOptions{
|
|
Level: slog.LevelDebug,
|
|
}))
|
|
}
|
|
|
|
// Test debug output
|
|
Debug("test message", "key", "value")
|
|
|
|
// Restore original logger
|
|
debugLogger = oldLogger
|
|
|
|
// Check that output was generated
|
|
output := buf.String()
|
|
if !strings.Contains(output, "test message") {
|
|
t.Errorf("Debug output does not contain expected message. Got: %s", output)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestDebugFunctions(t *testing.T) {
|
|
// Enable debug for testing
|
|
originalGodebug := os.Getenv("GODEBUG")
|
|
os.Setenv("GODEBUG", "berlin.sneak.pkg.secret")
|
|
defer func() {
|
|
if originalGodebug == "" {
|
|
os.Unsetenv("GODEBUG")
|
|
} else {
|
|
os.Setenv("GODEBUG", originalGodebug)
|
|
}
|
|
initDebugLogging()
|
|
}()
|
|
|
|
initDebugLogging()
|
|
|
|
if !IsDebugEnabled() {
|
|
t.Skip("Debug not enabled, skipping debug function tests")
|
|
}
|
|
|
|
// Test that debug functions don't panic and can be called
|
|
t.Run("Debug", func(t *testing.T) {
|
|
Debug("test debug message")
|
|
Debug("test with args", "key", "value", "number", 42)
|
|
})
|
|
|
|
t.Run("DebugF", func(t *testing.T) {
|
|
DebugF("formatted message: %s %d", "test", 123)
|
|
})
|
|
|
|
t.Run("DebugWith", func(t *testing.T) {
|
|
DebugWith("structured message",
|
|
slog.String("string_key", "string_value"),
|
|
slog.Int("int_key", 42),
|
|
slog.Bool("bool_key", true),
|
|
)
|
|
})
|
|
}
|