129 lines
2.9 KiB
Go
129 lines
2.9 KiB
Go
package ratecounter
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestAvgRateCounter(t *testing.T) {
|
|
interval := 500 * time.Millisecond
|
|
r := NewAvgRateCounter(interval)
|
|
|
|
check := func(expectedRate float64, expectedHits int64) {
|
|
rate, hits := r.Rate(), r.Hits()
|
|
if rate != expectedRate {
|
|
t.Error("Expected rate ", rate, " to equal ", expectedRate)
|
|
}
|
|
if hits != expectedHits {
|
|
t.Error("Expected hits ", hits, " to equal ", expectedHits)
|
|
}
|
|
}
|
|
|
|
check(0, 0)
|
|
r.Incr(1) // counter = 1, hits = 1
|
|
check(1.0, 1)
|
|
r.Incr(3) // counter = 4, hits = 2
|
|
check(2.0, 2)
|
|
time.Sleep(2 * interval)
|
|
check(0, 0)
|
|
}
|
|
|
|
func TestAvgRateCounterAdvanced(t *testing.T) {
|
|
interval := 500 * time.Millisecond
|
|
almost := 450 * time.Millisecond
|
|
r := NewAvgRateCounter(interval)
|
|
|
|
check := func(expectedRate float64, expectedHits int64) {
|
|
rate, hits := r.Rate(), r.Hits()
|
|
if rate != expectedRate {
|
|
t.Error("Expected rate ", rate, " to equal ", expectedRate)
|
|
}
|
|
if hits != expectedHits {
|
|
t.Error("Expected hits ", hits, " to equal ", expectedHits)
|
|
}
|
|
}
|
|
|
|
check(0, 0)
|
|
r.Incr(1) // counter = 1, hits = 1
|
|
check(1.0, 1)
|
|
time.Sleep(interval - almost)
|
|
r.Incr(3) // counter = 4, hits = 2
|
|
check(2.0, 2)
|
|
time.Sleep(almost)
|
|
check(3.0, 1) // counter = 3, hits = 1
|
|
time.Sleep(2 * interval)
|
|
check(0, 0)
|
|
}
|
|
|
|
func TestAvgRateCounterMinResolution(t *testing.T) {
|
|
defer func() {
|
|
if r := recover(); r == nil {
|
|
t.Errorf("Resolution < 1 did not panic")
|
|
}
|
|
}()
|
|
|
|
NewAvgRateCounter(500 * time.Millisecond).WithResolution(0)
|
|
}
|
|
|
|
func TestAvgRateCounterNoResolution(t *testing.T) {
|
|
interval := 500 * time.Millisecond
|
|
almost := 450 * time.Millisecond
|
|
r := NewAvgRateCounter(interval).WithResolution(1)
|
|
|
|
check := func(expectedRate float64, expectedHits int64) {
|
|
rate, hits := r.Rate(), r.Hits()
|
|
if rate != expectedRate {
|
|
t.Error("Expected rate ", rate, " to equal ", expectedRate)
|
|
}
|
|
if hits != expectedHits {
|
|
t.Error("Expected hits ", hits, " to equal ", expectedHits)
|
|
}
|
|
}
|
|
|
|
check(0, 0)
|
|
r.Incr(1) // counter = 1, hits = 1
|
|
check(1.0, 1)
|
|
time.Sleep(interval - almost)
|
|
r.Incr(3) // counter = 4, hits = 2
|
|
check(2.0, 2)
|
|
time.Sleep(almost)
|
|
check(0, 0) // counter = 0, hits = 0
|
|
time.Sleep(2 * interval)
|
|
check(0, 0)
|
|
}
|
|
|
|
func TestAvgRateCounter_String(t *testing.T) {
|
|
r := NewAvgRateCounter(1 * time.Second)
|
|
if r.String() != "0.00000e+00" {
|
|
t.Error("Expected ", r.String(), " to equal ", "0.00000e+00")
|
|
}
|
|
|
|
r.Incr(1)
|
|
if r.String() != "1.00000e+00" {
|
|
t.Error("Expected ", r.String(), " to equal ", "1.00000e+00")
|
|
}
|
|
}
|
|
|
|
func TestAvgRateCounter_Incr_ReturnsImmediately(t *testing.T) {
|
|
interval := 1 * time.Second
|
|
r := NewAvgRateCounter(interval)
|
|
|
|
start := time.Now()
|
|
r.Incr(-1)
|
|
duration := time.Since(start)
|
|
|
|
if duration >= 1*time.Second {
|
|
t.Error("incr took", duration, "to return")
|
|
}
|
|
}
|
|
|
|
func BenchmarkAvgRateCounter(b *testing.B) {
|
|
interval := 0 * time.Millisecond
|
|
r := NewAvgRateCounter(interval)
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
r.Incr(1)
|
|
r.Rate()
|
|
}
|
|
}
|