- package timer
-
- import (
- "testing"
- "time"
-
- // make govet noshadow happy...
-
- asrt "github.com/stretchr/testify/assert"
-
- tmsync "github.com/tendermint/tendermint/internal/libs/sync"
- )
-
- type thCounter struct {
- input chan struct{}
- mtx tmsync.Mutex
- count int
- }
-
- func (c *thCounter) Increment() {
- c.mtx.Lock()
- c.count++
- c.mtx.Unlock()
- }
-
- func (c *thCounter) Count() int {
- c.mtx.Lock()
- val := c.count
- c.mtx.Unlock()
- return val
- }
-
- // Read should run in a go-routine and
- // updates count by one every time a packet comes in
- func (c *thCounter) Read() {
- for range c.input {
- c.Increment()
- }
- }
-
- func TestThrottle(test *testing.T) {
- assert := asrt.New(test)
-
- ms := 50
- delay := time.Duration(ms) * time.Millisecond
- longwait := time.Duration(2) * delay
- t := NewThrottleTimer("foo", delay)
-
- // start at 0
- c := &thCounter{input: t.Ch}
- assert.Equal(0, c.Count())
- go c.Read()
-
- // waiting does nothing
- time.Sleep(longwait)
- assert.Equal(0, c.Count())
-
- // send one event adds one
- t.Set()
- time.Sleep(longwait)
- assert.Equal(1, c.Count())
-
- // send a burst adds one
- for i := 0; i < 5; i++ {
- t.Set()
- }
- time.Sleep(longwait)
- assert.Equal(2, c.Count())
-
- // send 12, over 2 delay sections, adds 3 or more. It
- // is possible for more to be added if the overhead
- // in executing the loop is large
- short := time.Duration(ms/5) * time.Millisecond
- for i := 0; i < 13; i++ {
- t.Set()
- time.Sleep(short)
- }
- time.Sleep(longwait)
- assert.LessOrEqual(5, c.Count())
-
- close(t.Ch)
- }
|