72 lines
1.7 KiB
Go
72 lines
1.7 KiB
Go
package app
|
|
|
|
import (
|
|
"encoding/json"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"bee/audit/internal/schema"
|
|
)
|
|
|
|
func TestAtomicWriteFileReplacesTargetWithoutLeavingTmp(t *testing.T) {
|
|
path := filepath.Join(t.TempDir(), "bee-audit.json")
|
|
if err := os.WriteFile(path, []byte("old\n"), 0644); err != nil {
|
|
t.Fatalf("seed file: %v", err)
|
|
}
|
|
|
|
if err := atomicWriteFile(path, []byte("new\n"), 0644); err != nil {
|
|
t.Fatalf("atomicWriteFile: %v", err)
|
|
}
|
|
|
|
raw, err := os.ReadFile(path)
|
|
if err != nil {
|
|
t.Fatalf("read final: %v", err)
|
|
}
|
|
if string(raw) != "new\n" {
|
|
t.Fatalf("final content=%q want %q", string(raw), "new\n")
|
|
}
|
|
if _, err := os.Stat(path + ".tmp"); !os.IsNotExist(err) {
|
|
t.Fatalf("tmp file should be absent after success, err=%v", err)
|
|
}
|
|
}
|
|
|
|
func TestRunRuntimePreflightWritesAtomically(t *testing.T) {
|
|
path := filepath.Join(t.TempDir(), "runtime-health.json")
|
|
a := &App{
|
|
runtime: fakeRuntime{
|
|
collectFn: func(exportDir string) (schema.RuntimeHealth, error) {
|
|
return schema.RuntimeHealth{
|
|
Status: "OK",
|
|
ExportDir: exportDir,
|
|
DriverReady: true,
|
|
CUDAReady: true,
|
|
}, nil
|
|
},
|
|
},
|
|
}
|
|
|
|
got, err := a.RunRuntimePreflight("file:" + path)
|
|
if err != nil {
|
|
t.Fatalf("RunRuntimePreflight: %v", err)
|
|
}
|
|
if got != path {
|
|
t.Fatalf("path=%q want %q", got, path)
|
|
}
|
|
if _, err := os.Stat(path + ".tmp"); !os.IsNotExist(err) {
|
|
t.Fatalf("tmp file should be absent after success, err=%v", err)
|
|
}
|
|
|
|
raw, err := os.ReadFile(path)
|
|
if err != nil {
|
|
t.Fatalf("read runtime file: %v", err)
|
|
}
|
|
var health schema.RuntimeHealth
|
|
if err := json.Unmarshal(raw, &health); err != nil {
|
|
t.Fatalf("json unmarshal: %v", err)
|
|
}
|
|
if health.Status != "OK" {
|
|
t.Fatalf("status=%q want OK", health.Status)
|
|
}
|
|
}
|