github.com/rcrowley/go-metrics@v0.0.0-20201227073835-cf1acfcdf475/meter_test.go (about) 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 // exercise race detector 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 }