github.com/hashicorp/packer@v1.14.3/command/plugins_install_test.go (about) 1 // Copyright (c) HashiCorp, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 //go:build amd64 && (darwin || windows || linux) 5 6 package command 7 8 import ( 9 "log" 10 "os" 11 "runtime" 12 "sort" 13 "testing" 14 15 "github.com/google/go-cmp/cmp" 16 "golang.org/x/mod/sumdb/dirhash" 17 ) 18 19 type testCasePluginsInstall struct { 20 name string 21 Meta Meta 22 inPluginFolder map[string]string 23 expectedPackerConfigDirHashBeforeInstall string 24 packerConfigDir string 25 pluginSourceArgs []string 26 want int 27 dirFiles []string 28 expectedPackerConfigDirHashAfterInstall string 29 } 30 31 func TestPluginsInstallCommand_Run(t *testing.T) { 32 33 cfg := &configDirSingleton{map[string]string{}} 34 35 tests := []testCasePluginsInstall{ 36 { 37 name: "already-installed-no-op", 38 Meta: TestMetaFile(t), 39 inPluginFolder: map[string]string{ 40 "github.com/hashicorp/hashicups/packer-plugin-hashicups_v1.0.1_x5.0_darwin_amd64": "1", 41 "github.com/hashicorp/hashicups/packer-plugin-hashicups_v1.0.1_x5.0_darwin_amd64_SHA256SUM": "6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b", 42 "github.com/hashicorp/hashicups/packer-plugin-hashicups_v1.0.1_x5.0_windows_amd64.exe": "1.exe", 43 "github.com/hashicorp/hashicups/packer-plugin-hashicups_v1.0.1_x5.0_windows_amd64.exe_SHA256SUM": "07d8453027192ee0c4120242e6e84e2ca2328b8e0f506e2f818a1a5b82790a0b", 44 "github.com/hashicorp/hashicups/packer-plugin-hashicups_v1.0.1_x5.0_linux_amd64": "1.out", 45 "github.com/hashicorp/hashicups/packer-plugin-hashicups_v1.0.1_x5.0_linux_amd64_SHA256SUM": "59031c50e0dfeedfde2b4e9445754804dce3f29e4efa737eead0ca9b4f5b85a5", 46 }, 47 expectedPackerConfigDirHashBeforeInstall: "h1:sxhWsXwLkxCO1fm86oO2QIg7ImLdfw9pmXa0hKHIeUw=", 48 packerConfigDir: cfg.dir("1_pkr_plugins_config"), 49 pluginSourceArgs: []string{"github.com/hashicorp/hashicups", "v1.0.1"}, 50 want: 0, 51 dirFiles: nil, 52 expectedPackerConfigDirHashAfterInstall: "h1:sxhWsXwLkxCO1fm86oO2QIg7ImLdfw9pmXa0hKHIeUw=", 53 }, 54 { 55 name: "install-newer-version", 56 Meta: TestMetaFile(t), 57 inPluginFolder: map[string]string{ 58 "github.com/hashicorp/hashicups/packer-plugin-hashicups_v1.0.1_x5.0_darwin_amd64": "1", 59 "github.com/hashicorp/hashicups/packer-plugin-hashicups_v1.0.1_x5.0_darwin_amd64_SHA256SUM": "6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b", 60 "github.com/hashicorp/hashicups/packer-plugin-hashicups_v1.0.1_x5.0_windows_amd64.exe": "1.exe", 61 "github.com/hashicorp/hashicups/packer-plugin-hashicups_v1.0.1_x5.0_windows_amd64.exe_SHA256SUM": "07d8453027192ee0c4120242e6e84e2ca2328b8e0f506e2f818a1a5b82790a0b", 62 "github.com/hashicorp/hashicups/packer-plugin-hashicups_v1.0.1_x5.0_linux_amd64": "1.out", 63 "github.com/hashicorp/hashicups/packer-plugin-hashicups_v1.0.1_x5.0_linux_amd64_SHA256SUM": "59031c50e0dfeedfde2b4e9445754804dce3f29e4efa737eead0ca9b4f5b85a5", 64 }, 65 expectedPackerConfigDirHashBeforeInstall: "h1:sxhWsXwLkxCO1fm86oO2QIg7ImLdfw9pmXa0hKHIeUw=", 66 packerConfigDir: cfg.dir("2_pkr_plugins_config"), 67 pluginSourceArgs: []string{"github.com/hashicorp/hashicups", "v1.0.2"}, 68 want: 0, 69 dirFiles: []string{ 70 "github.com/hashicorp/hashicups/packer-plugin-hashicups_v1.0.1_x5.0_darwin_amd64", 71 "github.com/hashicorp/hashicups/packer-plugin-hashicups_v1.0.1_x5.0_darwin_amd64_SHA256SUM", 72 "github.com/hashicorp/hashicups/packer-plugin-hashicups_v1.0.1_x5.0_linux_amd64", 73 "github.com/hashicorp/hashicups/packer-plugin-hashicups_v1.0.1_x5.0_linux_amd64_SHA256SUM", 74 "github.com/hashicorp/hashicups/packer-plugin-hashicups_v1.0.1_x5.0_windows_amd64.exe", 75 "github.com/hashicorp/hashicups/packer-plugin-hashicups_v1.0.1_x5.0_windows_amd64.exe_SHA256SUM", 76 map[string]string{ 77 "darwin": "github.com/hashicorp/hashicups/packer-plugin-hashicups_v1.0.2_x5.0_darwin_amd64_SHA256SUM", 78 "linux": "github.com/hashicorp/hashicups/packer-plugin-hashicups_v1.0.2_x5.0_linux_amd64_SHA256SUM", 79 "windows": "github.com/hashicorp/hashicups/packer-plugin-hashicups_v1.0.2_x5.0_windows_amd64.exe_SHA256SUM", 80 }[runtime.GOOS], 81 map[string]string{ 82 "darwin": "github.com/hashicorp/hashicups/packer-plugin-hashicups_v1.0.2_x5.0_darwin_amd64", 83 "linux": "github.com/hashicorp/hashicups/packer-plugin-hashicups_v1.0.2_x5.0_linux_amd64", 84 "windows": "github.com/hashicorp/hashicups/packer-plugin-hashicups_v1.0.2_x5.0_windows_amd64.exe", 85 }[runtime.GOOS], 86 }, 87 expectedPackerConfigDirHashAfterInstall: map[string]string{ 88 "darwin": "h1:itQ7rZfZarDHmnajkzfxBVMxZ0wBou4I6FNX/ysHggA=", 89 "linux": "h1:+zgZKpRpVofVgjny13tZNonPBcNNxWF741iYdTE9UCg=", 90 "windows": "h1:scuTEDpGEWJ0LaKL7ETZ8o7wdW6dJUzV+eg/2shQ+tQ=", 91 }[runtime.GOOS], 92 }, 93 { 94 name: "unsupported-non-github-source-address", 95 Meta: TestMetaFile(t), 96 inPluginFolder: nil, 97 expectedPackerConfigDirHashBeforeInstall: "h1:47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=", 98 packerConfigDir: cfg.dir("3_pkr_plugins_config"), 99 pluginSourceArgs: []string{"example.com/hashicorp/hashicups", "v0.2.19"}, 100 want: 1, 101 dirFiles: nil, 102 expectedPackerConfigDirHashAfterInstall: "h1:47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=", 103 }, 104 { 105 name: "multiple-source-addresses-provided", 106 Meta: TestMetaFile(t), 107 inPluginFolder: nil, 108 expectedPackerConfigDirHashBeforeInstall: "h1:47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=", 109 packerConfigDir: cfg.dir("4_pkr_plugins_config"), 110 pluginSourceArgs: []string{"github.com/hashicorp/hashicups", "v0.2.18", "github.com/hashicorp/hashicups", "v0.2.19"}, 111 want: 1, 112 dirFiles: nil, 113 expectedPackerConfigDirHashAfterInstall: "h1:47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=", 114 }, 115 { 116 name: "no-source-address-provided", 117 Meta: TestMetaFile(t), 118 inPluginFolder: nil, 119 expectedPackerConfigDirHashBeforeInstall: "h1:47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=", 120 packerConfigDir: cfg.dir("5_pkr_plugins_config"), 121 pluginSourceArgs: []string{}, 122 want: 1, 123 dirFiles: nil, 124 expectedPackerConfigDirHashAfterInstall: "h1:47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=", 125 }, 126 } 127 128 for _, tt := range tests { 129 t.Run(tt.name, func(t *testing.T) { 130 log.Printf("starting %s", tt.name) 131 log.Printf("%#v", tt) 132 t.Cleanup(func() { 133 _ = os.RemoveAll(tt.packerConfigDir) 134 }) 135 t.Setenv("PACKER_CONFIG_DIR", tt.packerConfigDir) 136 createFiles(tt.packerConfigDir, tt.inPluginFolder) 137 138 hash, err := dirhash.HashDir(tt.packerConfigDir, "", dirhash.DefaultHash) 139 if err != nil { 140 t.Fatalf("HashDir: %v", err) 141 } 142 if diff := cmp.Diff(tt.expectedPackerConfigDirHashBeforeInstall, hash); diff != "" { 143 t.Errorf("unexpected dir hash before plugins install: +found -expected %s", diff) 144 } 145 146 c := &PluginsInstallCommand{ 147 Meta: tt.Meta, 148 } 149 150 if err := c.CoreConfig.Components.PluginConfig.Discover(); err != nil { 151 t.Fatalf("Failed to discover plugins: %s", err) 152 } 153 154 c.CoreConfig.Components.PluginConfig.PluginDirectory = tt.packerConfigDir 155 if got := c.Run(tt.pluginSourceArgs); got != tt.want { 156 t.Errorf("PluginsInstallCommand.Run() = %v, want %v", got, tt.want) 157 } 158 159 if tt.dirFiles != nil { 160 dirFiles, err := dirhash.DirFiles(tt.packerConfigDir, "") 161 if err != nil { 162 t.Fatalf("DirFiles: %v", err) 163 } 164 sort.Strings(tt.dirFiles) 165 sort.Strings(dirFiles) 166 if diff := cmp.Diff(tt.dirFiles, dirFiles); diff != "" { 167 t.Errorf("found files differ: %v", diff) 168 } 169 } 170 171 hash, err = dirhash.HashDir(tt.packerConfigDir, "", dirhash.DefaultHash) 172 if err != nil { 173 t.Fatalf("HashDir: %v", err) 174 } 175 if diff := cmp.Diff(tt.expectedPackerConfigDirHashAfterInstall, hash); diff != "" { 176 t.Errorf("unexpected dir hash after plugins install: %s", diff) 177 } 178 }) 179 } 180 }