Some checks are pending
Security Checks / security (push) Waiting to run
统一 frontend、backend、test、test-log 和 out 目录,更新构建、部署及测试入口;纳入配置管理兼容与首次安全引导修复;排除本机配置、密钥和测试产物。
58 lines
1.2 KiB
Go
58 lines
1.2 KiB
Go
package atomicfile
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"runtime"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestWriteReplacesFileAtomically(t *testing.T) {
|
|
directory := t.TempDir()
|
|
path := filepath.Join(directory, "config.json")
|
|
if err := os.WriteFile(path, []byte("old"), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := Write(path, []byte("new"), 0600); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
data, err := os.ReadFile(path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if string(data) != "new" {
|
|
t.Fatalf("atomic file content = %q, want new", data)
|
|
}
|
|
info, err := os.Stat(path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if runtime.GOOS != "windows" && info.Mode().Perm() != 0600 {
|
|
t.Fatalf("atomic file permissions = %o, want 600", info.Mode().Perm())
|
|
}
|
|
entries, err := os.ReadDir(directory)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
for _, entry := range entries {
|
|
if strings.HasPrefix(entry.Name(), ".config.json-") {
|
|
t.Fatalf("temporary file was left behind: %s", entry.Name())
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestWriteCreatesEmptyFile(t *testing.T) {
|
|
path := filepath.Join(t.TempDir(), "empty")
|
|
if err := Write(path, nil, 0600); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
info, err := os.Stat(path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if info.Size() != 0 {
|
|
t.Fatalf("empty atomic file size = %d, want 0", info.Size())
|
|
}
|
|
}
|