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  }