1// SPDX-License-Identifier: MIT
2
3package fsys
4
5import (
6 "errors"
7 "io"
8 "os"
9 "path/filepath"
10 "testing"
11)
12
13func TestOS(t *testing.T) {
14 fx := OS()
15 dir := filepath.Join(t.TempDir(), "a", "b")
16 if err := fx.MkdirAll(dir, 0o700); err != nil {
17 t.Fatal(err)
18 }
19 if err := fx.SyncDir(dir); err != nil {
20 t.Fatal(err)
21 }
22 name := filepath.Join(dir, "f.tmp")
23 f, err := fx.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0o600)
24 if err != nil {
25 t.Fatal(err)
26 }
27 for _, s := range []string{"hello ", "world"} {
28 if _, err := f.Write([]byte(s)); err != nil {
29 t.Fatal(err)
30 }
31 }
32 if err := f.Sync(); err != nil {
33 t.Fatal(err)
34 }
35 if err := f.SyncAll(); err != nil {
36 t.Fatal(err)
37 }
38 if err := f.Truncate(8); err != nil {
39 t.Fatal(err)
40 }
41 if _, err := f.Write([]byte("!")); err != nil { // appends after truncation
42 t.Fatal(err)
43 }
44 if sz, err := f.Size(); err != nil || sz != 9 {
45 t.Fatalf("Size = %d, %v", sz, err)
46 }
47 buf := make([]byte, 9)
48 if n, err := f.ReadAt(buf, 0); n != 9 || (err != nil && !errors.Is(err, io.EOF)) || string(buf) != "hello wo!" {
49 t.Fatalf("ReadAt = %d %v %q", n, err, buf)
50 }
51 if err := f.Close(); err != nil {
52 t.Fatal(err)
53 }
54
55 final := filepath.Join(dir, "f")
56 if err := fx.Rename(name, final); err != nil {
57 t.Fatal(err)
58 }
59 names, err := fx.ReadDir(dir)
60 if err != nil || len(names) != 1 || names[0] != "f" {
61 t.Fatalf("ReadDir = %v, %v", names, err)
62 }
63 if err := fx.Remove(final); err != nil {
64 t.Fatal(err)
65 }
66}
67
68func TestOSLock(t *testing.T) {
69 fx := OS()
70 path := filepath.Join(t.TempDir(), "LOCK")
71 l, err := fx.Lock(path)
72 if err != nil {
73 t.Fatal(err)
74 }
75 if _, err := fx.Lock(path); !errors.Is(err, ErrLocked) {
76 t.Fatalf("second lock: %v", err)
77 }
78 if err := l.Close(); err != nil {
79 t.Fatal(err)
80 }
81 l, err = fx.Lock(path)
82 if err != nil {
83 t.Fatalf("lock after release: %v", err)
84 }
85 _ = l.Close()
86}