1
0

timeoutlimit_test.go 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package syncx
  2. import (
  3. "sync"
  4. "testing"
  5. "time"
  6. "github.com/stretchr/testify/assert"
  7. )
  8. func TestTimeoutLimit(t *testing.T) {
  9. tests := []struct {
  10. name string
  11. interval time.Duration
  12. }{
  13. {
  14. name: "no wait",
  15. },
  16. {
  17. name: "wait",
  18. interval: time.Millisecond * 100,
  19. },
  20. }
  21. for _, test := range tests {
  22. test := test
  23. t.Run(test.name, func(t *testing.T) {
  24. limit := NewTimeoutLimit(2)
  25. assert.Nil(t, limit.Borrow(time.Millisecond*200))
  26. assert.Nil(t, limit.Borrow(time.Millisecond*200))
  27. var wait1, wait2, wait3 sync.WaitGroup
  28. wait1.Add(1)
  29. wait2.Add(1)
  30. wait3.Add(1)
  31. go func() {
  32. wait1.Wait()
  33. wait2.Done()
  34. time.Sleep(test.interval)
  35. assert.Nil(t, limit.Return())
  36. wait3.Done()
  37. }()
  38. wait1.Done()
  39. wait2.Wait()
  40. assert.Nil(t, limit.Borrow(time.Second))
  41. wait3.Wait()
  42. assert.Equal(t, ErrTimeout, limit.Borrow(time.Millisecond*100))
  43. assert.Nil(t, limit.Return())
  44. assert.Nil(t, limit.Return())
  45. assert.Equal(t, ErrLimitReturn, limit.Return())
  46. })
  47. }
  48. }