From 418d360d190032be903cf1a96af68716625bfb82 Mon Sep 17 00:00:00 2001 From: Michael Schurter Date: Thu, 17 Jan 2019 15:01:49 -0800 Subject: [PATCH] test: port SignalFailure test from 0.8 Also fix signal error handling in mock_driver. --- .../taskrunner/task_runner_test.go | 48 +++++++++++++------ drivers/mock/driver.go | 4 +- 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/client/allocrunner/taskrunner/task_runner_test.go b/client/allocrunner/taskrunner/task_runner_test.go index 875afe5fe..5df453d26 100644 --- a/client/allocrunner/taskrunner/task_runner_test.go +++ b/client/allocrunner/taskrunner/task_runner_test.go @@ -126,12 +126,7 @@ func TestTaskRunner_Restore_Running(t *testing.T) { defer origTR.Kill(context.Background(), structs.NewTaskEvent("cleanup")) // Wait for it to be running - testutil.WaitForResult(func() (bool, error) { - ts := origTR.TaskState() - return ts.State == structs.TaskStateRunning, fmt.Errorf("%v", ts.State) - }, func(err error) { - t.Fatalf("expected running; got: %v", err) - }) + testWaitForTaskToStart(t, origTR) // Cause TR to exit without shutting down task origTR.Shutdown() @@ -597,16 +592,39 @@ func TestTaskRunner_Dispatch_Payload(t *testing.T) { require.Equal(t, expected, data) } -// testWaitForTaskToStart waits for the task to or fails the test -func testWaitForTaskToStart(t *testing.T, tr *TaskRunner) { - // Wait for the task to start - testutil.WaitForResult(func() (bool, error) { - tr.stateLock.RLock() - started := !tr.state.StartedAt.IsZero() - tr.stateLock.RUnlock() +func TestTaskRunner_SignalFailure(t *testing.T) { + t.Parallel() - return started, nil + alloc := mock.Alloc() + task := alloc.Job.TaskGroups[0].Tasks[0] + task.Driver = "mock_driver" + errMsg := "test forcing failure" + task.Config = map[string]interface{}{ + "run_for": "10m", + "signal_error": errMsg, + } + + conf, cleanup := testTaskRunnerConfig(t, alloc, task.Name) + defer cleanup() + + tr, err := NewTaskRunner(conf) + require.NoError(t, err) + go tr.Run() + defer tr.Kill(context.Background(), structs.NewTaskEvent("cleanup")) + + testWaitForTaskToStart(t, tr) + + err = tr.Signal(&structs.TaskEvent{}, "SIGINT") + require.NotNil(t, err) + require.Equal(t, errMsg, err.Error()) +} + +// testWaitForTaskToStart waits for the task to be running or fails the test +func testWaitForTaskToStart(t *testing.T, tr *TaskRunner) { + testutil.WaitForResult(func() (bool, error) { + ts := tr.TaskState() + return ts.State == structs.TaskStateRunning, fmt.Errorf("%v", ts.State) }, func(err error) { - t.Fatalf("not started") + require.NoError(t, err) }) } diff --git a/drivers/mock/driver.go b/drivers/mock/driver.go index 0039da41e..f80b81514 100644 --- a/drivers/mock/driver.go +++ b/drivers/mock/driver.go @@ -76,7 +76,7 @@ var ( "exit_code": hclspec.NewAttr("exit_code", "number", false), "exit_signal": hclspec.NewAttr("exit_signal", "number", false), "exit_err_msg": hclspec.NewAttr("exit_err_msg", "string", false), - "signal_err": hclspec.NewAttr("signal_err", "string", false), + "signal_error": hclspec.NewAttr("signal_error", "string", false), "driver_ip": hclspec.NewAttr("driver_ip", "string", false), "driver_advertise": hclspec.NewAttr("driver_advertise", "bool", false), "driver_port_map": hclspec.NewAttr("driver_port_map", "string", false), @@ -88,7 +88,7 @@ var ( // capabilities is returned by the Capabilities RPC and indicates what // optional features this driver supports capabilities = &drivers.Capabilities{ - SendSignals: false, + SendSignals: true, Exec: true, FSIsolation: drivers.FSIsolationNone, }