From a2cc2532ea0f098e87dd1e358a4c3ecc4911031d Mon Sep 17 00:00:00 2001 From: Adrien Delorme Date: Fri, 3 May 2019 09:02:56 +0200 Subject: [PATCH] add TestBuildParallel_Timeout to test errors on parallel builds --- command/build_parallel_test.go | 42 +++++++++++++++++++ .../test-fixtures/parallel/2lock-timeout.json | 19 +++++++++ 2 files changed, 61 insertions(+) create mode 100644 command/test-fixtures/parallel/2lock-timeout.json diff --git a/command/build_parallel_test.go b/command/build_parallel_test.go index 3b4f42dac..5acb1dbfc 100644 --- a/command/build_parallel_test.go +++ b/command/build_parallel_test.go @@ -10,7 +10,9 @@ import ( "golang.org/x/sync/errgroup" + "github.com/hashicorp/packer/builder/file" "github.com/hashicorp/packer/packer" + "github.com/hashicorp/packer/provisioner/sleep" ) // NewParallelTestBuilder will return a New ParallelTestBuilder that will @@ -44,6 +46,7 @@ func (b *LockedBuilder) Run(ctx context.Context, ui packer.Ui, hook packer.Hook) select { case <-b.unlock: case <-ctx.Done(): + panic("crap") return nil, ctx.Err() } return nil, nil @@ -59,12 +62,22 @@ func testMetaParallel(t *testing.T, builder *ParallelTestBuilder, locked *Locked switch n { case "parallel-test": return builder, nil + case "file": + return &file.Builder{}, nil case "lock": return locked, nil default: panic(n) } }, + Provisioner: func(n string) (packer.Provisioner, error) { + switch n { + case "sleep": + return &sleep.Provisioner{}, nil + default: + panic(n) + } + }, }, }, Ui: &packer.BasicUi{ @@ -131,3 +144,32 @@ func TestBuildParallel_2(t *testing.T) { close(locked.unlock) // unlock locking one wg.Wait() // wait for termination } + +func TestBuildParallel_Timeout(t *testing.T) { + // testfile has 6 builds, 1 of them locks 'forever', one locks and times + // out other builds should go through. + b := NewParallelTestBuilder(4) + locked := &LockedBuilder{unlock: make(chan interface{})} + + c := &BuildCommand{ + Meta: testMetaParallel(t, b, locked), + } + + args := []string{ + fmt.Sprintf("-parallel-builds=3"), + filepath.Join(testFixture("parallel"), "2lock-timeout.json"), + } + + wg := errgroup.Group{} + + wg.Go(func() error { + if code := c.Run(args); code == 0 { + fatalCommand(t, c.Meta) + } + return nil + }) + + b.wg.Wait() // ran 4 times + close(locked.unlock) // unlock locking one + wg.Wait() // wait for termination +} diff --git a/command/test-fixtures/parallel/2lock-timeout.json b/command/test-fixtures/parallel/2lock-timeout.json new file mode 100644 index 000000000..a3425fc49 --- /dev/null +++ b/command/test-fixtures/parallel/2lock-timeout.json @@ -0,0 +1,19 @@ +{ + "builders": [ + {"type": "lock", "name": "build0"}, + {"type": "parallel-test", "name": "build1"}, + {"type": "parallel-test", "name": "build2"}, + {"type": "file", "name": "timeout-build", "target": "roses.txt"}, + {"type": "parallel-test", "name": "build4"}, + {"type": "parallel-test", "name": "build5"} + ], + "provisioners": [ + { + "only": ["timeout-build"], + "type": "sleep", + "duration": "2m", + + "timeout": "1ns" + } + ] +} \ No newline at end of file