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  }