semaphore_test.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package semaphore
  2. import (
  3. "testing"
  4. "time"
  5. )
  6. func TestSemaphoreAcquireRelease(t *testing.T) {
  7. sem := New(3, 1*time.Second)
  8. for i := 0; i < 10; i++ {
  9. if err := sem.Acquire(); err != nil {
  10. t.Error(err)
  11. }
  12. if err := sem.Acquire(); err != nil {
  13. t.Error(err)
  14. }
  15. if err := sem.Acquire(); err != nil {
  16. t.Error(err)
  17. }
  18. sem.Release()
  19. sem.Release()
  20. sem.Release()
  21. }
  22. }
  23. func TestSemaphoreBlockTimeout(t *testing.T) {
  24. sem := New(1, 200*time.Millisecond)
  25. if err := sem.Acquire(); err != nil {
  26. t.Error(err)
  27. }
  28. start := time.Now()
  29. if err := sem.Acquire(); err != ErrNoTickets {
  30. t.Error(err)
  31. }
  32. if start.Add(200 * time.Millisecond).After(time.Now()) {
  33. t.Error("semaphore did not wait long enough")
  34. }
  35. sem.Release()
  36. if err := sem.Acquire(); err != nil {
  37. t.Error(err)
  38. }
  39. }
  40. func TestSemaphoreEmpty(t *testing.T) {
  41. sem := New(2, 200*time.Millisecond)
  42. if !sem.IsEmpty() {
  43. t.Error("semaphore should be empty")
  44. }
  45. sem.Acquire()
  46. if sem.IsEmpty() {
  47. t.Error("semaphore should not be empty")
  48. }
  49. sem.Release()
  50. if !sem.IsEmpty() {
  51. t.Error("semaphore should be empty")
  52. }
  53. }
  54. func ExampleSemaphore() {
  55. sem := New(3, 1*time.Second)
  56. for i := 0; i < 10; i++ {
  57. go func() {
  58. if err := sem.Acquire(); err != nil {
  59. return //could not acquire semaphore
  60. }
  61. defer sem.Release()
  62. // do something semaphore-guarded
  63. }()
  64. }
  65. }