github.com/kevinklinger/open_terraform@v1.3.6/noninternal/depsfile/locks_test.go (about) 1 package depsfile 2 3 import ( 4 "testing" 5 6 "github.com/google/go-cmp/cmp" 7 "github.com/kevinklinger/open_terraform/noninternal/addrs" 8 "github.com/kevinklinger/open_terraform/noninternal/getproviders" 9 ) 10 11 func TestLocksEqual(t *testing.T) { 12 boopProvider := addrs.NewDefaultProvider("boop") 13 v2 := getproviders.MustParseVersion("2.0.0") 14 v2LocalBuild := getproviders.MustParseVersion("2.0.0+awesomecorp.1") 15 v2GtConstraints := getproviders.MustParseVersionConstraints(">= 2.0.0") 16 v2EqConstraints := getproviders.MustParseVersionConstraints("2.0.0") 17 hash1 := getproviders.HashScheme("test").New("1") 18 hash2 := getproviders.HashScheme("test").New("2") 19 hash3 := getproviders.HashScheme("test").New("3") 20 21 equalBothWays := func(t *testing.T, a, b *Locks) { 22 t.Helper() 23 if !a.Equal(b) { 24 t.Errorf("a should be equal to b") 25 } 26 if !b.Equal(a) { 27 t.Errorf("b should be equal to a") 28 } 29 } 30 nonEqualBothWays := func(t *testing.T, a, b *Locks) { 31 t.Helper() 32 if a.Equal(b) { 33 t.Errorf("a should be equal to b") 34 } 35 if b.Equal(a) { 36 t.Errorf("b should be equal to a") 37 } 38 } 39 40 t.Run("both empty", func(t *testing.T) { 41 a := NewLocks() 42 b := NewLocks() 43 equalBothWays(t, a, b) 44 }) 45 t.Run("an extra provider lock", func(t *testing.T) { 46 a := NewLocks() 47 b := NewLocks() 48 b.SetProvider(boopProvider, v2, v2GtConstraints, nil) 49 nonEqualBothWays(t, a, b) 50 }) 51 t.Run("both have boop provider with same version", func(t *testing.T) { 52 a := NewLocks() 53 b := NewLocks() 54 // Note: the constraints are not part of the definition of "Equal", so they can differ 55 a.SetProvider(boopProvider, v2, v2GtConstraints, nil) 56 b.SetProvider(boopProvider, v2, v2EqConstraints, nil) 57 equalBothWays(t, a, b) 58 }) 59 t.Run("both have boop provider with different versions", func(t *testing.T) { 60 a := NewLocks() 61 b := NewLocks() 62 a.SetProvider(boopProvider, v2, v2EqConstraints, nil) 63 b.SetProvider(boopProvider, v2LocalBuild, v2EqConstraints, nil) 64 nonEqualBothWays(t, a, b) 65 }) 66 t.Run("both have boop provider with same version and same hashes", func(t *testing.T) { 67 a := NewLocks() 68 b := NewLocks() 69 hashes := []getproviders.Hash{hash1, hash2, hash3} 70 a.SetProvider(boopProvider, v2, v2EqConstraints, hashes) 71 b.SetProvider(boopProvider, v2, v2EqConstraints, hashes) 72 equalBothWays(t, a, b) 73 }) 74 t.Run("both have boop provider with same version but different hashes", func(t *testing.T) { 75 a := NewLocks() 76 b := NewLocks() 77 hashesA := []getproviders.Hash{hash1, hash2} 78 hashesB := []getproviders.Hash{hash1, hash3} 79 a.SetProvider(boopProvider, v2, v2EqConstraints, hashesA) 80 b.SetProvider(boopProvider, v2, v2EqConstraints, hashesB) 81 nonEqualBothWays(t, a, b) 82 }) 83 } 84 85 func TestLocksEqualProviderAddress(t *testing.T) { 86 boopProvider := addrs.NewDefaultProvider("boop") 87 v2 := getproviders.MustParseVersion("2.0.0") 88 v2LocalBuild := getproviders.MustParseVersion("2.0.0+awesomecorp.1") 89 v2GtConstraints := getproviders.MustParseVersionConstraints(">= 2.0.0") 90 v2EqConstraints := getproviders.MustParseVersionConstraints("2.0.0") 91 hash1 := getproviders.HashScheme("test").New("1") 92 hash2 := getproviders.HashScheme("test").New("2") 93 hash3 := getproviders.HashScheme("test").New("3") 94 95 equalProviderAddressBothWays := func(t *testing.T, a, b *Locks) { 96 t.Helper() 97 if !a.EqualProviderAddress(b) { 98 t.Errorf("a should be equal to b") 99 } 100 if !b.EqualProviderAddress(a) { 101 t.Errorf("b should be equal to a") 102 } 103 } 104 nonEqualProviderAddressBothWays := func(t *testing.T, a, b *Locks) { 105 t.Helper() 106 if a.EqualProviderAddress(b) { 107 t.Errorf("a should be equal to b") 108 } 109 if b.EqualProviderAddress(a) { 110 t.Errorf("b should be equal to a") 111 } 112 } 113 114 t.Run("both empty", func(t *testing.T) { 115 a := NewLocks() 116 b := NewLocks() 117 equalProviderAddressBothWays(t, a, b) 118 }) 119 t.Run("an extra provider lock", func(t *testing.T) { 120 a := NewLocks() 121 b := NewLocks() 122 b.SetProvider(boopProvider, v2, v2GtConstraints, nil) 123 nonEqualProviderAddressBothWays(t, a, b) 124 }) 125 t.Run("both have boop provider with different versions", func(t *testing.T) { 126 a := NewLocks() 127 b := NewLocks() 128 a.SetProvider(boopProvider, v2, v2EqConstraints, nil) 129 b.SetProvider(boopProvider, v2LocalBuild, v2EqConstraints, nil) 130 equalProviderAddressBothWays(t, a, b) 131 }) 132 t.Run("both have boop provider with same version but different hashes", func(t *testing.T) { 133 a := NewLocks() 134 b := NewLocks() 135 hashesA := []getproviders.Hash{hash1, hash2} 136 hashesB := []getproviders.Hash{hash1, hash3} 137 a.SetProvider(boopProvider, v2, v2EqConstraints, hashesA) 138 b.SetProvider(boopProvider, v2, v2EqConstraints, hashesB) 139 equalProviderAddressBothWays(t, a, b) 140 }) 141 } 142 143 func TestLocksProviderSetRemove(t *testing.T) { 144 beepProvider := addrs.NewDefaultProvider("beep") 145 boopProvider := addrs.NewDefaultProvider("boop") 146 v2 := getproviders.MustParseVersion("2.0.0") 147 v2EqConstraints := getproviders.MustParseVersionConstraints("2.0.0") 148 v2GtConstraints := getproviders.MustParseVersionConstraints(">= 2.0.0") 149 hash := getproviders.HashScheme("test").New("1") 150 151 locks := NewLocks() 152 if got, want := len(locks.AllProviders()), 0; got != want { 153 t.Fatalf("fresh locks object already has providers") 154 } 155 156 locks.SetProvider(boopProvider, v2, v2EqConstraints, []getproviders.Hash{hash}) 157 { 158 got := locks.AllProviders() 159 want := map[addrs.Provider]*ProviderLock{ 160 boopProvider: { 161 addr: boopProvider, 162 version: v2, 163 versionConstraints: v2EqConstraints, 164 hashes: []getproviders.Hash{hash}, 165 }, 166 } 167 if diff := cmp.Diff(want, got, ProviderLockComparer); diff != "" { 168 t.Fatalf("wrong providers after SetProvider boop\n%s", diff) 169 } 170 } 171 172 locks.SetProvider(beepProvider, v2, v2GtConstraints, []getproviders.Hash{hash}) 173 { 174 got := locks.AllProviders() 175 want := map[addrs.Provider]*ProviderLock{ 176 boopProvider: { 177 addr: boopProvider, 178 version: v2, 179 versionConstraints: v2EqConstraints, 180 hashes: []getproviders.Hash{hash}, 181 }, 182 beepProvider: { 183 addr: beepProvider, 184 version: v2, 185 versionConstraints: v2GtConstraints, 186 hashes: []getproviders.Hash{hash}, 187 }, 188 } 189 if diff := cmp.Diff(want, got, ProviderLockComparer); diff != "" { 190 t.Fatalf("wrong providers after SetProvider beep\n%s", diff) 191 } 192 } 193 194 locks.RemoveProvider(boopProvider) 195 { 196 got := locks.AllProviders() 197 want := map[addrs.Provider]*ProviderLock{ 198 beepProvider: { 199 addr: beepProvider, 200 version: v2, 201 versionConstraints: v2GtConstraints, 202 hashes: []getproviders.Hash{hash}, 203 }, 204 } 205 if diff := cmp.Diff(want, got, ProviderLockComparer); diff != "" { 206 t.Fatalf("wrong providers after RemoveProvider boop\n%s", diff) 207 } 208 } 209 210 locks.RemoveProvider(beepProvider) 211 { 212 got := locks.AllProviders() 213 want := map[addrs.Provider]*ProviderLock{} 214 if diff := cmp.Diff(want, got, ProviderLockComparer); diff != "" { 215 t.Fatalf("wrong providers after RemoveProvider beep\n%s", diff) 216 } 217 } 218 } 219 220 func TestProviderLockContainsAll(t *testing.T) { 221 provider := addrs.NewDefaultProvider("provider") 222 v2 := getproviders.MustParseVersion("2.0.0") 223 v2EqConstraints := getproviders.MustParseVersionConstraints("2.0.0") 224 225 t.Run("non-symmetric", func(t *testing.T) { 226 target := NewProviderLock(provider, v2, v2EqConstraints, []getproviders.Hash{ 227 "9r3i9a9QmASqMnQM", 228 "K43RHM2klOoywtyW", 229 "swJPXfuCNhJsTM5c", 230 }) 231 232 original := NewProviderLock(provider, v2, v2EqConstraints, []getproviders.Hash{ 233 "9r3i9a9QmASqMnQM", 234 "1ZAChGWUMWn4zmIk", 235 "K43RHM2klOoywtyW", 236 "HWjRvIuWZ1LVatnc", 237 "swJPXfuCNhJsTM5c", 238 "KwhJK4p/U2dqbKhI", 239 }) 240 241 if !original.ContainsAll(target) { 242 t.Errorf("orginal should contain all hashes in target") 243 } 244 if target.ContainsAll(original) { 245 t.Errorf("target should not contain all hashes in orginal") 246 } 247 }) 248 249 t.Run("symmetric", func(t *testing.T) { 250 target := NewProviderLock(provider, v2, v2EqConstraints, []getproviders.Hash{ 251 "9r3i9a9QmASqMnQM", 252 "K43RHM2klOoywtyW", 253 "swJPXfuCNhJsTM5c", 254 }) 255 256 original := NewProviderLock(provider, v2, v2EqConstraints, []getproviders.Hash{ 257 "9r3i9a9QmASqMnQM", 258 "K43RHM2klOoywtyW", 259 "swJPXfuCNhJsTM5c", 260 }) 261 262 if !original.ContainsAll(target) { 263 t.Errorf("orginal should contain all hashes in target") 264 } 265 if !target.ContainsAll(original) { 266 t.Errorf("target should not contain all hashes in orginal") 267 } 268 }) 269 270 t.Run("edge case - null", func(t *testing.T) { 271 original := NewProviderLock(provider, v2, v2EqConstraints, []getproviders.Hash{ 272 "9r3i9a9QmASqMnQM", 273 "K43RHM2klOoywtyW", 274 "swJPXfuCNhJsTM5c", 275 }) 276 277 if !original.ContainsAll(nil) { 278 t.Fatalf("orginal should report true on nil") 279 } 280 }) 281 282 t.Run("edge case - empty", func(t *testing.T) { 283 original := NewProviderLock(provider, v2, v2EqConstraints, []getproviders.Hash{ 284 "9r3i9a9QmASqMnQM", 285 "K43RHM2klOoywtyW", 286 "swJPXfuCNhJsTM5c", 287 }) 288 289 target := NewProviderLock(provider, v2, v2EqConstraints, []getproviders.Hash{}) 290 291 if !original.ContainsAll(target) { 292 t.Fatalf("orginal should report true on empty") 293 } 294 }) 295 296 t.Run("edge case - original empty", func(t *testing.T) { 297 original := NewProviderLock(provider, v2, v2EqConstraints, []getproviders.Hash{}) 298 299 target := NewProviderLock(provider, v2, v2EqConstraints, []getproviders.Hash{ 300 "9r3i9a9QmASqMnQM", 301 "K43RHM2klOoywtyW", 302 "swJPXfuCNhJsTM5c", 303 }) 304 305 if original.ContainsAll(target) { 306 t.Fatalf("orginal should report false when empty") 307 } 308 }) 309 }