From cb110b263b2c725d6d5c4030d42af91f7abceedf Mon Sep 17 00:00:00 2001 From: Anurag Sharma Date: Tue, 11 Mar 2025 16:49:48 +0530 Subject: [PATCH] packer_test: added inline shebang test cases for shell provisioner --- .../shell/provisioner_test.go | 67 +++++++++++++++++++ .../provisioner_tests/shell/suite_test.go | 23 +++++++ .../templates/no_shebang_in_script.pkr.hcl | 14 ++++ .../no_shebang_inline_but_as_option.pkr.hcl | 17 +++++ .../shell/templates/shebang_as_option.pkr.hcl | 17 +++++ .../shell/templates/shebang_in_inline.pkr.hcl | 15 +++++ 6 files changed, 153 insertions(+) create mode 100644 packer_test/provisioner_tests/shell/provisioner_test.go create mode 100644 packer_test/provisioner_tests/shell/suite_test.go create mode 100644 packer_test/provisioner_tests/shell/templates/no_shebang_in_script.pkr.hcl create mode 100644 packer_test/provisioner_tests/shell/templates/no_shebang_inline_but_as_option.pkr.hcl create mode 100644 packer_test/provisioner_tests/shell/templates/shebang_as_option.pkr.hcl create mode 100644 packer_test/provisioner_tests/shell/templates/shebang_in_inline.pkr.hcl diff --git a/packer_test/provisioner_tests/shell/provisioner_test.go b/packer_test/provisioner_tests/shell/provisioner_test.go new file mode 100644 index 000000000..605170c8f --- /dev/null +++ b/packer_test/provisioner_tests/shell/provisioner_test.go @@ -0,0 +1,67 @@ +package plugin_tests + +import ( + "os" + + "github.com/hashicorp/packer/packer_test/common/check" +) + +func (ts *PackerShellProvisionerTestSuite) TestNoShebangInScript() { + dir := ts.MakePluginDir() + defer dir.Cleanup() + + ts.PackerCommand().UsePluginDir(dir). + SetArgs("plugins", "install", "github.com/hashicorp/docker"). + Assert(check.MustSucceed()) + + ts.PackerCommand().UsePluginDir(dir). + AddEnv("HOME", os.Getenv("HOME")). + AddEnv("PATH", os.Getenv("PATH")). + SetArgs("build", "templates/no_shebang_in_script.pkr.hcl"). + Assert(check.MustSucceed()) +} + +func (ts *PackerShellProvisionerTestSuite) TestShebangInInlineScript() { + dir := ts.MakePluginDir() + defer dir.Cleanup() + + ts.PackerCommand().UsePluginDir(dir). + SetArgs("plugins", "install", "github.com/hashicorp/docker"). + Assert(check.MustSucceed()) + + ts.PackerCommand().UsePluginDir(dir). + AddEnv("HOME", os.Getenv("HOME")). + AddEnv("PATH", os.Getenv("PATH")). + SetArgs("build", "templates/shebang_in_inline.pkr.hcl"). + Assert(check.MustSucceed()) +} + +func (ts *PackerShellProvisionerTestSuite) TestShebangAsOption() { + dir := ts.MakePluginDir() + defer dir.Cleanup() + + ts.PackerCommand().UsePluginDir(dir). + SetArgs("plugins", "install", "github.com/hashicorp/docker"). + Assert(check.MustSucceed()) + + ts.PackerCommand().UsePluginDir(dir). + AddEnv("HOME", os.Getenv("HOME")). + AddEnv("PATH", os.Getenv("PATH")). + SetArgs("build", "templates/shebang_as_option.pkr.hcl"). + Assert(check.MustSucceed()) +} + +func (ts *PackerShellProvisionerTestSuite) TestShebangAsOptionNotInline() { + dir := ts.MakePluginDir() + defer dir.Cleanup() + + ts.PackerCommand().UsePluginDir(dir). + SetArgs("plugins", "install", "github.com/hashicorp/docker"). + Assert(check.MustSucceed()) + + ts.PackerCommand().UsePluginDir(dir). + AddEnv("HOME", os.Getenv("HOME")). + AddEnv("PATH", os.Getenv("PATH")). + SetArgs("build", "templates/no_shebang_inline_but_as_option.pkr.hcl"). + Assert(check.MustSucceed()) +} diff --git a/packer_test/provisioner_tests/shell/suite_test.go b/packer_test/provisioner_tests/shell/suite_test.go new file mode 100644 index 000000000..1e8a6d4ba --- /dev/null +++ b/packer_test/provisioner_tests/shell/suite_test.go @@ -0,0 +1,23 @@ +package plugin_tests + +import ( + "testing" + + "github.com/hashicorp/packer/packer_test/common" + "github.com/stretchr/testify/suite" +) + +type PackerShellProvisionerTestSuite struct { + *common.PackerTestSuite +} + +func Test_PackerPluginSuite(t *testing.T) { + baseSuite, cleanup := common.InitBaseSuite(t) + defer cleanup() + + ts := &PackerShellProvisionerTestSuite{ + baseSuite, + } + + suite.Run(t, ts) +} diff --git a/packer_test/provisioner_tests/shell/templates/no_shebang_in_script.pkr.hcl b/packer_test/provisioner_tests/shell/templates/no_shebang_in_script.pkr.hcl new file mode 100644 index 000000000..a7143e792 --- /dev/null +++ b/packer_test/provisioner_tests/shell/templates/no_shebang_in_script.pkr.hcl @@ -0,0 +1,14 @@ +source "docker" "test" { + image = "debian:bookworm" + discard = true +} + +build { + sources = ["docker.test"] + + provisioner "shell" { + inline = [ + "cat $0 | head -1 | grep -E '^#!/bin/sh -e'", + ] + } +} diff --git a/packer_test/provisioner_tests/shell/templates/no_shebang_inline_but_as_option.pkr.hcl b/packer_test/provisioner_tests/shell/templates/no_shebang_inline_but_as_option.pkr.hcl new file mode 100644 index 000000000..495d45e19 --- /dev/null +++ b/packer_test/provisioner_tests/shell/templates/no_shebang_inline_but_as_option.pkr.hcl @@ -0,0 +1,17 @@ +source "docker" "test" { + image = "debian:bookworm" + discard = true +} + +build { + sources = ["docker.test"] + + provisioner "shell" { + inline_shebang = "/bin/bash -ex" + inline = [ + "head -1 <\"$0\" | grep -qE '^#!/bin/bash'", + "if grep -qE \"^#!/bin/sh\" <\"$0\"; then exit 1; fi", + "cat \"$0\"" + ] + } +} diff --git a/packer_test/provisioner_tests/shell/templates/shebang_as_option.pkr.hcl b/packer_test/provisioner_tests/shell/templates/shebang_as_option.pkr.hcl new file mode 100644 index 000000000..2bc520213 --- /dev/null +++ b/packer_test/provisioner_tests/shell/templates/shebang_as_option.pkr.hcl @@ -0,0 +1,17 @@ +source "docker" "test" { + image = "debian:bookworm" + discard = true +} + +build { + sources = ["docker.test"] + + provisioner "shell" { + inline_shebang = "/bin/bash -ex" + inline = [ + "#!/bin/sh", + "cat \"$0\" | head -1 | grep -qE '^#!/bin/bash'", + "cat \"$0\"" + ] + } +} diff --git a/packer_test/provisioner_tests/shell/templates/shebang_in_inline.pkr.hcl b/packer_test/provisioner_tests/shell/templates/shebang_in_inline.pkr.hcl new file mode 100644 index 000000000..f3a47183c --- /dev/null +++ b/packer_test/provisioner_tests/shell/templates/shebang_in_inline.pkr.hcl @@ -0,0 +1,15 @@ +source "docker" "test" { + image = "debian:bookworm" + discard = true +} + +build { + sources = ["docker.test"] + + provisioner "shell" { + inline = [ + "#!/bin/bash -e", + "cat $0 | head -1 | grep -E '#!/bin/bash -e'" + ] + } +}