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  }