github.com/shuguocloud/go-zero@v1.3.0/core/timex/ticker.go (about)

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