github.com/unicornultrafoundation/go-u2u@v1.0.0-rc1.0.20240205080301-e74a83d3fadc/utils/rate/gauge_test.go (about) 1 package rate 2 3 import ( 4 "sync" 5 "testing" 6 ) 7 8 func TestGauge_Concurrency(t *testing.T) { 9 for try := 0; try < 100; try++ { 10 testGaugeConcurrency(t) 11 } 12 } 13 14 func testGaugeConcurrency(t *testing.T) { 15 g := NewGauge() 16 barrier := make(chan struct{}) 17 wg := sync.WaitGroup{} 18 end := int64(32) 19 for i := int64(0); i <= end; i++ { 20 wg.Add(1) 21 turn := i 22 go func() { 23 defer wg.Done() 24 select { 25 case <-barrier: 26 g.Mark(turn) 27 if v := int64(g.rateToGauge(float64(2*end), 1)); v < turn { 28 t.Errorf("%d >= %d", v, end) 29 } 30 return 31 } 32 }() 33 } 34 close(barrier) 35 wg.Wait() 36 if v := int64(g.rateToGauge(float64(2*end), 1)); v != end { 37 t.Errorf("%d != %d", v, end) 38 } 39 }