internal/backuplock/backuplock_test.go

v1.41.0
gitbay/internal/backuplock/backuplock_test.go history · blame · raw

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}