From 53d322ec69ff71f7ed5f7c96a0b6264fbf1e8097 Mon Sep 17 00:00:00 2001 From: Sander van Harmelen Date: Thu, 4 Oct 2018 20:35:41 +0200 Subject: [PATCH] Test lock timeout errors when running a plan --- backend/remote/backend_plan_test.go | 72 +++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/backend/remote/backend_plan_test.go b/backend/remote/backend_plan_test.go index c005e2c33..2d08ad1f1 100644 --- a/backend/remote/backend_plan_test.go +++ b/backend/remote/backend_plan_test.go @@ -2,8 +2,12 @@ package remote import ( "context" + "os" + "os/signal" "strings" + "syscall" "testing" + "time" tfe "github.com/hashicorp/go-tfe" "github.com/hashicorp/terraform/backend" @@ -140,6 +144,74 @@ func TestRemote_planNoConfig(t *testing.T) { } } +func TestRemote_planLockTimeout(t *testing.T) { + b := testBackendDefault(t) + ctx := context.Background() + + // Retrieve the workspace used to run this operation in. + w, err := b.client.Workspaces.Read(ctx, b.organization, b.workspace) + if err != nil { + t.Fatalf("error retrieving workspace: %v", err) + } + + // Create a new configuration version. + c, err := b.client.ConfigurationVersions.Create(ctx, w.ID, tfe.ConfigurationVersionCreateOptions{}) + if err != nil { + t.Fatalf("error creating configuration version: %v", err) + } + + // Create a pending run to block this run. + _, err = b.client.Runs.Create(ctx, tfe.RunCreateOptions{ + ConfigurationVersion: c, + Workspace: w, + }) + if err != nil { + t.Fatalf("error creating pending run: %v", err) + } + + mod, modCleanup := module.TestTree(t, "./test-fixtures/plan") + defer modCleanup() + + input := testInput(t, map[string]string{ + "cancel": "yes", + "approve": "yes", + }) + + op := testOperationPlan() + op.StateLockTimeout = 5 * time.Second + op.Module = mod + op.UIIn = input + op.UIOut = b.CLI + op.Workspace = backend.DefaultStateName + + _, err = b.Operation(context.Background(), op) + if err != nil { + t.Fatalf("error starting operation: %v", err) + } + + sigint := make(chan os.Signal, 1) + signal.Notify(sigint, syscall.SIGINT) + select { + case <-sigint: + // Stop redirecting SIGINT signals. + signal.Stop(sigint) + case <-time.After(10 * time.Second): + t.Fatalf("expected lock timeout after 5 seconds, waited 10 seconds") + } + + if len(input.answers) != 2 { + t.Fatalf("expected unused answers, got: %v", input.answers) + } + + output := b.CLI.(*cli.MockUi).OutputWriter.String() + if !strings.Contains(output, "Lock timeout exceeded") { + t.Fatalf("missing lock timout error in output: %s", output) + } + if strings.Contains(output, "1 to add, 0 to change, 0 to destroy") { + t.Fatalf("unexpected plan summery in output: %s", output) + } +} + func TestRemote_planDestroy(t *testing.T) { b := testBackendDefault(t)