diff --git a/command/init_test.go b/command/init_test.go index c7d5621cd..a77002401 100644 --- a/command/init_test.go +++ b/command/init_test.go @@ -1,10 +1,9 @@ package command import ( - "io/ioutil" + "fmt" "log" "os" - "path/filepath" "runtime" "sort" "testing" @@ -14,27 +13,46 @@ import ( "golang.org/x/mod/sumdb/dirhash" ) +type testCaseInit struct { + checkSkip func(*testing.T) + name string + Meta Meta + inPluginFolder map[string]string + expectedPackerConfigDirHashBeforeInit string + inConfigFolder map[string]string + packerConfigDir string + packerUserFolder string + want int + dirFiles []string + expectedPackerConfigDirHashAfterInit string + moreTests []func(*testing.T, testCaseInit) +} + +type testBuild struct { + want int +} + +func (tb testBuild) fn(t *testing.T, tc testCaseInit) { + bc := BuildCommand{ + Meta: tc.Meta, + } + + args := []string{tc.packerUserFolder} + want := tb.want + if got := bc.Run(args); got != want { + t.Errorf("BuildCommand.Run() = %v, want %v", got, want) + } +} + func TestInitCommand_Run(t *testing.T) { // These tests will try to optimise for doing the least amount of github api // requests whilst testing the max amount of things at once. Hopefully they // don't require a GH token just yet. Acc tests are run on linux, darwin and // windows, so requests are done 3 times. - type testCase struct { - checkSkip func(*testing.T) - name string - inPluginFolder map[string]string - expectedPackerConfigDirHashBeforeInit string - hclFile string - packerConfigDir string - want int - dirFiles []string - expectedPackerConfigDirHashAfterInit string - } - cfg := &configDirSingleton{map[string]string{}} - tests := []testCase{ + tests := []testCaseInit{ { nil, // here we pre-write plugins with valid checksums, Packer will @@ -43,6 +61,7 @@ func TestInitCommand_Run(t *testing.T) { // that's a no-op. This also should do no GH query, so it is best // to always run it. "already-installed-no-op", + testMetaFile(t), map[string]string{ "github.com/sylviamoss/comment/packer-plugin-comment_v0.2.18_x5.0_darwin_amd64": "1", "github.com/sylviamoss/comment/packer-plugin-comment_v0.2.18_x5.0_darwin_amd64_SHA256SUM": "6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b", @@ -52,19 +71,27 @@ func TestInitCommand_Run(t *testing.T) { "github.com/sylviamoss/comment/packer-plugin-comment_v0.2.18_x5.0_linux_amd64_SHA256SUM": "59031c50e0dfeedfde2b4e9445754804dce3f29e4efa737eead0ca9b4f5b85a5", }, "h1:Q5qyAOdD43hL3CquQdVfaHpOYGf0UsZ/+wVA9Ry6cbA=", - `# cfg.pkr.hcl - packer { - required_plugins { - comment = { - source = "github.com/sylviamoss/comment" - version = "v0.2.018" - } - } - }`, - cfg.dir("1"), + map[string]string{ + `cfg.pkr.hcl`: ` + packer { + required_plugins { + comment = { + source = "github.com/sylviamoss/comment" + version = "v0.2.018" + } + } + }`, + }, + cfg.dir("1_pkr_config"), + cfg.dir("1_pkr_user_folder"), 0, nil, "h1:Q5qyAOdD43hL3CquQdVfaHpOYGf0UsZ/+wVA9Ry6cbA=", + []func(t *testing.T, tc testCaseInit){ + // test that a build will not work since plugins are broken for + // this tests (they are not binaries). + testBuild{want: 1}.fn, + }, }, { func(t *testing.T) { @@ -76,6 +103,7 @@ func TestInitCommand_Run(t *testing.T) { // see those as valid installations it did. // But because we require version 0.2.19, we will upgrade. "already-installed-upgrade", + testMetaFile(t), map[string]string{ "github.com/sylviamoss/comment/packer-plugin-comment_v0.2.18_x5.0_darwin_amd64": "1", "github.com/sylviamoss/comment/packer-plugin-comment_v0.2.18_x5.0_darwin_amd64_SHA256SUM": "6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b", @@ -85,16 +113,34 @@ func TestInitCommand_Run(t *testing.T) { "github.com/sylviamoss/comment/packer-plugin-comment_v0.2.18_x5.0_linux_amd64_SHA256SUM": "59031c50e0dfeedfde2b4e9445754804dce3f29e4efa737eead0ca9b4f5b85a5", }, "h1:Q5qyAOdD43hL3CquQdVfaHpOYGf0UsZ/+wVA9Ry6cbA=", - `# cfg.pkr.hcl - packer { - required_plugins { - comment = { - source = "github.com/sylviamoss/comment" - version = "v0.2.019" + map[string]string{ + `cfg.pkr.hcl`: ` + packer { + required_plugins { + comment = { + source = "github.com/sylviamoss/comment" + version = "v0.2.019" + } + } + }`, + `source.pkr.hcl`: ` + source "null" "test" { + communicator = "none" + } + `, + `build.pkr.hcl`: ` + build { + sources = ["source.null.test"] + provisioner "comment" { + comment = "Begin ยก" + ui = true + bubble_text = true } } - }`, - cfg.dir("2"), + `, + }, + cfg.dir("2_pkr_config"), + cfg.dir("2_pkr_user_folder"), 0, []string{ "github.com/sylviamoss/comment/packer-plugin-comment_v0.2.18_x5.0_darwin_amd64", @@ -119,6 +165,10 @@ func TestInitCommand_Run(t *testing.T) { "linux": "h1:CGym0+Nd0LEANgzqL0wx/LDjRL8bYwlpZ0HajPJo/hs=", "windows": "h1:ag0/C1YjP7KoEDYOiJHE0K+lhFgs0tVgjriWCXVT1fg=", }[runtime.GOOS], + []func(t *testing.T, tc testCaseInit){ + // test that a build will work as the plugin was just installed + testBuild{want: 0}.fn, + }, }, { func(t *testing.T) { @@ -127,21 +177,26 @@ func TestInitCommand_Run(t *testing.T) { } }, "release-with-no-binary", + testMetaFile(t), nil, "h1:47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=", - `# cfg.pkr.hcl - packer { - required_plugins { - comment = { - source = "github.com/sylviamoss/comment" - version = "v0.2.20" - } - } - }`, - cfg.dir("3"), + map[string]string{ + `cfg.pkr.hcl`: ` + packer { + required_plugins { + comment = { + source = "github.com/sylviamoss/comment" + version = "v0.2.20" + } + } + }`, + }, + cfg.dir("3_pkr_config"), + cfg.dir("3_pkr_user_folder"), 1, nil, "h1:47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=", + nil, }, } for _, tt := range tests { @@ -157,6 +212,10 @@ func TestInitCommand_Run(t *testing.T) { t.Cleanup(func() { _ = os.RemoveAll(tt.packerConfigDir) }) + createFiles(tt.packerUserFolder, tt.inConfigFolder) + t.Cleanup(func() { + _ = os.RemoveAll(tt.packerUserFolder) + }) hash, err := dirhash.HashDir(tt.packerConfigDir, "", dirhash.DefaultHash) if err != nil { @@ -166,21 +225,10 @@ func TestInitCommand_Run(t *testing.T) { t.Errorf("unexpected dir hash before init: %s", diff) } - cfgDir, err := ioutil.TempDir("", "pkr-test-init-file-folder") - if err != nil { - t.Fatalf("TempDir: %v", err) - } - if err := ioutil.WriteFile(filepath.Join(cfgDir, "cfg.pkr.hcl"), []byte(tt.hclFile), 0666); err != nil { - t.Fatalf("WriteFile: %v", err) - } - t.Cleanup(func() { - _ = os.RemoveAll(cfgDir) - }) - - args := []string{cfgDir} + args := []string{tt.packerUserFolder} c := &InitCommand{ - Meta: testMetaFile(t), + Meta: tt.Meta, } c.CoreConfig.Components.PluginConfig.KnownPluginFolders = []string{tt.packerConfigDir} @@ -207,6 +255,12 @@ func TestInitCommand_Run(t *testing.T) { if diff := cmp.Diff(tt.expectedPackerConfigDirHashAfterInit, hash); diff != "" { t.Errorf("unexpected dir hash after init: %s", diff) } + + for i, subTest := range tt.moreTests { + t.Run(fmt.Sprintf("-subtest-%d", i), func(t *testing.T) { + subTest(t, tt) + }) + } }) } } diff --git a/hcl2template/plugin.go b/hcl2template/plugin.go index 17f850cb6..5d3a4c1fc 100644 --- a/hcl2template/plugin.go +++ b/hcl2template/plugin.go @@ -97,7 +97,8 @@ func (cfg *PackerConfig) detectPluginBinaries() hcl.Diagnostics { if err != nil { diags = append(diags, &hcl.Diagnostic{ Severity: hcl.DiagError, - Summary: fmt.Sprintf("Failed to discover plugin %s", pluginRequirement.Identifier.ForDisplay()), + Summary: fmt.Sprintf("Error discovering plugin %s", pluginRequirement.Identifier.ForDisplay()), + Detail: err.Error(), }) continue }