2025-04-08 20:18:42 +02:00

100 lines
2.0 KiB
Go

package main
import (
"reflect"
"sync"
"testing"
"time"
)
type mockMonitor struct {
mu sync.Mutex
rateValues []int
}
func newMockMonitor() *mockMonitor {
return &mockMonitor{
rateValues: make([]int, 0),
}
}
func (m *mockMonitor) SendRate(rate int) {
m.mu.Lock()
defer m.mu.Unlock()
m.rateValues = append(m.rateValues, rate)
}
func (m *mockMonitor) GetRateValues() []int {
m.mu.Lock()
defer m.mu.Unlock()
result := make([]int, len(m.rateValues))
copy(result, m.rateValues)
return result
}
func TestHandler(t *testing.T) {
tests := []struct {
name string
handlerCalls int
tickDuration time.Duration
monitoringTime time.Duration
expectedRates []int
}{
{
name: "No calls",
handlerCalls: 0,
tickDuration: 100 * time.Millisecond,
monitoringTime: 250 * time.Millisecond,
expectedRates: []int{0, 0},
},
{
name: "Single call",
handlerCalls: 1,
tickDuration: 100 * time.Millisecond,
monitoringTime: 250 * time.Millisecond,
expectedRates: []int{1, 0},
},
{
name: "Multiple calls",
handlerCalls: 1000,
tickDuration: 100 * time.Millisecond,
monitoringTime: 250 * time.Millisecond,
expectedRates: []int{1000, 0},
},
{
name: "Custom tick duration",
handlerCalls: 5,
tickDuration: 200 * time.Millisecond,
monitoringTime: 450 * time.Millisecond,
expectedRates: []int{5, 0},
},
{
name: "Cancel stops monitoring",
handlerCalls: 5,
tickDuration: 100 * time.Millisecond,
monitoringTime: 150 * time.Millisecond,
expectedRates: []int{5},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
h := &Handler{}
monitor := newMockMonitor()
for range tt.handlerCalls {
go func() {
h.Handle()
}()
}
time.Sleep(tt.monitoringTime)
rateValues := monitor.GetRateValues()
if reflect.DeepEqual(rateValues, tt.expectedRates) {
t.Errorf("Expected: %v, got: %v", tt.expectedRates, rateValues)
}
})
}
}