internal/backuplock/backuplock_test.go
69 lines · 1274 bytes
1package backuplock
2
3import (
4 "errors"
5 "testing"
6 "time"
7)
8
9func TestTrySharedRefusedWhileHeld(t *testing.T) {
10 root := t.TempDir()
11 release, err := Hold(root)
12 if err != nil {
13 t.Fatal(err)
14 }
15 if _, err := TryShared(root); !errors.Is(err, ErrBusy) {
16 t.Fatalf("TryShared during a backup: %v", err)
17 }
18 release()
19 r, err := TryShared(root)
20 if err != nil {
21 t.Fatalf("TryShared after the backup: %v", err)
22 }
23 r()
24}
25
26func TestSharedHoldersCoexist(t *testing.T) {
27 root := t.TempDir()
28 a, err := TryShared(root)
29 if err != nil {
30 t.Fatal(err)
31 }
32 defer a()
33 b, err := TryShared(root)
34 if err != nil {
35 t.Fatalf("second shared holder: %v", err)
36 }
37 b()
38}
39
40// A backup waits for a delete already under way.
41func TestHoldWaitsForSharedHolder(t *testing.T) {
42 root := t.TempDir()
43 shared, err := TryShared(root)
44 if err != nil {
45 t.Fatal(err)
46 }
47 got := make(chan struct{})
48 go func() {
49 release, err := Hold(root)
50 if err != nil {
51 t.Error(err)
52 close(got)
53 return
54 }
55 close(got)
56 release()
57 }()
58 select {
59 case <-got:
60 t.Fatal("Hold returned while a shared holder was in")
61 case <-time.After(100 * time.Millisecond):
62 }
63 shared()
64 select {
65 case <-got:
66 case <-time.After(5 * time.Second):
67 t.Fatal("Hold never returned after the shared holder left")
68 }
69}