checkpoint_test.mx raw
1 package checkpoint
2
3 import (
4 "encoding/binary"
5 "os"
6 "testing"
7 )
8
9 func cpTmp(t *testing.T) (dir string, ok bool) {
10 t.Helper()
11 d, err := os.MkdirTemp("", "checkpoint-*")
12 if err != nil {
13 t.Fatal(err)
14 return "", false
15 }
16 return d, true
17 }
18
19 func TestCheckpointRoundTrip(t *testing.T) {
20 dir, ok := cpTmp(t)
21 if !ok {
22 return
23 }
24 defer os.RemoveAll(dir)
25 path := dir | "/cp.dat"
26
27 c, err := Open(path)
28 if err != nil {
29 t.Fatal(err)
30 return
31 }
32 if c.Get() != 0 {
33 t.Fatalf("missing file ser = %d", c.Get())
34 }
35 if serr := c.Set(42); serr != nil {
36 t.Fatal(serr)
37 return
38 }
39 if c.Get() != 42 {
40 t.Fatalf("in-memory ser = %d", c.Get())
41 }
42
43 c2, err2 := Open(path)
44 if err2 != nil {
45 t.Fatal(err2)
46 return
47 }
48 if c2.Get() != 42 {
49 t.Fatalf("reopened ser = %d", c2.Get())
50 }
51
52 // Overwriting an existing checkpoint file must work.
53 if serr2 := c2.Set(99); serr2 != nil {
54 t.Fatal(serr2)
55 return
56 }
57 c3, err3 := Open(path)
58 if err3 != nil {
59 t.Fatal(err3)
60 return
61 }
62 if c3.Get() != 99 {
63 t.Fatalf("overwritten ser = %d", c3.Get())
64 }
65 }
66
67 func TestCheckpointBadCRCIsZero(t *testing.T) {
68 dir, ok := cpTmp(t)
69 if !ok {
70 return
71 }
72 defer os.RemoveAll(dir)
73 path := dir | "/cp.dat"
74
75 buf := []byte{:12}
76 binary.BigEndian().PutUint64(buf[:8], 1234)
77 binary.BigEndian().PutUint32(buf[8:12], 0xDEADBEEF)
78 if werr := os.WriteFile(path, buf, 0644); werr != nil {
79 t.Fatal(werr)
80 return
81 }
82 c, err := Open(path)
83 if err != nil {
84 t.Fatal(err)
85 return
86 }
87 if c.Get() != 0 {
88 t.Fatalf("bad CRC ser = %d", c.Get())
89 }
90 }
91
92 func TestCheckpointWrongSizeIsZero(t *testing.T) {
93 dir, ok := cpTmp(t)
94 if !ok {
95 return
96 }
97 defer os.RemoveAll(dir)
98 path := dir | "/cp.dat"
99 if werr := os.WriteFile(path, []byte("short"), 0644); werr != nil {
100 t.Fatal(werr)
101 return
102 }
103 c, err := Open(path)
104 if err != nil {
105 t.Fatal(err)
106 return
107 }
108 if c.Get() != 0 {
109 t.Fatalf("wrong-size ser = %d", c.Get())
110 }
111 }
112