github.com/muratcelep/terraform@v1.1.0-beta2-not-internal-4/not-internal/getproviders/memoize_source_test.go (about)

     1  package getproviders
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	"github.com/google/go-cmp/cmp"
     8  	"github.com/muratcelep/terraform/not-internal/addrs"
     9  )
    10  
    11  func TestMemoizeSource(t *testing.T) {
    12  	provider := addrs.NewDefaultProvider("foo")
    13  	version := MustParseVersion("1.0.0")
    14  	protocols := VersionList{MustParseVersion("5.0")}
    15  	platform := Platform{OS: "gameboy", Arch: "lr35902"}
    16  	meta := FakePackageMeta(provider, version, protocols, platform)
    17  	nonexistProvider := addrs.NewDefaultProvider("nonexist")
    18  	nonexistPlatform := Platform{OS: "gamegear", Arch: "z80"}
    19  
    20  	t.Run("AvailableVersions for existing provider", func(t *testing.T) {
    21  		mock := NewMockSource([]PackageMeta{meta}, nil)
    22  		source := NewMemoizeSource(mock)
    23  
    24  		got, _, err := source.AvailableVersions(context.Background(), provider)
    25  		want := VersionList{version}
    26  		if err != nil {
    27  			t.Fatalf("unexpected error: %s", err)
    28  		}
    29  		if diff := cmp.Diff(want, got); diff != "" {
    30  			t.Fatalf("wrong result from first call to AvailableVersions\n%s", diff)
    31  		}
    32  
    33  		got, _, err = source.AvailableVersions(context.Background(), provider)
    34  		want = VersionList{version}
    35  		if err != nil {
    36  			t.Fatalf("unexpected error: %s", err)
    37  		}
    38  		if diff := cmp.Diff(want, got); diff != "" {
    39  			t.Fatalf("wrong result from second call to AvailableVersions\n%s", diff)
    40  		}
    41  
    42  		_, _, err = source.AvailableVersions(context.Background(), nonexistProvider)
    43  		if want, ok := err.(ErrRegistryProviderNotKnown); !ok {
    44  			t.Fatalf("wrong error type from nonexist call:\ngot:  %T\nwant: %T", err, want)
    45  		}
    46  
    47  		got, _, err = source.AvailableVersions(context.Background(), provider)
    48  		want = VersionList{version}
    49  		if err != nil {
    50  			t.Fatalf("unexpected error: %s", err)
    51  		}
    52  		if diff := cmp.Diff(want, got); diff != "" {
    53  			t.Fatalf("wrong result from third call to AvailableVersions\n%s", diff)
    54  		}
    55  
    56  		gotLog := mock.CallLog()
    57  		wantLog := [][]interface{}{
    58  			// Only one call for the main provider, because the others were returned from the cache.
    59  			{"AvailableVersions", provider},
    60  
    61  			// The call for nonexist also shows through, because it didn't match the cache.
    62  			{"AvailableVersions", nonexistProvider},
    63  		}
    64  		if diff := cmp.Diff(wantLog, gotLog); diff != "" {
    65  			t.Fatalf("unexpected call log\n%s", diff)
    66  		}
    67  	})
    68  	t.Run("AvailableVersions with warnings", func(t *testing.T) {
    69  		warnProvider := addrs.NewDefaultProvider("warning")
    70  		meta := FakePackageMeta(warnProvider, version, protocols, platform)
    71  		mock := NewMockSource([]PackageMeta{meta}, map[addrs.Provider]Warnings{warnProvider: {"WARNING!"}})
    72  		source := NewMemoizeSource(mock)
    73  
    74  		got, warns, err := source.AvailableVersions(context.Background(), warnProvider)
    75  		want := VersionList{version}
    76  		if err != nil {
    77  			t.Fatalf("unexpected error: %s", err)
    78  		}
    79  		if diff := cmp.Diff(want, got); diff != "" {
    80  			t.Fatalf("wrong result from first call to AvailableVersions\n%s", diff)
    81  		}
    82  		if len(warns) != 1 {
    83  			t.Fatalf("wrong number of warnings. Got %d, expected 1", len(warns))
    84  		}
    85  		if warns[0] != "WARNING!" {
    86  			t.Fatalf("wrong result! Got %s, expected \"WARNING!\"", warns[0])
    87  		}
    88  
    89  	})
    90  	t.Run("PackageMeta for existing provider", func(t *testing.T) {
    91  		mock := NewMockSource([]PackageMeta{meta}, nil)
    92  		source := NewMemoizeSource(mock)
    93  
    94  		got, err := source.PackageMeta(context.Background(), provider, version, platform)
    95  		want := meta
    96  		if err != nil {
    97  			t.Fatalf("unexpected error: %s", err)
    98  		}
    99  		if diff := cmp.Diff(want, got); diff != "" {
   100  			t.Fatalf("wrong result from first call to PackageMeta\n%s", diff)
   101  		}
   102  
   103  		got, err = source.PackageMeta(context.Background(), provider, version, platform)
   104  		want = meta
   105  		if err != nil {
   106  			t.Fatalf("unexpected error: %s", err)
   107  		}
   108  		if diff := cmp.Diff(want, got); diff != "" {
   109  			t.Fatalf("wrong result from second call to PackageMeta\n%s", diff)
   110  		}
   111  
   112  		_, err = source.PackageMeta(context.Background(), nonexistProvider, version, platform)
   113  		if want, ok := err.(ErrPlatformNotSupported); !ok {
   114  			t.Fatalf("wrong error type from nonexist provider call:\ngot:  %T\nwant: %T", err, want)
   115  		}
   116  		_, err = source.PackageMeta(context.Background(), provider, version, nonexistPlatform)
   117  		if want, ok := err.(ErrPlatformNotSupported); !ok {
   118  			t.Fatalf("wrong error type from nonexist platform call:\ngot:  %T\nwant: %T", err, want)
   119  		}
   120  
   121  		got, err = source.PackageMeta(context.Background(), provider, version, platform)
   122  		want = meta
   123  		if err != nil {
   124  			t.Fatalf("unexpected error: %s", err)
   125  		}
   126  		if diff := cmp.Diff(want, got); diff != "" {
   127  			t.Fatalf("wrong result from third call to PackageMeta\n%s", diff)
   128  		}
   129  
   130  		gotLog := mock.CallLog()
   131  		wantLog := [][]interface{}{
   132  			// Only one call for the main provider, because the others were returned from the cache.
   133  			{"PackageMeta", provider, version, platform},
   134  
   135  			// The other calls for non-exist things also show through, because they missed the cache.
   136  			{"PackageMeta", nonexistProvider, version, platform},
   137  			{"PackageMeta", provider, version, nonexistPlatform},
   138  		}
   139  		if diff := cmp.Diff(wantLog, gotLog); diff != "" {
   140  			t.Fatalf("unexpected call log\n%s", diff)
   141  		}
   142  	})
   143  	t.Run("AvailableVersions for non-existing provider", func(t *testing.T) {
   144  		mock := NewMockSource([]PackageMeta{meta}, nil)
   145  		source := NewMemoizeSource(mock)
   146  
   147  		_, _, err := source.AvailableVersions(context.Background(), nonexistProvider)
   148  		if want, ok := err.(ErrRegistryProviderNotKnown); !ok {
   149  			t.Fatalf("wrong error type from first call:\ngot:  %T\nwant: %T", err, want)
   150  		}
   151  		_, _, err = source.AvailableVersions(context.Background(), nonexistProvider)
   152  		if want, ok := err.(ErrRegistryProviderNotKnown); !ok {
   153  			t.Fatalf("wrong error type from second call:\ngot:  %T\nwant: %T", err, want)
   154  		}
   155  
   156  		gotLog := mock.CallLog()
   157  		wantLog := [][]interface{}{
   158  			// Only one call, because the other was returned from the cache.
   159  			{"AvailableVersions", nonexistProvider},
   160  		}
   161  		if diff := cmp.Diff(wantLog, gotLog); diff != "" {
   162  			t.Fatalf("unexpected call log\n%s", diff)
   163  		}
   164  	})
   165  	t.Run("PackageMeta for non-existing provider", func(t *testing.T) {
   166  		mock := NewMockSource([]PackageMeta{meta}, nil)
   167  		source := NewMemoizeSource(mock)
   168  
   169  		_, err := source.PackageMeta(context.Background(), nonexistProvider, version, platform)
   170  		if want, ok := err.(ErrPlatformNotSupported); !ok {
   171  			t.Fatalf("wrong error type from first call:\ngot:  %T\nwant: %T", err, want)
   172  		}
   173  		_, err = source.PackageMeta(context.Background(), nonexistProvider, version, platform)
   174  		if want, ok := err.(ErrPlatformNotSupported); !ok {
   175  			t.Fatalf("wrong error type from second call:\ngot:  %T\nwant: %T", err, want)
   176  		}
   177  
   178  		gotLog := mock.CallLog()
   179  		wantLog := [][]interface{}{
   180  			// Only one call, because the other was returned from the cache.
   181  			{"PackageMeta", nonexistProvider, version, platform},
   182  		}
   183  		if diff := cmp.Diff(wantLog, gotLog); diff != "" {
   184  			t.Fatalf("unexpected call log\n%s", diff)
   185  		}
   186  	})
   187  }