diff options
Diffstat (limited to 'cmd/krino/history_test.go')
| -rw-r--r-- | cmd/krino/history_test.go | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/cmd/krino/history_test.go b/cmd/krino/history_test.go index ad7f6f6..6277e7b 100644 --- a/cmd/krino/history_test.go +++ b/cmd/krino/history_test.go @@ -5,7 +5,6 @@ package main import ( "bytes" "context" - "fmt" "os" "path/filepath" "strings" @@ -14,6 +13,7 @@ import ( "git.labunix.xyz/krino/internal/engine" "git.labunix.xyz/krino/internal/journal" + "git.labunix.xyz/krino/internal/lock" ) func TestLogListsRunsAndUndoReverses(t *testing.T) { @@ -101,12 +101,13 @@ func TestUndoFailsImmediatelyWithHeldLock(t *testing.T) { } held := filepath.Join(h, ".local", "state", "krino", "dl.lock") - if err := os.MkdirAll(filepath.Dir(held), 0o755); err != nil { - t.Fatal(err) - } - if err := os.WriteFile(held, []byte(fmt.Sprintf("pid %d\n", os.Getpid())), 0o644); err != nil { + // A real lock, not a file that looks like one: the lock is the + // kernel's, so holding it means holding a descriptor. + l, err := lock.Acquire(context.Background(), held, false) + if err != nil { t.Fatal(err) } + defer l.Release() code, out, errOut := runCLI(t, "undo", "-y") if code != 1 || !strings.Contains(errOut, "another krino") { @@ -560,3 +561,31 @@ func TestIgnoredGlobalFlagsAreRefused(t *testing.T) { t.Errorf("log -n 3 (its own count flag) was refused: %d %q", code, errOut) } } + +// TestWaitingForALockSaysSo: every run but -y waits for a held lock, which +// the spec intends (§3, §11) - but waiting silently is indistinguishable +// from a hang, and the wait has no timeout. A run about to wait must say +// what it is waiting for before it blocks. +func TestWaitingForALockSaysSo(t *testing.T) { + h := matchingFixture(t) + held := filepath.Join(h, ".local", "state", "krino", "dl.lock") + l, err := lock.Acquire(context.Background(), held, false) + if err != nil { + t.Fatal(err) + } + go func() { + time.Sleep(250 * time.Millisecond) + l.Release() + }() + + code, _, errOut := runCLI(t, "-n") + if code != 0 { + t.Fatalf("dry run after the lock was released: %d %s", code, errOut) + } + if !strings.Contains(errOut, "waiting") { + t.Errorf("a run that waited for the lock said nothing about it:\n%q", errOut) + } + if !strings.Contains(errOut, held) { + t.Errorf("the notice does not name the lock file %q:\n%q", held, errOut) + } +} |
