| package providercache |
| |
| import ( |
| "context" |
| "path/filepath" |
| "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 TestInstallPackage(t *testing.T) { |
| tmpDirPath, err := filepath.EvalSymlinks(t.TempDir()) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| linuxPlatform := getproviders.Platform{ |
| OS: "linux", |
| Arch: "amd64", |
| } |
| nullProvider := addrs.NewProvider( |
| addrs.DefaultProviderRegistryHost, "hashicorp", "null", |
| ) |
| |
| tmpDir := NewDirWithPlatform(tmpDirPath, linuxPlatform) |
| |
| meta := getproviders.PackageMeta{ |
| Provider: nullProvider, |
| Version: versions.MustParseVersion("2.1.0"), |
| |
| ProtocolVersions: getproviders.VersionList{versions.MustParseVersion("5.0.0")}, |
| TargetPlatform: linuxPlatform, |
| |
| Filename: "terraform-provider-null_2.1.0_linux_amd64.zip", |
| Location: getproviders.PackageLocalArchive("testdata/terraform-provider-null_2.1.0_linux_amd64.zip"), |
| } |
| |
| result, err := tmpDir.InstallPackage(context.TODO(), meta, nil) |
| if err != nil { |
| t.Fatalf("InstallPackage failed: %s", err) |
| } |
| if result != nil { |
| t.Errorf("unexpected result %#v, wanted nil", result) |
| } |
| |
| // Now we should see the same version reflected in the temporary directory. |
| got := tmpDir.AllAvailablePackages() |
| want := map[addrs.Provider][]CachedProvider{ |
| nullProvider: { |
| CachedProvider{ |
| Provider: nullProvider, |
| |
| Version: versions.MustParseVersion("2.1.0"), |
| |
| PackageDir: tmpDirPath + "/registry.terraform.io/hashicorp/null/2.1.0/linux_amd64", |
| }, |
| }, |
| } |
| if diff := cmp.Diff(want, got); diff != "" { |
| t.Errorf("wrong cache contents after install\n%s", diff) |
| } |
| } |
| |
| func TestLinkFromOtherCache(t *testing.T) { |
| srcDirPath := "testdata/cachedir" |
| tmpDirPath, err := filepath.EvalSymlinks(t.TempDir()) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| windowsPlatform := getproviders.Platform{ |
| OS: "windows", |
| Arch: "amd64", |
| } |
| nullProvider := addrs.NewProvider( |
| addrs.DefaultProviderRegistryHost, "hashicorp", "null", |
| ) |
| |
| srcDir := NewDirWithPlatform(srcDirPath, windowsPlatform) |
| tmpDir := NewDirWithPlatform(tmpDirPath, windowsPlatform) |
| |
| // First we'll check our preconditions: srcDir should have only the |
| // null provider version 2.0.0 in it, because we're faking that we're on |
| // Windows, and tmpDir should have no providers in it at all. |
| |
| gotSrcInitial := srcDir.AllAvailablePackages() |
| wantSrcInitial := map[addrs.Provider][]CachedProvider{ |
| nullProvider: { |
| 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(wantSrcInitial, gotSrcInitial); diff != "" { |
| t.Fatalf("incorrect initial source directory contents\n%s", diff) |
| } |
| |
| gotTmpInitial := tmpDir.AllAvailablePackages() |
| wantTmpInitial := map[addrs.Provider][]CachedProvider{} |
| if diff := cmp.Diff(wantTmpInitial, gotTmpInitial); diff != "" { |
| t.Fatalf("incorrect initial temp directory contents\n%s", diff) |
| } |
| |
| cacheEntry := srcDir.ProviderLatestVersion(nullProvider) |
| if cacheEntry == nil { |
| // This is weird because we just checked for the presence of this above |
| t.Fatalf("null provider has no latest version in source directory") |
| } |
| |
| err = tmpDir.LinkFromOtherCache(cacheEntry, nil) |
| if err != nil { |
| t.Fatalf("LinkFromOtherCache failed: %s", err) |
| } |
| |
| // Now we should see the same version reflected in the temporary directory. |
| got := tmpDir.AllAvailablePackages() |
| want := map[addrs.Provider][]CachedProvider{ |
| nullProvider: { |
| 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: tmpDirPath + "/registry.terraform.io/hashicorp/null/2.0.0/windows_amd64", |
| }, |
| }, |
| } |
| if diff := cmp.Diff(want, got); diff != "" { |
| t.Errorf("wrong cache contents after link\n%s", diff) |
| } |
| } |