diff --git a/tools/utils/filelock_test.go b/tools/utils/filelock_test.go new file mode 100644 index 000000000..0cb352955 --- /dev/null +++ b/tools/utils/filelock_test.go @@ -0,0 +1,43 @@ +// License: GPLv3 Copyright: 2024, Kovid Goyal, + +package utils + +import ( + "fmt" + "os" + "os/exec" + "testing" +) + +var _ = fmt.Print + +func TestFileLock(t *testing.T) { + tdir := t.TempDir() + + file_descriptor, err := os.Open(tdir) + if err != nil { + t.Fatalf("Initial open of %s failed with error: %s", tdir, err) + } + if err = LockFileExclusive(file_descriptor); err != nil { + file_descriptor.Close() + t.Fatalf("Initial lock of %s failed with error: %s", tdir, err) + } + defer func() { + _ = UnlockFile(file_descriptor) + file_descriptor.Close() + }() + cmd := exec.Command(KittyExe(), "+runpy", ` +import sys, os, fcntl +fd = os.open(sys.argv[-1], os.O_RDONLY) +try: + fcntl.flock(fd, fcntl.LOCK_EX | fcntl.LOCK_NB) +except BlockingIOError: + sys.exit(0) +else: + print("Lock unexpectedly succeeded", flush=True) + sys.exit(1) +`, tdir) + if output, err := cmd.CombinedOutput(); err != nil { + t.Fatalf("Lock test process failed with error: %s and output:\n%s", err, string(output)) + } +}