ticker.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package timex
  2. import (
  3. "errors"
  4. "time"
  5. "github.com/zeromicro/go-zero/core/lang"
  6. )
  7. // errTimeout indicates a timeout.
  8. var errTimeout = errors.New("timeout")
  9. type (
  10. // Ticker interface wraps the Chan and Stop methods.
  11. Ticker interface {
  12. Chan() <-chan time.Time
  13. Stop()
  14. }
  15. // FakeTicker interface is used for unit testing.
  16. FakeTicker interface {
  17. Ticker
  18. Done()
  19. Tick()
  20. Wait(d time.Duration) error
  21. }
  22. fakeTicker struct {
  23. c chan time.Time
  24. done chan lang.PlaceholderType
  25. }
  26. realTicker struct {
  27. *time.Ticker
  28. }
  29. )
  30. // NewTicker returns a Ticker.
  31. func NewTicker(d time.Duration) Ticker {
  32. return &realTicker{
  33. Ticker: time.NewTicker(d),
  34. }
  35. }
  36. func (rt *realTicker) Chan() <-chan time.Time {
  37. return rt.C
  38. }
  39. // NewFakeTicker returns a FakeTicker.
  40. func NewFakeTicker() FakeTicker {
  41. return &fakeTicker{
  42. c: make(chan time.Time, 1),
  43. done: make(chan lang.PlaceholderType, 1),
  44. }
  45. }
  46. func (ft *fakeTicker) Chan() <-chan time.Time {
  47. return ft.c
  48. }
  49. func (ft *fakeTicker) Done() {
  50. ft.done <- lang.Placeholder
  51. }
  52. func (ft *fakeTicker) Stop() {
  53. close(ft.c)
  54. }
  55. func (ft *fakeTicker) Tick() {
  56. ft.c <- time.Now()
  57. }
  58. func (ft *fakeTicker) Wait(d time.Duration) error {
  59. select {
  60. case <-time.After(d):
  61. return errTimeout
  62. case <-ft.done:
  63. return nil
  64. }
  65. }