github.com/rudderlabs/rudder-go-kit@v0.30.0/stats/metric/gauge_test.go (about) 1 package metric 2 3 import ( 4 "sync" 5 "testing" 6 "time" 7 ) 8 9 func TestGaugeAddSub(t *testing.T) { 10 gauge := NewGauge() 11 gauge.Inc() 12 if expected, got := 1.0, gauge.Value(); expected != got { 13 t.Errorf("Expected %f, got %f.", expected, got) 14 } 15 gauge.Add(42) 16 if expected, got := 43.0, gauge.Value(); expected != got { 17 t.Errorf("Expected %f, got %f.", expected, got) 18 } 19 20 gauge.Add(24.42) 21 if expected, got := 67.42, gauge.Value(); expected != got { 22 t.Errorf("Expected %f, got %f.", expected, got) 23 } 24 25 gauge.Dec() 26 if expected, got := 66.42, gauge.Value(); expected != got { 27 t.Errorf("Expected error %f, got %f.", expected, got) 28 } 29 30 gauge.Sub(24.42) 31 if expected, got := 42.0, gauge.Value(); expected != got { 32 t.Errorf("Expected error %f, got %f.", expected, got) 33 } 34 } 35 36 func TestGaugeSetGetTime(t *testing.T) { 37 gauge := NewGauge().(*gauge) 38 now := time.Now() 39 f := func() time.Time { return now } 40 gauge.now = f 41 42 gauge.SetToCurrentTime() 43 if expected, got := now.Round(1*time.Millisecond), gauge.ValueAsTime().Round(1*time.Millisecond); expected != got { 44 t.Errorf("Expected error %s, got %s.", expected, got) 45 } 46 } 47 48 func TestGaugeAddSubConcurrently(t *testing.T) { 49 const concurrency = 1000 50 const addAmt = 10 51 const subAmt = 2 52 gauge := NewGauge() 53 var wg sync.WaitGroup 54 wg.Add(concurrency) 55 56 for i := 0; i < concurrency/2; i++ { 57 go func() { 58 gauge.Add(addAmt) 59 gauge.Dec() // for every dec we do an equivalent sub below (*) 60 wg.Done() 61 }() 62 } 63 for i := 0; i < concurrency/2; i++ { 64 go func() { 65 gauge.Inc() 66 gauge.Sub(subAmt) // (*) 67 wg.Done() 68 }() 69 } 70 wg.Wait() 71 if expected, got := float64(addAmt*(concurrency/2)-subAmt*(concurrency/2)), gauge.Value(); expected != got { 72 t.Errorf("Expected %f, got %f.", expected, got) 73 } 74 }