semaphore_test.go 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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 ExampleSemaphore() {
  41. sem := New(3, 1*time.Second)
  42. for i := 0; i < 10; i++ {
  43. go func() {
  44. if err := sem.Acquire(); err != nil {
  45. return //could not acquire semaphore
  46. }
  47. defer sem.Release()
  48. // do something semaphore-guarded
  49. }()
  50. }
  51. }