github.com/unicornultrafoundation/go-u2u@v1.0.0-rc1.0.20240205080301-e74a83d3fadc/utils/num_queue_test.go (about) 1 package utils 2 3 import ( 4 "math/rand" 5 "sync" 6 "testing" 7 8 "github.com/stretchr/testify/require" 9 ) 10 11 func TestNumQueue(t *testing.T) { 12 13 t.Run("Simple", func(t *testing.T) { 14 N := uint64(100) 15 q := NewNumQueue(0) 16 for i := uint64(1); i <= N; i++ { 17 var iter sync.WaitGroup 18 iter.Add(1) 19 go func(i uint64) { 20 defer iter.Done() 21 q.WaitFor(i) 22 }(i) 23 24 q.Done(i) 25 iter.Wait() 26 } 27 }) 28 29 t.Run("Random", func(t *testing.T) { 30 require := require.New(t) 31 N := 100 32 33 q := NewNumQueue(0) 34 output := make(chan uint64, 10) 35 nums := rand.Perm(N) 36 37 for _, n := range nums { 38 go func(n uint64) { 39 q.WaitFor(n - 1) 40 output <- n 41 if n == uint64(N) { 42 close(output) 43 } 44 q.Done(n) 45 46 }(uint64(n + 1)) 47 } 48 49 var prev uint64 50 for got := range output { 51 require.Less(prev, got) 52 prev = got 53 } 54 }) 55 }