github.com/graywolf-at-work-2/terraform-vendor@v1.4.5/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/hashicorp/terraform/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 }