mirror of
https://github.com/blindlobstar/go-interview-problems
synced 2025-04-22 17:55:16 +00:00
100 lines
2.0 KiB
Go
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)
|
|
}
|
|
})
|
|
}
|
|
}
|