github.com/hernad/nomad@v1.6.112/drivers/shared/eventer/eventer_test.go (about)

     1  // Copyright (c) HashiCorp, Inc.
     2  // SPDX-License-Identifier: MPL-2.0
     3  
     4  package eventer
     5  
     6  import (
     7  	"context"
     8  	"sync"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/hernad/nomad/ci"
    13  	"github.com/hernad/nomad/helper/testlog"
    14  	"github.com/hernad/nomad/plugins/drivers"
    15  	"github.com/stretchr/testify/require"
    16  )
    17  
    18  func TestEventer(t *testing.T) {
    19  	ci.Parallel(t)
    20  	require := require.New(t)
    21  
    22  	ctx, cancel := context.WithCancel(context.Background())
    23  	defer cancel()
    24  	e := NewEventer(ctx, testlog.HCLogger(t))
    25  
    26  	events := []*drivers.TaskEvent{
    27  		{
    28  			TaskID:    "a",
    29  			Timestamp: time.Now(),
    30  		},
    31  		{
    32  			TaskID:    "b",
    33  			Timestamp: time.Now(),
    34  		},
    35  		{
    36  			TaskID:    "c",
    37  			Timestamp: time.Now(),
    38  		},
    39  	}
    40  
    41  	ctx1, cancel1 := context.WithCancel(context.Background())
    42  	defer cancel1()
    43  	consumer1, err := e.TaskEvents(ctx1)
    44  	require.NoError(err)
    45  	ctx2 := (context.Background())
    46  	consumer2, err := e.TaskEvents(ctx2)
    47  	require.NoError(err)
    48  
    49  	var buffer1, buffer2 []*drivers.TaskEvent
    50  	var wg sync.WaitGroup
    51  	wg.Add(2)
    52  	go func() {
    53  		defer wg.Done()
    54  		var i int
    55  		for event := range consumer1 {
    56  			i++
    57  			buffer1 = append(buffer1, event)
    58  			if i == len(events) {
    59  				return
    60  			}
    61  		}
    62  	}()
    63  	go func() {
    64  		defer wg.Done()
    65  		var i int
    66  		for event := range consumer2 {
    67  			i++
    68  			buffer2 = append(buffer2, event)
    69  			if i == len(events) {
    70  				return
    71  			}
    72  		}
    73  	}()
    74  
    75  	for _, event := range events {
    76  		require.NoError(e.EmitEvent(event))
    77  	}
    78  
    79  	wg.Wait()
    80  	require.Exactly(events, buffer1)
    81  	require.Exactly(events, buffer2)
    82  }
    83  
    84  func TestEventer_iterateConsumers(t *testing.T) {
    85  	ci.Parallel(t)
    86  	require := require.New(t)
    87  
    88  	e := &Eventer{
    89  		events: make(chan *drivers.TaskEvent),
    90  		ctx:    context.Background(),
    91  		logger: testlog.HCLogger(t),
    92  	}
    93  
    94  	ev := &drivers.TaskEvent{
    95  		TaskID:    "a",
    96  		Timestamp: time.Now(),
    97  	}
    98  
    99  	ctx1, cancel1 := context.WithCancel(context.Background())
   100  	consumer, err := e.TaskEvents(ctx1)
   101  	require.NoError(err)
   102  	require.Equal(1, len(e.consumers))
   103  
   104  	var wg sync.WaitGroup
   105  	wg.Add(1)
   106  	go func() {
   107  		defer wg.Done()
   108  		ev1, ok := <-consumer
   109  		require.Exactly(ev, ev1)
   110  		require.True(ok)
   111  	}()
   112  	e.iterateConsumers(ev)
   113  	wg.Wait()
   114  
   115  	go func() {
   116  		cancel1()
   117  		e.iterateConsumers(ev)
   118  	}()
   119  	ev1, ok := <-consumer
   120  	require.False(ok)
   121  	require.Nil(ev1)
   122  	require.Equal(0, len(e.consumers))
   123  }