| // Copyright IBM Corp. 2014, 2026 | |
| // SPDX-License-Identifier: BUSL-1.1 | |
| package providercache | |
| import ( | |
| "testing" | |
| "github.com/apparentlymart/go-versions/versions" | |
| "github.com/google/go-cmp/cmp" | |
| "github.com/hashicorp/terraform/internal/addrs" | |
| "github.com/hashicorp/terraform/internal/getproviders" | |
| ) | |
| func TestDirReading(t *testing.T) { | |
| testDir := "testdata/cachedir" | |
| // We'll force using particular platforms for unit testing purposes, | |
| // so that we'll get consistent results on all platforms. | |
| windowsPlatform := getproviders.Platform{ // only null 2.0.0 is cached | |
| OS: "windows", | |
| Arch: "amd64", | |
| } | |
| linuxPlatform := getproviders.Platform{ // various provider versions are cached | |
| OS: "linux", | |
| Arch: "amd64", | |
| } | |
| nullProvider := addrs.NewProvider( | |
| addrs.DefaultProviderRegistryHost, "hashicorp", "null", | |
| ) | |
| randomProvider := addrs.NewProvider( | |
| addrs.DefaultProviderRegistryHost, "hashicorp", "random", | |
| ) | |
| randomBetaProvider := addrs.NewProvider( | |
| addrs.DefaultProviderRegistryHost, "hashicorp", "random-beta", | |
| ) | |
| nonExistProvider := addrs.NewProvider( | |
| addrs.DefaultProviderRegistryHost, "bloop", "nonexist", | |
| ) | |
| legacyProvider := addrs.NewLegacyProvider("legacy") | |
| missingExecutableProvider := addrs.NewProvider( | |
| addrs.DefaultProviderRegistryHost, "missing", "executable", | |
| ) | |
| t.Run("ProviderLatestVersion", func(t *testing.T) { | |
| t.Run("exists", func(t *testing.T) { | |
| dir := NewDirWithPlatform(testDir, windowsPlatform) | |
| got := dir.ProviderLatestVersion(nullProvider) | |
| want := &CachedProvider{ | |
| Provider: nullProvider, | |
| // We want 2.0.0 rather than 2.1.0 because the 2.1.0 package is | |
| // still packed and thus not considered to be a cache member. | |
| Version: versions.MustParseVersion("2.0.0"), | |
| PackageDir: "testdata/cachedir/registry.terraform.io/hashicorp/null/2.0.0/windows_amd64", | |
| } | |
| if diff := cmp.Diff(want, got); diff != "" { | |
| t.Errorf("wrong result\n%s", diff) | |
| } | |
| }) | |
| t.Run("no package for current platform", func(t *testing.T) { | |
| dir := NewDirWithPlatform(testDir, windowsPlatform) | |
| // random provider is only cached for linux_amd64 in our fixtures dir | |
| got := dir.ProviderLatestVersion(randomProvider) | |
| var want *CachedProvider | |
| if diff := cmp.Diff(want, got); diff != "" { | |
| t.Errorf("wrong result\n%s", diff) | |
| } | |
| }) | |
| t.Run("no versions available at all", func(t *testing.T) { | |
| dir := NewDirWithPlatform(testDir, windowsPlatform) | |
| // nonexist provider is not present in our fixtures dir at all | |
| got := dir.ProviderLatestVersion(nonExistProvider) | |
| var want *CachedProvider | |
| if diff := cmp.Diff(want, got); diff != "" { | |
| t.Errorf("wrong result\n%s", diff) | |
| } | |
| }) | |
| }) | |
| t.Run("ProviderVersion", func(t *testing.T) { | |
| t.Run("exists", func(t *testing.T) { | |
| dir := NewDirWithPlatform(testDir, windowsPlatform) | |
| got := dir.ProviderVersion(nullProvider, versions.MustParseVersion("2.0.0")) | |
| want := &CachedProvider{ | |
| Provider: nullProvider, | |
| Version: versions.MustParseVersion("2.0.0"), | |
| PackageDir: "testdata/cachedir/registry.terraform.io/hashicorp/null/2.0.0/windows_amd64", | |
| } | |
| if diff := cmp.Diff(want, got); diff != "" { | |
| t.Errorf("wrong result\n%s", diff) | |
| } | |
| }) | |
| t.Run("specified version is not cached", func(t *testing.T) { | |
| dir := NewDirWithPlatform(testDir, windowsPlatform) | |
| // there is no v5.0.0 package in our fixtures dir | |
| got := dir.ProviderVersion(nullProvider, versions.MustParseVersion("5.0.0")) | |
| var want *CachedProvider | |
| if diff := cmp.Diff(want, got); diff != "" { | |
| t.Errorf("wrong result\n%s", diff) | |
| } | |
| }) | |
| t.Run("no package for current platform", func(t *testing.T) { | |
| dir := NewDirWithPlatform(testDir, windowsPlatform) | |
| // random provider 1.2.0 is only cached for linux_amd64 in our fixtures dir | |
| got := dir.ProviderVersion(randomProvider, versions.MustParseVersion("1.2.0")) | |
| var want *CachedProvider | |
| if diff := cmp.Diff(want, got); diff != "" { | |
| t.Errorf("wrong result\n%s", diff) | |
| } | |
| }) | |
| t.Run("no versions available at all", func(t *testing.T) { | |
| dir := NewDirWithPlatform(testDir, windowsPlatform) | |
| // nonexist provider is not present in our fixtures dir at all | |
| got := dir.ProviderVersion(nonExistProvider, versions.MustParseVersion("1.0.0")) | |
| var want *CachedProvider | |
| if diff := cmp.Diff(want, got); diff != "" { | |
| t.Errorf("wrong result\n%s", diff) | |
| } | |
| }) | |
| }) | |
| t.Run("AllAvailablePackages", func(t *testing.T) { | |
| dir := NewDirWithPlatform(testDir, linuxPlatform) | |
| got := dir.AllAvailablePackages() | |
| want := map[addrs.Provider][]CachedProvider{ | |
| legacyProvider: { | |
| { | |
| Provider: legacyProvider, | |
| Version: versions.MustParseVersion("1.0.0"), | |
| PackageDir: "testdata/cachedir/registry.terraform.io/-/legacy/1.0.0/linux_amd64", | |
| }, | |
| }, | |
| nullProvider: { | |
| { | |
| Provider: nullProvider, | |
| Version: versions.MustParseVersion("2.0.0"), | |
| PackageDir: "testdata/cachedir/registry.terraform.io/hashicorp/null/2.0.0/linux_amd64", | |
| }, | |
| }, | |
| randomProvider: { | |
| { | |
| Provider: randomProvider, | |
| Version: versions.MustParseVersion("1.2.0"), | |
| PackageDir: "testdata/cachedir/registry.terraform.io/hashicorp/random/1.2.0/linux_amd64", | |
| }, | |
| }, | |
| randomBetaProvider: { | |
| { | |
| Provider: randomBetaProvider, | |
| Version: versions.MustParseVersion("1.2.0"), | |
| PackageDir: "testdata/cachedir/registry.terraform.io/hashicorp/random-beta/1.2.0/linux_amd64", | |
| }, | |
| }, | |
| missingExecutableProvider: { | |
| { | |
| Provider: missingExecutableProvider, | |
| Version: versions.MustParseVersion("2.0.0"), | |
| PackageDir: "testdata/cachedir/registry.terraform.io/missing/executable/2.0.0/linux_amd64", | |
| }, | |
| }, | |
| } | |
| if diff := cmp.Diff(want, got); diff != "" { | |
| t.Errorf("wrong result\n%s", diff) | |
| } | |
| }) | |
| } |