github.com/terramate-io/tf@v0.0.0-20230830114523-fce866b4dfcd/providercache/dir_test.go (about) 1 // Copyright (c) HashiCorp, Inc. 2 // SPDX-License-Identifier: MPL-2.0 3 4 package providercache 5 6 import ( 7 "testing" 8 9 "github.com/apparentlymart/go-versions/versions" 10 "github.com/google/go-cmp/cmp" 11 12 "github.com/terramate-io/tf/addrs" 13 "github.com/terramate-io/tf/getproviders" 14 ) 15 16 func TestDirReading(t *testing.T) { 17 testDir := "testdata/cachedir" 18 19 // We'll force using particular platforms for unit testing purposes, 20 // so that we'll get consistent results on all platforms. 21 windowsPlatform := getproviders.Platform{ // only null 2.0.0 is cached 22 OS: "windows", 23 Arch: "amd64", 24 } 25 linuxPlatform := getproviders.Platform{ // various provider versions are cached 26 OS: "linux", 27 Arch: "amd64", 28 } 29 30 nullProvider := addrs.NewProvider( 31 addrs.DefaultProviderRegistryHost, "hashicorp", "null", 32 ) 33 randomProvider := addrs.NewProvider( 34 addrs.DefaultProviderRegistryHost, "hashicorp", "random", 35 ) 36 randomBetaProvider := addrs.NewProvider( 37 addrs.DefaultProviderRegistryHost, "hashicorp", "random-beta", 38 ) 39 nonExistProvider := addrs.NewProvider( 40 addrs.DefaultProviderRegistryHost, "bloop", "nonexist", 41 ) 42 legacyProvider := addrs.NewLegacyProvider("legacy") 43 missingExecutableProvider := addrs.NewProvider( 44 addrs.DefaultProviderRegistryHost, "missing", "executable", 45 ) 46 47 t.Run("ProviderLatestVersion", func(t *testing.T) { 48 t.Run("exists", func(t *testing.T) { 49 dir := NewDirWithPlatform(testDir, windowsPlatform) 50 51 got := dir.ProviderLatestVersion(nullProvider) 52 want := &CachedProvider{ 53 Provider: nullProvider, 54 55 // We want 2.0.0 rather than 2.1.0 because the 2.1.0 package is 56 // still packed and thus not considered to be a cache member. 57 Version: versions.MustParseVersion("2.0.0"), 58 59 PackageDir: "testdata/cachedir/registry.terraform.io/hashicorp/null/2.0.0/windows_amd64", 60 } 61 62 if diff := cmp.Diff(want, got); diff != "" { 63 t.Errorf("wrong result\n%s", diff) 64 } 65 }) 66 t.Run("no package for current platform", func(t *testing.T) { 67 dir := NewDirWithPlatform(testDir, windowsPlatform) 68 69 // random provider is only cached for linux_amd64 in our fixtures dir 70 got := dir.ProviderLatestVersion(randomProvider) 71 var want *CachedProvider 72 73 if diff := cmp.Diff(want, got); diff != "" { 74 t.Errorf("wrong result\n%s", diff) 75 } 76 }) 77 t.Run("no versions available at all", func(t *testing.T) { 78 dir := NewDirWithPlatform(testDir, windowsPlatform) 79 80 // nonexist provider is not present in our fixtures dir at all 81 got := dir.ProviderLatestVersion(nonExistProvider) 82 var want *CachedProvider 83 84 if diff := cmp.Diff(want, got); diff != "" { 85 t.Errorf("wrong result\n%s", diff) 86 } 87 }) 88 }) 89 90 t.Run("ProviderVersion", func(t *testing.T) { 91 t.Run("exists", func(t *testing.T) { 92 dir := NewDirWithPlatform(testDir, windowsPlatform) 93 94 got := dir.ProviderVersion(nullProvider, versions.MustParseVersion("2.0.0")) 95 want := &CachedProvider{ 96 Provider: nullProvider, 97 Version: versions.MustParseVersion("2.0.0"), 98 99 PackageDir: "testdata/cachedir/registry.terraform.io/hashicorp/null/2.0.0/windows_amd64", 100 } 101 102 if diff := cmp.Diff(want, got); diff != "" { 103 t.Errorf("wrong result\n%s", diff) 104 } 105 }) 106 t.Run("specified version is not cached", func(t *testing.T) { 107 dir := NewDirWithPlatform(testDir, windowsPlatform) 108 109 // there is no v5.0.0 package in our fixtures dir 110 got := dir.ProviderVersion(nullProvider, versions.MustParseVersion("5.0.0")) 111 var want *CachedProvider 112 113 if diff := cmp.Diff(want, got); diff != "" { 114 t.Errorf("wrong result\n%s", diff) 115 } 116 }) 117 t.Run("no package for current platform", func(t *testing.T) { 118 dir := NewDirWithPlatform(testDir, windowsPlatform) 119 120 // random provider 1.2.0 is only cached for linux_amd64 in our fixtures dir 121 got := dir.ProviderVersion(randomProvider, versions.MustParseVersion("1.2.0")) 122 var want *CachedProvider 123 124 if diff := cmp.Diff(want, got); diff != "" { 125 t.Errorf("wrong result\n%s", diff) 126 } 127 }) 128 t.Run("no versions available at all", func(t *testing.T) { 129 dir := NewDirWithPlatform(testDir, windowsPlatform) 130 131 // nonexist provider is not present in our fixtures dir at all 132 got := dir.ProviderVersion(nonExistProvider, versions.MustParseVersion("1.0.0")) 133 var want *CachedProvider 134 135 if diff := cmp.Diff(want, got); diff != "" { 136 t.Errorf("wrong result\n%s", diff) 137 } 138 }) 139 }) 140 141 t.Run("AllAvailablePackages", func(t *testing.T) { 142 dir := NewDirWithPlatform(testDir, linuxPlatform) 143 144 got := dir.AllAvailablePackages() 145 want := map[addrs.Provider][]CachedProvider{ 146 legacyProvider: { 147 { 148 Provider: legacyProvider, 149 Version: versions.MustParseVersion("1.0.0"), 150 PackageDir: "testdata/cachedir/registry.terraform.io/-/legacy/1.0.0/linux_amd64", 151 }, 152 }, 153 nullProvider: { 154 { 155 Provider: nullProvider, 156 Version: versions.MustParseVersion("2.0.0"), 157 PackageDir: "testdata/cachedir/registry.terraform.io/hashicorp/null/2.0.0/linux_amd64", 158 }, 159 }, 160 randomProvider: { 161 { 162 Provider: randomProvider, 163 Version: versions.MustParseVersion("1.2.0"), 164 PackageDir: "testdata/cachedir/registry.terraform.io/hashicorp/random/1.2.0/linux_amd64", 165 }, 166 }, 167 randomBetaProvider: { 168 { 169 Provider: randomBetaProvider, 170 Version: versions.MustParseVersion("1.2.0"), 171 PackageDir: "testdata/cachedir/registry.terraform.io/hashicorp/random-beta/1.2.0/linux_amd64", 172 }, 173 }, 174 missingExecutableProvider: { 175 { 176 Provider: missingExecutableProvider, 177 Version: versions.MustParseVersion("2.0.0"), 178 PackageDir: "testdata/cachedir/registry.terraform.io/missing/executable/2.0.0/linux_amd64", 179 }, 180 }, 181 } 182 183 if diff := cmp.Diff(want, got); diff != "" { 184 t.Errorf("wrong result\n%s", diff) 185 } 186 }) 187 }