feat(fsx): add atomic and durable file writes
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package fsx
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestWriteFileAtomicCreatesAndReplaces(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
path := filepath.Join(dir, "nested", "file.json")
|
||||
|
||||
if err := WriteFileAtomic(path, []byte("first"), 0o600); err != nil {
|
||||
t.Fatalf("WriteFileAtomic: %v", err)
|
||||
}
|
||||
got, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
t.Fatalf("ReadFile: %v", err)
|
||||
}
|
||||
if string(got) != "first" {
|
||||
t.Fatalf("content = %q, want %q", got, "first")
|
||||
}
|
||||
info, err := os.Stat(path)
|
||||
if err != nil {
|
||||
t.Fatalf("Stat: %v", err)
|
||||
}
|
||||
if info.Mode().Perm() != 0o600 {
|
||||
t.Fatalf("perm = %o, want 600", info.Mode().Perm())
|
||||
}
|
||||
|
||||
if err := WriteFileAtomic(path, []byte("second"), 0o600); err != nil {
|
||||
t.Fatalf("second WriteFileAtomic: %v", err)
|
||||
}
|
||||
got, _ = os.ReadFile(path)
|
||||
if string(got) != "second" {
|
||||
t.Fatalf("content = %q, want %q", got, "second")
|
||||
}
|
||||
}
|
||||
|
||||
func TestWriteFileAtomicLeavesNoTempFiles(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
path := filepath.Join(dir, "state.json")
|
||||
if err := WriteFileAtomic(path, []byte("x"), 0o644); err != nil {
|
||||
t.Fatalf("WriteFileAtomic: %v", err)
|
||||
}
|
||||
entries, err := os.ReadDir(dir)
|
||||
if err != nil {
|
||||
t.Fatalf("ReadDir: %v", err)
|
||||
}
|
||||
if len(entries) != 1 || entries[0].Name() != "state.json" {
|
||||
t.Fatalf("unexpected directory contents: %v", entries)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user