command/init: Fix TestInit_providerSource

This test is focused on making sure that the required_providers syntax
is working, so the rewritten version does not include any special handling
of pre-installed packages or "vendored" packages. Pre-installed plugins
are tested in other tests such as TestInit_getUpgradePlugins.
This commit is contained in:
Martin Atkins 2020-03-31 17:31:03 -07:00
parent 14701b8300
commit c81eebe0ac
1 changed files with 95 additions and 51 deletions

View File

@ -908,14 +908,15 @@ func TestInit_findVendoredProviders(t *testing.T) {
func TestInit_providerSource(t *testing.T) {
// Create a temporary working directory that is empty
td := tempDir(t)
configDirName := "init-required-providers"
copy.CopyDir(testFixturePath(configDirName), filepath.Join(td, configDirName))
defer os.RemoveAll(td)
defer testChdir(t, td)()
// An empty provider source
providerSource, close := newMockProviderSource(t, nil)
providerSource, close := newMockProviderSource(t, map[string][]string{
"test": []string{"1.2.3", "1.2.4"},
"source": []string{"1.2.2", "1.2.3", "1.2.1"},
})
defer close()
ui := new(cli.MockUi)
@ -929,26 +930,6 @@ func TestInit_providerSource(t *testing.T) {
Meta: m,
}
// make our plugin paths
if err := os.MkdirAll(c.pluginDir(), 0755); err != nil {
t.Fatal(err)
}
if err := os.MkdirAll(DefaultPluginVendorDir, 0755); err != nil {
t.Fatal(err)
}
// add some dummy providers
// the auto plugin directory
testPath := filepath.Join(c.pluginDir(), "terraform-provider-test_v1.2.3_x4")
if err := ioutil.WriteFile(testPath, []byte("test bin"), 0755); err != nil {
t.Fatal(err)
}
// the vendor path
sourcePath := filepath.Join(DefaultPluginVendorDir, "terraform-provider-source_v1.2.3_x4")
if err := ioutil.WriteFile(sourcePath, []byte("test bin"), 0755); err != nil {
t.Fatal(err)
}
args := []string{configDirName}
if code := c.Run(args); code != 0 {
@ -957,6 +938,54 @@ func TestInit_providerSource(t *testing.T) {
if strings.Contains(ui.OutputWriter.String(), "Terraform has initialized, but configuration upgrades may be needed") {
t.Fatalf("unexpected \"configuration upgrade\" warning in output")
}
cacheDir := m.providerLocalCacheDir()
gotPackages := cacheDir.AllAvailablePackages()
wantPackages := map[addrs.Provider][]providercache.CachedProvider{
addrs.NewDefaultProvider("test"): {
{
Provider: addrs.NewDefaultProvider("test"),
Version: getproviders.MustParseVersion("1.2.3"),
PackageDir: expectedPackageInstallPath("test", "1.2.3", false),
ExecutableFile: expectedPackageInstallPath("test", "1.2.3", true),
},
},
addrs.NewDefaultProvider("source"): {
{
Provider: addrs.NewDefaultProvider("source"),
Version: getproviders.MustParseVersion("1.2.3"),
PackageDir: expectedPackageInstallPath("source", "1.2.3", false),
ExecutableFile: expectedPackageInstallPath("source", "1.2.3", true),
},
},
}
if diff := cmp.Diff(wantPackages, gotPackages); 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("test"): {
Provider: addrs.NewDefaultProvider("test"),
Version: getproviders.MustParseVersion("1.2.3"),
PackageDir: expectedPackageInstallPath("test", "1.2.3", false),
ExecutableFile: expectedPackageInstallPath("test", "1.2.3", true),
},
addrs.NewDefaultProvider("source"): {
Provider: addrs.NewDefaultProvider("source"),
Version: getproviders.MustParseVersion("1.2.3"),
PackageDir: expectedPackageInstallPath("source", "1.2.3", false),
ExecutableFile: expectedPackageInstallPath("source", "1.2.3", true),
},
}
if diff := cmp.Diff(wantSelected, gotSelected); diff != "" {
t.Errorf("wrong version selections after upgrade\n%s", diff)
}
}
func TestInit_getUpgradePlugins(t *testing.T) {
@ -999,18 +1028,6 @@ func TestInit_getUpgradePlugins(t *testing.T) {
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()
gotPackages := cacheDir.AllAvailablePackages()
wantPackages := map[addrs.Provider][]providercache.CachedProvider{
@ -1020,8 +1037,8 @@ func TestInit_getUpgradePlugins(t *testing.T) {
{
Provider: addrs.NewDefaultProvider("between"),
Version: getproviders.MustParseVersion("2.3.4"),
PackageDir: packageInstPath("between", "2.3.4", false),
ExecutableFile: packageInstPath("between", "2.3.4", true),
PackageDir: expectedPackageInstallPath("between", "2.3.4", false),
ExecutableFile: expectedPackageInstallPath("between", "2.3.4", true),
},
},
// The existing version of "exact" did not match the version constraints,
@ -1030,15 +1047,15 @@ func TestInit_getUpgradePlugins(t *testing.T) {
{
Provider: addrs.NewDefaultProvider("exact"),
Version: getproviders.MustParseVersion("1.2.3"),
PackageDir: packageInstPath("exact", "1.2.3", false),
ExecutableFile: packageInstPath("exact", "1.2.3", true),
PackageDir: expectedPackageInstallPath("exact", "1.2.3", false),
ExecutableFile: expectedPackageInstallPath("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),
PackageDir: expectedPackageInstallPath("exact", "0.0.1", false),
ExecutableFile: expectedPackageInstallPath("exact", "0.0.1", true),
},
},
// The existing version of "greater-than" _did_ match the constraints,
@ -1048,15 +1065,15 @@ func TestInit_getUpgradePlugins(t *testing.T) {
{
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),
PackageDir: expectedPackageInstallPath("greater-than", "2.3.4", false),
ExecutableFile: expectedPackageInstallPath("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),
PackageDir: expectedPackageInstallPath("greater-than", "2.3.3", false),
ExecutableFile: expectedPackageInstallPath("greater-than", "2.3.3", true),
},
},
}
@ -1073,20 +1090,20 @@ func TestInit_getUpgradePlugins(t *testing.T) {
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),
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: packageInstPath("exact", "1.2.3", false),
ExecutableFile: packageInstPath("exact", "1.2.3", true),
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: packageInstPath("greater-than", "2.3.4", false),
ExecutableFile: packageInstPath("greater-than", "2.3.4", true),
PackageDir: expectedPackageInstallPath("greater-than", "2.3.4", false),
ExecutableFile: expectedPackageInstallPath("greater-than", "2.3.4", true),
},
}
if diff := cmp.Diff(wantSelected, gotSelected); diff != "" {
@ -1539,3 +1556,30 @@ func installFakeProviderPackages(t *testing.T, meta *Meta, providerVersions map[
}
}
}
// expectedPackageInstallPath is a companion to installFakeProviderPackages
// that returns the path where the provider with the given name and version
// would be installed and, relatedly, where the installer will expect to
// find an already-installed version.
//
// Just as with installFakeProviderPackages, this function is a shortcut helper
// for "default-namespaced" providers as we commonly use in tests. If you need
// more control over the provider addresses, use functions of the underlying
// getproviders and providercache packages instead.
//
// The result always uses forward slashes, even on Windows, for consistency
// with how the getproviders and providercache packages build paths.
func expectedPackageInstallPath(name, version string, exe bool) string {
platform := getproviders.CurrentPlatform
baseDir := ".terraform/plugins"
if exe {
p := fmt.Sprintf("registry.terraform.io/hashicorp/%s/%s/%s/terraform-provider-%s_%s", name, version, platform, name, version)
if platform.OS == "windows" {
p += ".exe"
}
return filepath.ToSlash(filepath.Join(baseDir, p))
}
return filepath.ToSlash(filepath.Join(
baseDir, fmt.Sprintf("registry.terraform.io/hashicorp/%s/%s/%s", name, version, platform),
))
}