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  }