command: Fix TestInit_pluginDirProviders and _pluginDirProvidersDoesNotGet

Both of these are attempting to test -plugin-dir, which means we need some
additional help to populate some suitable directories for -plugin-dir to
refer to. The new installFakeProviderPackagesElsewhere helper generalizes
the earlier installFakeProviderPackages to allow installing fake provider
packages to an arbitrary other directory.
This commit is contained in:
Martin Atkins 2020-04-01 10:46:38 -07:00
parent ff55e1a1cd
commit add7006de6
1 changed files with 91 additions and 23 deletions

View File

@ -1315,16 +1315,19 @@ func TestInit_pluginDirProviders(t *testing.T) {
}
}
// add some dummy providers in our plugin dirs
for i, name := range []string{
"terraform-provider-exact_v1.2.3_x4",
"terraform-provider-greater-than_v2.3.4_x4",
"terraform-provider-between_v2.3.4_x4",
// We'll put some providers in our plugin dirs. To do this, we'll pretend
// for a moment that they are provider cache directories just because that
// allows us to lean on our existing test helper functions to do this.
for i, def := range [][]string{
[]string{"exact", "1.2.3"},
[]string{"greater-than", "2.3.4"},
[]string{"between", "2.3.4"},
} {
if err := ioutil.WriteFile(filepath.Join(pluginPath[i], name), []byte("test bin"), 0755); err != nil {
t.Fatal(err)
}
name, version := def[0], def[1]
dir := providercache.NewDir(pluginPath[i])
installFakeProviderPackagesElsewhere(t, dir, map[string][]string{
name: []string{version},
})
}
args := []string{
@ -1335,6 +1338,41 @@ func TestInit_pluginDirProviders(t *testing.T) {
if code := c.Run(args); code != 0 {
t.Fatalf("bad: \n%s", ui.ErrorWriter)
}
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: expectedPackageInstallPath("between", "2.3.4", false),
ExecutableFile: expectedPackageInstallPath("between", "2.3.4", true),
},
addrs.NewDefaultProvider("exact"): {
Provider: addrs.NewDefaultProvider("exact"),
Version: getproviders.MustParseVersion("1.2.3"),
PackageDir: expectedPackageInstallPath("exact", "1.2.3", false),
ExecutableFile: expectedPackageInstallPath("exact", "1.2.3", true),
},
addrs.NewDefaultProvider("greater-than"): {
Provider: addrs.NewDefaultProvider("greater-than"),
Version: getproviders.MustParseVersion("2.3.4"),
PackageDir: expectedPackageInstallPath("greater-than", "2.3.4", false),
ExecutableFile: expectedPackageInstallPath("greater-than", "2.3.4", true),
},
}
if diff := cmp.Diff(wantSelected, gotSelected); diff != "" {
t.Errorf("wrong version selections after upgrade\n%s", diff)
}
// -plugin-dir overrides the normal provider source, so it should not have
// seen any calls at all.
if calls := providerSource.CallLog(); len(calls) > 0 {
t.Errorf("unexpected provider source calls (want none)\n%s", spew.Sdump(calls))
}
}
// Test user-supplied -plugin-dir doesn't allow auto-install
@ -1344,11 +1382,15 @@ func TestInit_pluginDirProvidersDoesNotGet(t *testing.T) {
defer os.RemoveAll(td)
defer testChdir(t, td)()
// An empty provider source
providerSource, close := newMockProviderSource(t, nil)
// Our provider source has a suitable package for "between" available,
// but we should ignore it because -plugin-dir is set and thus this
// source is temporarily overridden during install.
providerSource, close := newMockProviderSource(t, map[string][]string{
"between": []string{"2.3.4"},
})
defer close()
ui := new(cli.MockUi)
ui := cli.NewMockUi()
m := Meta{
testingOverrides: metaOverridesForProvider(testProvider()),
Ui: ui,
@ -1367,15 +1409,18 @@ func TestInit_pluginDirProvidersDoesNotGet(t *testing.T) {
}
}
// add some dummy providers in our plugin dirs
for i, name := range []string{
"terraform-provider-exact_v1.2.3_x4",
"terraform-provider-greater-than_v2.3.4_x4",
// We'll put some providers in our plugin dirs. To do this, we'll pretend
// for a moment that they are provider cache directories just because that
// allows us to lean on our existing test helper functions to do this.
for i, def := range [][]string{
[]string{"exact", "1.2.3"},
[]string{"greater-than", "2.3.4"},
} {
if err := ioutil.WriteFile(filepath.Join(pluginPath[i], name), []byte("test bin"), 0755); err != nil {
t.Fatal(err)
}
name, version := def[0], def[1]
dir := providercache.NewDir(pluginPath[i])
installFakeProviderPackagesElsewhere(t, dir, map[string][]string{
name: []string{version},
})
}
args := []string{
@ -1384,7 +1429,21 @@ func TestInit_pluginDirProvidersDoesNotGet(t *testing.T) {
}
if code := c.Run(args); code == 0 {
// should have been an error
t.Fatalf("bad: \n%s", ui.OutputWriter)
t.Fatalf("succeeded; want error\nstdout:\n%s\nstderr\n%s", ui.OutputWriter, ui.ErrorWriter)
}
// The error output should mention the "between" provider but should not
// mention either the "exact" or "greater-than" provider, because the
// latter two are available via the -plugin-dir directories.
errStr := ui.ErrorWriter.String()
if subStr := "hashicorp/between"; !strings.Contains(errStr, subStr) {
t.Errorf("error output should mention the 'between' provider\nwant substr: %s\ngot:\n%s", subStr, errStr)
}
if subStr := "hashicorp/exact"; strings.Contains(errStr, subStr) {
t.Errorf("error output should not mention the 'exact' provider\ndo not want substr: %s\ngot:\n%s", subStr, errStr)
}
if subStr := "hashicorp/greater-than"; strings.Contains(errStr, subStr) {
t.Errorf("error output should not mention the 'greater-than' provider\ndo not want substr: %s\ngot:\n%s", subStr, errStr)
}
if calls := providerSource.CallLog(); len(calls) > 0 {
@ -1504,7 +1563,7 @@ func newMockProviderSource(t *testing.T, availableProviderVersions map[string][]
return getproviders.NewMockSource(packages), close
}
// installFakeProviderPackage installs a fake package for the given provider
// installFakeProviderPackages 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".
//
@ -1519,6 +1578,16 @@ func newMockProviderSource(t *testing.T, availableProviderVersions map[string][]
func installFakeProviderPackages(t *testing.T, meta *Meta, providerVersions map[string][]string) {
t.Helper()
cacheDir := meta.providerLocalCacheDir()
installFakeProviderPackagesElsewhere(t, cacheDir, providerVersions)
}
// installFakeProviderPackagesElsewhere is a variant of installFakeProviderPackages
// that will install packages into the given provider cache directory, rather
// than forcing the use of the local cache of the current "Meta".
func installFakeProviderPackagesElsewhere(t *testing.T, cacheDir *providercache.Dir, 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.
@ -1534,7 +1603,6 @@ func installFakeProviderPackages(t *testing.T, meta *Meta, providerVersions map[
}
}
cacheDir := meta.providerLocalCacheDir()
for name, versions := range providerVersions {
addr := addrs.NewDefaultProvider(name)
for _, versionStr := range versions {