lock_test.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package fileutil
  2. import (
  3. "io/ioutil"
  4. "os"
  5. "testing"
  6. "time"
  7. )
  8. func TestLockAndUnlock(t *testing.T) {
  9. f, err := ioutil.TempFile("", "lock")
  10. if err != nil {
  11. t.Fatal(err)
  12. }
  13. f.Close()
  14. defer func() {
  15. err := os.Remove(f.Name())
  16. if err != nil {
  17. t.Fatal(err)
  18. }
  19. }()
  20. // lock the file
  21. l, err := NewLock(f.Name())
  22. if err != nil {
  23. t.Fatal(err)
  24. }
  25. defer l.Destroy()
  26. err = l.Lock()
  27. if err != nil {
  28. t.Fatal(err)
  29. }
  30. // try lock a locked file
  31. dupl, err := NewLock(f.Name())
  32. if err != nil {
  33. t.Fatal(err)
  34. }
  35. err = dupl.TryLock()
  36. if err != ErrLocked {
  37. t.Errorf("err = %v, want %v", err, ErrLocked)
  38. }
  39. // unlock the file
  40. err = l.Unlock()
  41. if err != nil {
  42. t.Fatal(err)
  43. }
  44. // try lock the unlocked file
  45. err = dupl.TryLock()
  46. if err != nil {
  47. t.Errorf("err = %v, want %v", err, nil)
  48. }
  49. defer dupl.Destroy()
  50. // blocking on locked file
  51. locked := make(chan struct{}, 1)
  52. go func() {
  53. l.Lock()
  54. locked <- struct{}{}
  55. }()
  56. select {
  57. case <-locked:
  58. t.Error("unexpected unblocking")
  59. case <-time.After(10 * time.Millisecond):
  60. }
  61. // unlock
  62. err = dupl.Unlock()
  63. if err != nil {
  64. t.Fatal(err)
  65. }
  66. // the previously blocked routine should be unblocked
  67. select {
  68. case <-locked:
  69. case <-time.After(10 * time.Millisecond):
  70. t.Error("unexpected blocking")
  71. }
  72. }