fix: error check on state (#864)
This commit is contained in:
parent
83dbff7785
commit
b26337501c
2 changed files with 47 additions and 3 deletions
|
|
@ -40,7 +40,9 @@ func NewManager(workspace string) *Manager {
|
||||||
oldStateFile := filepath.Join(workspace, "state.json")
|
oldStateFile := filepath.Join(workspace, "state.json")
|
||||||
|
|
||||||
// Create state directory if it doesn't exist
|
// Create state directory if it doesn't exist
|
||||||
os.MkdirAll(stateDir, 0o755)
|
if err := os.MkdirAll(stateDir, 0o755); err != nil {
|
||||||
|
log.Fatalf("[FATAL] state: failed to create state directory: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
sm := &Manager{
|
sm := &Manager{
|
||||||
workspace: workspace,
|
workspace: workspace,
|
||||||
|
|
@ -54,13 +56,17 @@ func NewManager(workspace string) *Manager {
|
||||||
if data, err := os.ReadFile(oldStateFile); err == nil {
|
if data, err := os.ReadFile(oldStateFile); err == nil {
|
||||||
if err := json.Unmarshal(data, sm.state); err == nil {
|
if err := json.Unmarshal(data, sm.state); err == nil {
|
||||||
// Migrate to new location
|
// Migrate to new location
|
||||||
sm.saveAtomic()
|
if err := sm.saveAtomic(); err != nil {
|
||||||
|
log.Printf("[WARN] state: failed to save state: %v", err)
|
||||||
|
}
|
||||||
log.Printf("[INFO] state: migrated state from %s to %s", oldStateFile, stateFile)
|
log.Printf("[INFO] state: migrated state from %s to %s", oldStateFile, stateFile)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Load from new location
|
// Load from new location
|
||||||
sm.load()
|
if err := sm.load(); err != nil {
|
||||||
|
log.Printf("[WARN] state: failed to load state: %v", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return sm
|
return sm
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,10 @@ package state
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
@ -214,3 +216,39 @@ func TestNewManager_EmptyWorkspace(t *testing.T) {
|
||||||
t.Error("Expected zero timestamp for new state")
|
t.Error("Expected zero timestamp for new state")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestNewManager_MkdirFailureCrashes(t *testing.T) {
|
||||||
|
// Since log.Fatalf calls os.Exit(1), we cannot test it normally
|
||||||
|
// Otherwise, the test suite would stop altogether.
|
||||||
|
// We use the standard pattern of Go: rerun this test in a subprocess.
|
||||||
|
if os.Getenv("BE_CRASHER") == "1" {
|
||||||
|
tmpDir := os.Getenv("CRASH_DIR")
|
||||||
|
|
||||||
|
statePath := filepath.Join(tmpDir, "state")
|
||||||
|
if err := os.WriteFile(statePath, []byte("I'm a file, not a folder"), 0o644); err != nil {
|
||||||
|
fmt.Printf("setup failed: %v", err)
|
||||||
|
os.Exit(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
NewManager(tmpDir)
|
||||||
|
os.Exit(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
tmpDir, err := os.MkdirTemp("", "state-crash-test-*")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed to create temp dir: %v", err)
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(tmpDir)
|
||||||
|
|
||||||
|
cmd := exec.Command(os.Args[0], "-test.run=TestNewManager_MkdirFailureCrashes")
|
||||||
|
cmd.Env = append(os.Environ(), "BE_CRASHER=1", "CRASH_DIR="+tmpDir)
|
||||||
|
|
||||||
|
err = cmd.Run()
|
||||||
|
|
||||||
|
var e *exec.ExitError
|
||||||
|
if errors.As(err, &e) && !e.Success() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Fatalf("The process ended without error, a crash was expected via os.Exit(1). Err: %v", err)
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue