converge/pkg/support/throttling/async_throttler_test.go
Erik Brakkee 52160a368c more generalization of how time is handled in the tests.
Asynchronous variant that is easier to use and multi-thread safe.
2024-08-16 21:08:44 +02:00

71 lines
1.6 KiB
Go

package throttling
import (
"github.com/stretchr/testify/assert"
"testing"
"time"
)
func Test_AsyncDeliverOneValue(t *testing.T) {
value := 0
pollInterval := 10 * time.Millisecond
throttler := NewAsyncThrottler[int](func(v *int) {
value = *v
}, time.Second, pollInterval)
defer throttler.Stop()
t0 := time.Now()
v := 1
currentTime.now = t0
throttler.Notify(&v)
time.Sleep(2 * pollInterval)
assert.Equal(t, v, value)
// subsequent ping will not lead to a notification
value = 0
time.Sleep(2 * pollInterval)
assert.Equal(t, 0, value)
}
func Test_AsyncTwoNotificationsInSHortSucessionSecondOneIsDeliverdWithDelay(t *testing.T) {
value := 0
delayMs := 1000
pollInterval := 10 * time.Millisecond
throttler := NewAsyncThrottler[int](func(v *int) {
value = *v
}, time.Second, pollInterval)
defer throttler.Stop()
t0 := time.Now()
v1 := 1
// v2 will not be delivered, the last value in the time interval will be
v2 := 2
v3 := 3
currentTime.now = t0
throttler.Notify(&v1)
time.Sleep(2 * pollInterval)
assert.Equal(t, v1, value)
throttler.Notify(&v2)
throttler.Notify(&v3)
time.Sleep(2 * pollInterval)
assert.Equal(t, v1, value)
currentTime.now = t0.Add(time.Duration(delayMs-1) * time.Millisecond)
time.Sleep(2 * pollInterval)
assert.Equal(t, v1, value)
currentTime.now = t0.Add(time.Duration(delayMs) * time.Millisecond)
time.Sleep(2 * pollInterval)
assert.Equal(t, v3, value)
// another ping won't deliver the same value again.
value = 0
currentTime.now = t0.Add(time.Duration(delayMs) * time.Millisecond)
time.Sleep(2 * pollInterval)
assert.Equal(t, 0, value)
}