...
1 package metrics
2
3 import (
4 "math/rand"
5 "sync"
6 "testing"
7 "time"
8 )
9
10 func BenchmarkMeter(b *testing.B) {
11 m := NewMeter()
12 b.ResetTimer()
13 for i := 0; i < b.N; i++ {
14 m.Mark(1)
15 }
16 }
17
18 func BenchmarkMeterParallel(b *testing.B) {
19 m := NewMeter()
20 b.ResetTimer()
21 b.RunParallel(func(pb *testing.PB) {
22 for pb.Next() {
23 m.Mark(1)
24 }
25 })
26 }
27
28
29 func TestMeterConcurrency(t *testing.T) {
30 rand.Seed(time.Now().Unix())
31 ma := meterArbiter{
32 ticker: time.NewTicker(time.Millisecond),
33 meters: make(map[*StandardMeter]struct{}),
34 }
35 m := newStandardMeter()
36 ma.meters[m] = struct{}{}
37 go ma.tick()
38 wg := &sync.WaitGroup{}
39 reps := 100
40 for i := 0; i < reps; i++ {
41 wg.Add(1)
42 go func(m Meter, wg *sync.WaitGroup) {
43 m.Mark(1)
44 wg.Done()
45 }(m, wg)
46 wg.Add(1)
47 go func(m Meter, wg *sync.WaitGroup) {
48 m.Stop()
49 wg.Done()
50 }(m, wg)
51 }
52 wg.Wait()
53 }
54
55 func TestGetOrRegisterMeter(t *testing.T) {
56 r := NewRegistry()
57 NewRegisteredMeter("foo", r).Mark(47)
58 if m := GetOrRegisterMeter("foo", r); 47 != m.Count() {
59 t.Fatal(m)
60 }
61 }
62
63 func TestMeterDecay(t *testing.T) {
64 ma := meterArbiter{
65 ticker: time.NewTicker(time.Millisecond),
66 meters: make(map[*StandardMeter]struct{}),
67 }
68 m := newStandardMeter()
69 ma.meters[m] = struct{}{}
70 go ma.tick()
71 m.Mark(1)
72 rateMean := m.RateMean()
73 time.Sleep(100 * time.Millisecond)
74 if m.RateMean() >= rateMean {
75 t.Error("m.RateMean() didn't decrease")
76 }
77 }
78
79 func TestMeterNonzero(t *testing.T) {
80 m := NewMeter()
81 m.Mark(3)
82 if count := m.Count(); 3 != count {
83 t.Errorf("m.Count(): 3 != %v\n", count)
84 }
85 }
86
87 func TestMeterStop(t *testing.T) {
88 l := len(arbiter.meters)
89 m := NewMeter()
90 if len(arbiter.meters) != l+1 {
91 t.Errorf("arbiter.meters: %d != %d\n", l+1, len(arbiter.meters))
92 }
93 m.Stop()
94 if len(arbiter.meters) != l {
95 t.Errorf("arbiter.meters: %d != %d\n", l, len(arbiter.meters))
96 }
97 }
98
99 func TestMeterSnapshot(t *testing.T) {
100 m := NewMeter()
101 m.Mark(1)
102 if snapshot := m.Snapshot(); m.RateMean() != snapshot.RateMean() {
103 t.Fatal(snapshot)
104 }
105 }
106
107 func TestMeterZero(t *testing.T) {
108 m := NewMeter()
109 if count := m.Count(); 0 != count {
110 t.Errorf("m.Count(): 0 != %v\n", count)
111 }
112 }
113
View as plain text