github.com/grafana/synthetic-monitoring-agent@v0.64.2/internal/pusher/v2/condition_test.go (about) 1 package v2 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/stretchr/testify/require" 8 ) 9 10 func TestCondition(t *testing.T) { 11 const ( 12 fastTimeout = 50 * time.Millisecond 13 slowTimeout = 1000 * time.Millisecond 14 ) 15 16 var timeout = slowTimeout 17 if testing.Short() { 18 timeout = fastTimeout 19 } 20 21 t.Run("don't fire until signaled", func(t *testing.T) { 22 c := newCondition() 23 wait(t, &c, false, timeout) 24 }) 25 t.Run("fire after signaled", func(t *testing.T) { 26 c := newCondition() 27 c.Signal() 28 wait(t, &c, true, timeout) 29 }) 30 t.Run("single fire", func(t *testing.T) { 31 c := newCondition() 32 c.Signal() 33 c.Signal() 34 wait(t, &c, true, timeout) 35 wait(t, &c, false, timeout) 36 }) 37 t.Run("single fire", func(t *testing.T) { 38 c := newCondition() 39 c.Signal() 40 c.Signal() 41 wait(t, &c, true, timeout) 42 wait(t, &c, false, timeout) 43 }) 44 t.Run("goroutine", func(t *testing.T) { 45 c := newCondition() 46 47 go func() { 48 c.Signal() 49 }() 50 51 wait(t, &c, true, timeout) 52 }) 53 t.Run("loop", func(t *testing.T) { 54 const iterations = 100 55 56 a, b := newCondition(), newCondition() 57 58 go func() { 59 for range iterations { 60 a.Signal() 61 wait(t, &b, true, timeout) 62 } 63 }() 64 65 for range iterations { 66 wait(t, &a, true, timeout) 67 b.Signal() 68 } 69 }) 70 } 71 72 func wait(t *testing.T, c *condition, fire bool, timeout time.Duration) { 73 tm := time.NewTimer(timeout) 74 defer tm.Stop() 75 76 fired := false 77 78 select { 79 case <-tm.C: 80 case <-c.C(): 81 fired = true 82 } 83 84 require.Equal(t, fire, fired) 85 }