command/init: Fix TestInit_getUpgradePlugins
This test now requires a bit of a different approach because it was previously directly constructing a cache directory but we now use a different directory layout. Rather than manually constructing the new heirarchical directory layout (which would've required a lot more inline code), this introduces a helper function installFakeProviderPackages that installs a fake provider package directly into the local cache directory associated with a Meta object, with the correct directory layout.
This commit is contained in:
parent
c4fb22863c
commit
14701b8300
|
@ -1,6 +1,7 @@
|
||||||
package command
|
package command
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
@ -970,7 +971,7 @@ func TestInit_getUpgradePlugins(t *testing.T) {
|
||||||
"exact": []string{"1.2.3"},
|
"exact": []string{"1.2.3"},
|
||||||
// config requires >= 2.3.3
|
// config requires >= 2.3.3
|
||||||
"greater-than": []string{"2.3.4", "2.3.3", "2.3.0"},
|
"greater-than": []string{"2.3.4", "2.3.3", "2.3.0"},
|
||||||
// config specifies
|
// config specifies > 1.0.0 , < 3.0.0
|
||||||
"between": []string{"3.4.5", "2.3.4", "1.2.3"},
|
"between": []string{"3.4.5", "2.3.4", "1.2.3"},
|
||||||
})
|
})
|
||||||
defer close()
|
defer close()
|
||||||
|
@ -982,20 +983,10 @@ func TestInit_getUpgradePlugins(t *testing.T) {
|
||||||
ProviderSource: providerSource,
|
ProviderSource: providerSource,
|
||||||
}
|
}
|
||||||
|
|
||||||
err := os.MkdirAll(m.pluginDir(), os.ModePerm)
|
installFakeProviderPackages(t, &m, map[string][]string{
|
||||||
if err != nil {
|
"exact": []string{"0.0.1"},
|
||||||
t.Fatal(err)
|
"greater-than": []string{"2.3.3"},
|
||||||
}
|
})
|
||||||
exactUnwanted := fmt.Sprintf(".terraform/plugins/registry.terraform.io/hashicorp/exact/0.0.1/%s", getproviders.CurrentPlatform)
|
|
||||||
err = ioutil.WriteFile(exactUnwanted, []byte{}, os.ModePerm)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
greaterThanUnwanted := fmt.Sprintf(".terraform/plugins/registry.terraform.io/hashicorp/greater-than/2.3.3/%s", getproviders.CurrentPlatform)
|
|
||||||
err = ioutil.WriteFile(greaterThanUnwanted, []byte{}, os.ModePerm)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
c := &InitCommand{
|
c := &InitCommand{
|
||||||
Meta: m,
|
Meta: m,
|
||||||
|
@ -1008,29 +999,100 @@ func TestInit_getUpgradePlugins(t *testing.T) {
|
||||||
t.Fatalf("command did not complete successfully:\n%s", ui.ErrorWriter.String())
|
t.Fatalf("command did not complete successfully:\n%s", ui.ErrorWriter.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
packageInstPath := func(name string, version string, exe bool) string {
|
||||||
|
platform := getproviders.CurrentPlatform
|
||||||
|
if exe {
|
||||||
|
p := fmt.Sprintf(".terraform/plugins/registry.terraform.io/hashicorp/%s/%s/%s/terraform-provider-%s_%s", name, version, platform, name, version)
|
||||||
|
if platform.OS == "windows" {
|
||||||
|
p += ".exe"
|
||||||
|
}
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
return fmt.Sprintf(".terraform/plugins/registry.terraform.io/hashicorp/%s/%s/%s", name, version, platform)
|
||||||
|
}
|
||||||
|
|
||||||
cacheDir := m.providerLocalCacheDir()
|
cacheDir := m.providerLocalCacheDir()
|
||||||
gotPackages := cacheDir.AllAvailablePackages()
|
gotPackages := cacheDir.AllAvailablePackages()
|
||||||
wantPackages := []*providercache.CachedProvider{}
|
wantPackages := map[addrs.Provider][]providercache.CachedProvider{
|
||||||
|
// "between" wasn't previously installed at all, so we installed
|
||||||
/*
|
// the newest available version that matched the version constraints.
|
||||||
wantFilenames := []string{
|
addrs.NewDefaultProvider("between"): {
|
||||||
"lock.json",
|
{
|
||||||
|
Provider: addrs.NewDefaultProvider("between"),
|
||||||
// no "between" because the file in cwd overrides it
|
Version: getproviders.MustParseVersion("2.3.4"),
|
||||||
|
PackageDir: packageInstPath("between", "2.3.4", false),
|
||||||
// The mock PurgeUnused doesn't actually purge anything, so the dir
|
ExecutableFile: packageInstPath("between", "2.3.4", true),
|
||||||
// includes both our old and new versions.
|
},
|
||||||
"terraform-provider-exact_v0.0.1_x4",
|
},
|
||||||
"terraform-provider-exact_v1.2.3_x4",
|
// The existing version of "exact" did not match the version constraints,
|
||||||
"terraform-provider-greater-than_v2.3.3_x4",
|
// so we installed what the configuration selected as well.
|
||||||
"terraform-provider-greater-than_v2.3.4_x4",
|
addrs.NewDefaultProvider("exact"): {
|
||||||
|
{
|
||||||
|
Provider: addrs.NewDefaultProvider("exact"),
|
||||||
|
Version: getproviders.MustParseVersion("1.2.3"),
|
||||||
|
PackageDir: packageInstPath("exact", "1.2.3", false),
|
||||||
|
ExecutableFile: packageInstPath("exact", "1.2.3", true),
|
||||||
|
},
|
||||||
|
// Previous version is still there, but not selected
|
||||||
|
{
|
||||||
|
Provider: addrs.NewDefaultProvider("exact"),
|
||||||
|
Version: getproviders.MustParseVersion("0.0.1"),
|
||||||
|
PackageDir: packageInstPath("exact", "0.0.1", false),
|
||||||
|
ExecutableFile: packageInstPath("exact", "0.0.1", true),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// The existing version of "greater-than" _did_ match the constraints,
|
||||||
|
// but a newer version was available and the user specified
|
||||||
|
// -upgrade and so we upgraded it anyway.
|
||||||
|
addrs.NewDefaultProvider("greater-than"): {
|
||||||
|
{
|
||||||
|
Provider: addrs.NewDefaultProvider("greater-than"),
|
||||||
|
Version: getproviders.MustParseVersion("2.3.4"),
|
||||||
|
PackageDir: packageInstPath("greater-than", "2.3.4", false),
|
||||||
|
ExecutableFile: packageInstPath("greater-than", "2.3.4", true),
|
||||||
|
},
|
||||||
|
// Previous version is still there, but not selected
|
||||||
|
{
|
||||||
|
Provider: addrs.NewDefaultProvider("greater-than"),
|
||||||
|
Version: getproviders.MustParseVersion("2.3.3"),
|
||||||
|
PackageDir: packageInstPath("greater-than", "2.3.3", false),
|
||||||
|
ExecutableFile: packageInstPath("greater-than", "2.3.3", true),
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
if diff := cmp.Diff(wantPackages, gotPackages); diff != "" {
|
if diff := cmp.Diff(wantPackages, gotPackages); diff != "" {
|
||||||
t.Errorf("wrong cache directory contents after upgrade\n%s", diff)
|
t.Errorf("wrong cache directory contents after upgrade\n%s", diff)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inst := m.providerInstaller()
|
||||||
|
gotSelected, err := inst.SelectedPackages()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to get selected packages from installer: %s", err)
|
||||||
|
}
|
||||||
|
wantSelected := map[addrs.Provider]*providercache.CachedProvider{
|
||||||
|
addrs.NewDefaultProvider("between"): {
|
||||||
|
Provider: addrs.NewDefaultProvider("between"),
|
||||||
|
Version: getproviders.MustParseVersion("2.3.4"),
|
||||||
|
PackageDir: packageInstPath("between", "2.3.4", false),
|
||||||
|
ExecutableFile: packageInstPath("between", "2.3.4", true),
|
||||||
|
},
|
||||||
|
addrs.NewDefaultProvider("exact"): {
|
||||||
|
Provider: addrs.NewDefaultProvider("exact"),
|
||||||
|
Version: getproviders.MustParseVersion("1.2.3"),
|
||||||
|
PackageDir: packageInstPath("exact", "1.2.3", false),
|
||||||
|
ExecutableFile: packageInstPath("exact", "1.2.3", true),
|
||||||
|
},
|
||||||
|
addrs.NewDefaultProvider("greater-than"): {
|
||||||
|
Provider: addrs.NewDefaultProvider("greater-than"),
|
||||||
|
Version: getproviders.MustParseVersion("2.3.4"),
|
||||||
|
PackageDir: packageInstPath("greater-than", "2.3.4", false),
|
||||||
|
ExecutableFile: packageInstPath("greater-than", "2.3.4", true),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
if diff := cmp.Diff(wantSelected, gotSelected); diff != "" {
|
||||||
|
t.Errorf("wrong version selections after upgrade\n%s", diff)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestInit_getProviderMissing(t *testing.T) {
|
func TestInit_getProviderMissing(t *testing.T) {
|
||||||
|
@ -1424,3 +1486,56 @@ func newMockProviderSource(t *testing.T, availableProviderVersions map[string][]
|
||||||
|
|
||||||
return getproviders.NewMockSource(packages), close
|
return getproviders.NewMockSource(packages), close
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// installFakeProviderPackage installs a fake package for the given provider
|
||||||
|
// names (interpreted as a "default" provider address) and versions into the
|
||||||
|
// local plugin cache for the given "meta".
|
||||||
|
//
|
||||||
|
// Any test using this must be using testChdir or some similar mechanism to
|
||||||
|
// make sure that it isn't writing directly into a test fixture or source
|
||||||
|
// directory within the codebase.
|
||||||
|
//
|
||||||
|
// If a requested package cannot be installed for some reason, this function
|
||||||
|
// will abort the test using the given testing.T. Therefore if this function
|
||||||
|
// returns the caller can assume that the requested providers have been
|
||||||
|
// installed.
|
||||||
|
func installFakeProviderPackages(t *testing.T, meta *Meta, providerVersions map[string][]string) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
// It can be hard to spot the mistake of forgetting to run testChdir before
|
||||||
|
// modifying the working directory, so we'll use a simple heuristic here
|
||||||
|
// to try to detect that mistake and make a noisy error about it instead.
|
||||||
|
wd, err := os.Getwd()
|
||||||
|
if err == nil {
|
||||||
|
wd = filepath.Clean(wd)
|
||||||
|
// If the directory we're in is named "command" or if we're under a
|
||||||
|
// directory named "testdata" then we'll assume a mistake and generate
|
||||||
|
// an error. This will cause the test to fail but won't block it from
|
||||||
|
// running.
|
||||||
|
if filepath.Base(wd) == "command" || filepath.Base(wd) == "testdata" || strings.Contains(filepath.ToSlash(wd), "/testdata/") {
|
||||||
|
t.Errorf("installFakeProviderPackage may be used only by tests that switch to a temporary working directory, e.g. using testChdir")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cacheDir := meta.providerLocalCacheDir()
|
||||||
|
for name, versions := range providerVersions {
|
||||||
|
addr := addrs.NewDefaultProvider(name)
|
||||||
|
for _, versionStr := range versions {
|
||||||
|
version, err := getproviders.ParseVersion(versionStr)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to parse %q as a version number for %q: %s", versionStr, name, err)
|
||||||
|
}
|
||||||
|
meta, close, err := getproviders.FakeInstallablePackageMeta(addr, version, getproviders.CurrentPlatform)
|
||||||
|
// We're going to install all these fake packages before we return,
|
||||||
|
// so we don't need to preserve them afterwards.
|
||||||
|
defer close()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to prepare fake package for %s %s: %s", name, versionStr, err)
|
||||||
|
}
|
||||||
|
err = cacheDir.InstallPackage(context.Background(), meta)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to install fake package for %s %s: %s", name, versionStr, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue