package security import ( "os" "path/filepath" "testing" ) func TestFlock_acquireAndRelease(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "test.lock") release, err := Flock(path) if err != nil { t.Fatalf("Flock: %v", err) } if _, statErr := os.Stat(path); statErr != nil { t.Fatalf("lock file not created: %v", statErr) } release() } func TestFlock_reentrantAfterRelease(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "test.lock") r1, err := Flock(path) if err != nil { t.Fatalf("first Flock: %v", err) } r1() r2, err := Flock(path) if err != nil { t.Fatalf("second Flock after release: %v", err) } r2() } func TestFlock_concurrentBlocks(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "test.lock") r1, err := Flock(path) if err != nil { t.Fatalf("first Flock: %v", err) } defer r1() done := make(chan error, 1) go func() { _, err := Flock(path) done <- err }() select { case <-done: t.Fatal("second Flock should block while first holds the lock") default: } }