-
Notifications
You must be signed in to change notification settings - Fork 10
/
onlyonce_test.go
100 lines (95 loc) · 2.53 KB
/
onlyonce_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package dynsampler
import (
"fmt"
"testing"
"time"
"github.com/stretchr/testify/assert"
)
func TestOnlyOnceUpdateMaps(t *testing.T) {
o := &OnlyOnce{
ClearFrequencyDuration: 30 * time.Second,
}
tsts := []struct {
inputSeen map[string]bool
expectedSeen map[string]bool
}{
{
map[string]bool{
"one": true,
"two": true,
"three": true,
},
map[string]bool{},
},
{
map[string]bool{},
map[string]bool{},
},
}
for i, tst := range tsts {
o.seen = tst.inputSeen
o.updateMaps()
assert.Equal(t, o.seen, tst.expectedSeen, fmt.Sprintf("test %d failed", i))
}
}
func TestOnlyOnceGetSampleRate(t *testing.T) {
o := &OnlyOnce{}
o.seen = map[string]bool{
"one": true,
"two": true,
}
tsts := []struct {
inputKey string
expectedSampleRate int
expectedCurrentCountForKeyBefore bool
expectedCurrentCountForKeyAfter bool
}{
{"one", 1000000000, true, true},
{"two", 1000000000, true, true},
{"two", 1000000000, true, true},
{"three", 1, false, true}, // key missing from seen
{"three", 1000000000, true, true},
{"four", 1, false, true}, // key missing from seen
{"four", 1000000000, true, true},
}
for _, tst := range tsts {
assert.Equal(t, o.seen[tst.inputKey], tst.expectedCurrentCountForKeyBefore)
rate := o.GetSampleRate(tst.inputKey)
assert.Equal(t, rate, tst.expectedSampleRate)
assert.Equal(t, o.seen[tst.inputKey], tst.expectedCurrentCountForKeyAfter)
}
}
func TestOnlyOnce_Start(t *testing.T) {
tests := []struct {
name string
ClearFrequencySec int
ClearFrequencyDuration time.Duration
wantDuration time.Duration
wantErr bool
}{
{"sec only", 2, 0, 2 * time.Second, false},
{"dur only", 0, 1003 * time.Millisecond, 1003 * time.Millisecond, false},
{"default", 0, 0, 30 * time.Second, false},
{"both", 2, 2 * time.Second, 0, true},
{"negative sec", -1, 0, -1 * time.Second, false},
{"negative dur", 0, -1 * time.Second, -1 * time.Second, false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
a := &OnlyOnce{
ClearFrequencySec: tt.ClearFrequencySec,
ClearFrequencyDuration: tt.ClearFrequencyDuration,
}
err := a.Start()
if (err != nil) != tt.wantErr {
t.Errorf("OnlyOnce error = %v, wantErr %v", err, tt.wantErr)
}
if err == nil {
defer a.Stop()
if tt.wantDuration != a.ClearFrequencyDuration {
t.Errorf("OnlyOnce duration mismatch = want %v, got %v", tt.wantDuration, a.ClearFrequencyDuration)
}
}
})
}
}