meter_test.go 2.0 KB

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