mirror of
https://github.com/opentofu/opentofu.git
synced 2025-01-18 12:42:58 -06:00
8e87ccb689
Instead of searching the installed provider package directory for a binary as we install it, we can lazily detect the executable as it is required. Doing so allows us to separately report an invalid unpacked package, giving the user more actionable error messages.
114 lines
3.7 KiB
Go
114 lines
3.7 KiB
Go
package providercache
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/hashicorp/terraform/addrs"
|
|
"github.com/hashicorp/terraform/internal/getproviders"
|
|
)
|
|
|
|
func TestCachedProviderHash(t *testing.T) {
|
|
cp := &CachedProvider{
|
|
Provider: addrs.NewProvider(
|
|
addrs.DefaultRegistryHost,
|
|
"hashicorp", "null",
|
|
),
|
|
Version: getproviders.MustParseVersion("2.0.0"),
|
|
|
|
PackageDir: "testdata/cachedir/registry.terraform.io/hashicorp/null/2.0.0/darwin_amd64",
|
|
}
|
|
|
|
want := "h1:qjsREM4DqEWECD43FcPqddZ9oxCG+IaMTxvWPciS05g="
|
|
got, err := cp.Hash()
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %s", err)
|
|
}
|
|
|
|
if got != want {
|
|
t.Errorf("wrong Hash result\ngot: %s\nwant: %s", got, want)
|
|
}
|
|
|
|
gotMatches, err := cp.MatchesHash(want)
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %s", err)
|
|
}
|
|
if wantMatches := true; gotMatches != wantMatches {
|
|
t.Errorf("wrong MatchesHash result\ngot: %#v\nwant: %#v", gotMatches, wantMatches)
|
|
}
|
|
|
|
// The windows build has a different hash because its executable filename
|
|
// has a .exe suffix, but the darwin build (hashed above) does not.
|
|
cp2 := &CachedProvider{
|
|
Provider: addrs.NewProvider(
|
|
addrs.DefaultRegistryHost,
|
|
"hashicorp", "null",
|
|
),
|
|
Version: getproviders.MustParseVersion("2.0.0"),
|
|
|
|
PackageDir: "testdata/cachedir/registry.terraform.io/hashicorp/null/2.0.0/windows_amd64",
|
|
}
|
|
gotMatches, err = cp2.MatchesHash(want)
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %s", err)
|
|
}
|
|
if wantMatches := false; gotMatches != wantMatches {
|
|
t.Errorf("wrong MatchesHash result for other package\ngot: %#v\nwant: %#v", gotMatches, wantMatches)
|
|
}
|
|
|
|
}
|
|
|
|
func TestExecutableFile(t *testing.T) {
|
|
testCases := map[string]struct {
|
|
cp *CachedProvider
|
|
file string
|
|
err string
|
|
}{
|
|
"linux": {
|
|
cp: &CachedProvider{
|
|
Provider: addrs.NewProvider(addrs.DefaultRegistryHost, "hashicorp", "null"),
|
|
Version: getproviders.MustParseVersion("2.0.0"),
|
|
PackageDir: "testdata/cachedir/registry.terraform.io/hashicorp/null/2.0.0/linux_amd64",
|
|
},
|
|
file: "testdata/cachedir/registry.terraform.io/hashicorp/null/2.0.0/linux_amd64/terraform-provider-null",
|
|
},
|
|
"windows": {
|
|
cp: &CachedProvider{
|
|
Provider: addrs.NewProvider(addrs.DefaultRegistryHost, "hashicorp", "null"),
|
|
Version: getproviders.MustParseVersion("2.0.0"),
|
|
PackageDir: "testdata/cachedir/registry.terraform.io/hashicorp/null/2.0.0/windows_amd64",
|
|
},
|
|
file: "testdata/cachedir/registry.terraform.io/hashicorp/null/2.0.0/windows_amd64/terraform-provider-null.exe",
|
|
},
|
|
"missing-executable": {
|
|
cp: &CachedProvider{
|
|
Provider: addrs.NewProvider(addrs.DefaultRegistryHost, "missing", "executable"),
|
|
Version: getproviders.MustParseVersion("2.0.0"),
|
|
PackageDir: "testdata/cachedir/registry.terraform.io/missing/executable/2.0.0/linux_amd64",
|
|
},
|
|
err: "could not find executable file starting with terraform-provider-executable",
|
|
},
|
|
"missing-dir": {
|
|
cp: &CachedProvider{
|
|
Provider: addrs.NewProvider(addrs.DefaultRegistryHost, "missing", "packagedir"),
|
|
Version: getproviders.MustParseVersion("2.0.0"),
|
|
PackageDir: "testdata/cachedir/registry.terraform.io/missing/packagedir/2.0.0/linux_amd64",
|
|
},
|
|
err: "could not read package directory: open testdata/cachedir/registry.terraform.io/missing/packagedir/2.0.0/linux_amd64: no such file or directory",
|
|
},
|
|
}
|
|
|
|
for name, tc := range testCases {
|
|
t.Run(name, func(t *testing.T) {
|
|
file, err := tc.cp.ExecutableFile()
|
|
if file != tc.file {
|
|
t.Errorf("wrong file\n got: %q\nwant: %q", file, tc.file)
|
|
}
|
|
if err == nil && tc.err != "" {
|
|
t.Fatalf("no error returned, want: %q", tc.err)
|
|
} else if err != nil && err.Error() != tc.err {
|
|
t.Errorf("wrong error\n got: %q\nwant: %q", err, tc.err)
|
|
}
|
|
})
|
|
}
|
|
}
|