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) }