github.com/Ilhicas/nomad@v1.0.4-0.20210304152020-e86851182bc3/client/pluginmanager/group_test.go (about)

     1  package pluginmanager
     2  
     3  import (
     4  	"context"
     5  	"sync"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/hashicorp/nomad/helper/testlog"
    10  	"github.com/stretchr/testify/require"
    11  )
    12  
    13  func TestPluginGroup_RegisterAndRun(t *testing.T) {
    14  	t.Parallel()
    15  	require := require.New(t)
    16  
    17  	var hasRun bool
    18  	var wg sync.WaitGroup
    19  	wg.Add(1)
    20  	manager := &MockPluginManager{RunF: func() {
    21  		hasRun = true
    22  		wg.Done()
    23  	}}
    24  
    25  	group := New(testlog.HCLogger(t))
    26  	require.NoError(group.RegisterAndRun(manager))
    27  	wg.Wait()
    28  	require.True(hasRun)
    29  }
    30  
    31  func TestPluginGroup_Shutdown(t *testing.T) {
    32  	t.Parallel()
    33  	require := require.New(t)
    34  
    35  	var stack []int
    36  	var stackMu sync.Mutex
    37  	var runWg sync.WaitGroup
    38  	var shutdownWg sync.WaitGroup
    39  	group := New(testlog.HCLogger(t))
    40  	for i := 1; i < 4; i++ {
    41  		i := i
    42  		runWg.Add(1)
    43  		shutdownWg.Add(1)
    44  		manager := &MockPluginManager{RunF: func() {
    45  			stackMu.Lock()
    46  			defer stackMu.Unlock()
    47  			defer runWg.Done()
    48  			stack = append(stack, i)
    49  		}, ShutdownF: func() {
    50  			stackMu.Lock()
    51  			defer stackMu.Unlock()
    52  			defer shutdownWg.Done()
    53  			idx := len(stack) - 1
    54  			val := stack[idx]
    55  			require.Equal(i, val)
    56  			stack = stack[:idx]
    57  		}}
    58  		require.NoError(group.RegisterAndRun(manager))
    59  		runWg.Wait()
    60  	}
    61  	group.Shutdown()
    62  	shutdownWg.Wait()
    63  	require.Empty(stack)
    64  
    65  	require.Error(group.RegisterAndRun(&MockPluginManager{}))
    66  }
    67  
    68  func TestPluginGroup_WaitForFirstFingerprint(t *testing.T) {
    69  	t.Parallel()
    70  	require := require.New(t)
    71  
    72  	managerCh := make(chan struct{})
    73  	manager := &MockPluginManager{
    74  		RunF:                      func() {},
    75  		WaitForFirstFingerprintCh: managerCh,
    76  	}
    77  
    78  	// close immediately to beat the context timeout
    79  	close(managerCh)
    80  
    81  	group := New(testlog.HCLogger(t))
    82  	require.NoError(group.RegisterAndRun(manager))
    83  
    84  	ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
    85  	defer cancel()
    86  
    87  	groupCh, err := group.WaitForFirstFingerprint(ctx)
    88  	require.NoError(err)
    89  
    90  	select {
    91  	case <-groupCh:
    92  	case <-time.After(100 * time.Millisecond):
    93  		t.Fatal("expected groupCh to be closed")
    94  	}
    95  }
    96  
    97  func TestPluginGroup_WaitForFirstFingerprint_Timeout(t *testing.T) {
    98  	t.Parallel()
    99  	require := require.New(t)
   100  
   101  	managerCh := make(chan struct{})
   102  	manager := &MockPluginManager{
   103  		RunF:                      func() {},
   104  		WaitForFirstFingerprintCh: managerCh,
   105  	}
   106  
   107  	group := New(testlog.HCLogger(t))
   108  	require.NoError(group.RegisterAndRun(manager))
   109  
   110  	ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond)
   111  	defer cancel()
   112  
   113  	groupCh, err := group.WaitForFirstFingerprint(ctx)
   114  
   115  	select {
   116  	case <-groupCh:
   117  	case <-time.After(100 * time.Millisecond):
   118  		t.Fatal("expected groupCh to be closed due to context timeout")
   119  	}
   120  	require.NoError(err)
   121  }