github.com/bigcommerce/nomad@v0.9.3-bc/drivers/exec/driver_unix_test.go (about)

     1  // +build darwin dragonfly freebsd linux netbsd openbsd solaris
     2  
     3  package exec
     4  
     5  import (
     6  	"context"
     7  	"fmt"
     8  	"testing"
     9  	"time"
    10  
    11  	ctestutils "github.com/hashicorp/nomad/client/testutil"
    12  	"github.com/hashicorp/nomad/helper/testlog"
    13  	"github.com/hashicorp/nomad/helper/uuid"
    14  	"github.com/hashicorp/nomad/plugins/drivers"
    15  	dtestutil "github.com/hashicorp/nomad/plugins/drivers/testutils"
    16  	"github.com/hashicorp/nomad/testutil"
    17  	"github.com/stretchr/testify/require"
    18  	"golang.org/x/sys/unix"
    19  )
    20  
    21  func TestExecDriver_StartWaitStop(t *testing.T) {
    22  	t.Parallel()
    23  	require := require.New(t)
    24  	ctestutils.ExecCompatible(t)
    25  
    26  	d := NewExecDriver(testlog.HCLogger(t))
    27  	harness := dtestutil.NewDriverHarness(t, d)
    28  	task := &drivers.TaskConfig{
    29  		ID:        uuid.Generate(),
    30  		Name:      "test",
    31  		Resources: testResources,
    32  	}
    33  
    34  	taskConfig := map[string]interface{}{
    35  		"command": "/bin/sleep",
    36  		"args":    []string{"600"},
    37  	}
    38  	require.NoError(task.EncodeConcreteDriverConfig(&taskConfig))
    39  
    40  	cleanup := harness.MkAllocDir(task, false)
    41  	defer cleanup()
    42  
    43  	handle, _, err := harness.StartTask(task)
    44  	require.NoError(err)
    45  
    46  	ch, err := harness.WaitTask(context.Background(), handle.Config.ID)
    47  	require.NoError(err)
    48  
    49  	require.NoError(harness.WaitUntilStarted(task.ID, 1*time.Second))
    50  
    51  	go func() {
    52  		harness.StopTask(task.ID, 2*time.Second, "SIGINT")
    53  	}()
    54  
    55  	select {
    56  	case result := <-ch:
    57  		require.Equal(int(unix.SIGINT), result.Signal)
    58  	case <-time.After(10 * time.Second):
    59  		require.Fail("timeout waiting for task to shutdown")
    60  	}
    61  
    62  	// Ensure that the task is marked as dead, but account
    63  	// for WaitTask() closing channel before internal state is updated
    64  	testutil.WaitForResult(func() (bool, error) {
    65  		status, err := harness.InspectTask(task.ID)
    66  		if err != nil {
    67  			return false, fmt.Errorf("inspecting task failed: %v", err)
    68  		}
    69  		if status.State != drivers.TaskStateExited {
    70  			return false, fmt.Errorf("task hasn't exited yet; status: %v", status.State)
    71  		}
    72  
    73  		return true, nil
    74  	}, func(err error) {
    75  		require.NoError(err)
    76  	})
    77  
    78  	require.NoError(harness.DestroyTask(task.ID, true))
    79  }
    80  
    81  func TestExec_ExecTaskStreaming(t *testing.T) {
    82  	t.Parallel()
    83  	require := require.New(t)
    84  
    85  	d := NewExecDriver(testlog.HCLogger(t))
    86  	harness := dtestutil.NewDriverHarness(t, d)
    87  	defer harness.Kill()
    88  
    89  	task := &drivers.TaskConfig{
    90  		ID:   uuid.Generate(),
    91  		Name: "sleep",
    92  	}
    93  
    94  	cleanup := harness.MkAllocDir(task, false)
    95  	defer cleanup()
    96  
    97  	tc := &TaskConfig{
    98  		Command: "/bin/sleep",
    99  		Args:    []string{"9000"},
   100  	}
   101  	require.NoError(task.EncodeConcreteDriverConfig(&tc))
   102  
   103  	_, _, err := harness.StartTask(task)
   104  	require.NoError(err)
   105  	defer d.DestroyTask(task.ID, true)
   106  
   107  	dtestutil.ExecTaskStreamingConformanceTests(t, harness, task.ID)
   108  
   109  }