//go:build darwin package safeio import ( "errors" "os" "path/filepath" "testing" "golang.org/x/sys/unix" ) func TestWriteCanonicalExclusiveClassifiesUnlinkFailureAsIndeterminate(t *testing.T) { root := t.TempDir() stage := filepath.Join(root, "stage") if err := os.WriteFile(stage, []byte("candidate"), 0o600); err != nil { t.Fatal(err) } dir, err := unix.Open(root, unix.O_RDONLY|unix.O_DIRECTORY, 0) if err != nil { t.Fatal(err) } defer unix.Close(dir) fd, err := unix.Openat(dir, "stage", unix.O_RDWR, 0) if err != nil { t.Fatal(err) } file := os.NewFile(uintptr(fd), "stage") if file == nil { t.Fatal("os.NewFile returned nil") } defer file.Close() var staged unix.Stat_t if err := unix.Fstat(fd, &staged); err != nil { t.Fatal(err) } oldUnlink := darwinUnlinkat t.Cleanup(func() { darwinUnlinkat = oldUnlink }) darwinUnlinkat = func(int, string, int) error { return errors.New("injected unlink failure") } if err := cleanupDarwinStage(dir, "stage", &staged, file.Close); !errors.Is(err, ErrIndeterminateFile) { t.Fatalf("unlink failure = %v, want ErrIndeterminateFile", err) } }