github.com/YousefHaggyHeroku/pack@v1.5.5/internal/cache/volume_cache_test.go (about) 1 package cache_test 2 3 import ( 4 "context" 5 "math/rand" 6 "strings" 7 "testing" 8 "time" 9 10 "github.com/docker/docker/api/types/filters" 11 "github.com/docker/docker/api/types/volume" 12 "github.com/docker/docker/client" 13 "github.com/google/go-containerregistry/pkg/name" 14 "github.com/heroku/color" 15 "github.com/sclevine/spec" 16 "github.com/sclevine/spec/report" 17 18 "github.com/YousefHaggyHeroku/pack/internal/cache" 19 h "github.com/YousefHaggyHeroku/pack/testhelpers" 20 ) 21 22 func TestVolumeCache(t *testing.T) { 23 h.RequireDocker(t) 24 color.Disable(true) 25 defer color.Disable(false) 26 rand.Seed(time.Now().UTC().UnixNano()) 27 28 spec.Run(t, "VolumeCache", testCache, spec.Parallel(), spec.Report(report.Terminal{})) 29 } 30 31 func testCache(t *testing.T, when spec.G, it spec.S) { 32 when("#NewVolumeCache", func() { 33 var dockerClient client.CommonAPIClient 34 35 it.Before(func() { 36 var err error 37 dockerClient, err = client.NewClientWithOpts(client.FromEnv, client.WithVersion("1.38")) 38 h.AssertNil(t, err) 39 }) 40 41 it("adds suffix to calculated name", func() { 42 ref, err := name.ParseReference("my/repo", name.WeakValidation) 43 h.AssertNil(t, err) 44 subject := cache.NewVolumeCache(ref, "some-suffix", dockerClient) 45 if !strings.HasSuffix(subject.Name(), ".some-suffix") { 46 t.Fatalf("Calculated volume name '%s' should end with '.some-suffix'", subject.Name()) 47 } 48 }) 49 50 it("reusing the same cache for the same repo name", func() { 51 ref, err := name.ParseReference("my/repo", name.WeakValidation) 52 h.AssertNil(t, err) 53 54 subject := cache.NewVolumeCache(ref, "some-suffix", dockerClient) 55 expected := cache.NewVolumeCache(ref, "some-suffix", dockerClient) 56 if subject.Name() != expected.Name() { 57 t.Fatalf("The same repo name should result in the same volume") 58 } 59 }) 60 61 it("supplies different volumes for different tags", func() { 62 ref, err := name.ParseReference("my/repo:other-tag", name.WeakValidation) 63 h.AssertNil(t, err) 64 65 subject := cache.NewVolumeCache(ref, "some-suffix", dockerClient) 66 67 ref, err = name.ParseReference("my/repo", name.WeakValidation) 68 h.AssertNil(t, err) 69 notExpected := cache.NewVolumeCache(ref, "some-suffix", dockerClient) 70 if subject.Name() == notExpected.Name() { 71 t.Fatalf("Different image tags should result in different volumes") 72 } 73 }) 74 75 it("supplies different volumes for different registries", func() { 76 ref, err := name.ParseReference("registry.com/my/repo:other-tag", name.WeakValidation) 77 h.AssertNil(t, err) 78 79 subject := cache.NewVolumeCache(ref, "some-suffix", dockerClient) 80 81 ref, err = name.ParseReference("my/repo", name.WeakValidation) 82 h.AssertNil(t, err) 83 notExpected := cache.NewVolumeCache(ref, "some-suffix", dockerClient) 84 if subject.Name() == notExpected.Name() { 85 t.Fatalf("Different image registries should result in different volumes") 86 } 87 }) 88 89 it("resolves implied tag", func() { 90 ref, err := name.ParseReference("my/repo:latest", name.WeakValidation) 91 h.AssertNil(t, err) 92 93 subject := cache.NewVolumeCache(ref, "some-suffix", dockerClient) 94 95 ref, err = name.ParseReference("my/repo", name.WeakValidation) 96 h.AssertNil(t, err) 97 expected := cache.NewVolumeCache(ref, "some-suffix", dockerClient) 98 h.AssertEq(t, subject.Name(), expected.Name()) 99 }) 100 101 it("resolves implied registry", func() { 102 ref, err := name.ParseReference("index.docker.io/my/repo", name.WeakValidation) 103 h.AssertNil(t, err) 104 105 subject := cache.NewVolumeCache(ref, "some-suffix", dockerClient) 106 107 ref, err = name.ParseReference("my/repo", name.WeakValidation) 108 h.AssertNil(t, err) 109 expected := cache.NewVolumeCache(ref, "some-suffix", dockerClient) 110 h.AssertEq(t, subject.Name(), expected.Name()) 111 }) 112 }) 113 114 when("#Clear", func() { 115 var ( 116 volumeName string 117 dockerClient client.CommonAPIClient 118 subject *cache.VolumeCache 119 ctx context.Context 120 ) 121 122 it.Before(func() { 123 var err error 124 dockerClient, err = client.NewClientWithOpts(client.FromEnv, client.WithVersion("1.38")) 125 h.AssertNil(t, err) 126 ctx = context.TODO() 127 128 ref, err := name.ParseReference(h.RandString(10), name.WeakValidation) 129 h.AssertNil(t, err) 130 131 subject = cache.NewVolumeCache(ref, "some-suffix", dockerClient) 132 volumeName = subject.Name() 133 }) 134 135 when("there is a cache volume", func() { 136 it.Before(func() { 137 dockerClient.VolumeCreate(context.TODO(), volume.VolumeCreateBody{ 138 Name: volumeName, 139 }) 140 }) 141 142 it("removes the volume", func() { 143 err := subject.Clear(ctx) 144 h.AssertNil(t, err) 145 146 volumes, err := dockerClient.VolumeList(context.TODO(), filters.NewArgs(filters.KeyValuePair{ 147 Key: "name", 148 Value: volumeName, 149 })) 150 h.AssertNil(t, err) 151 h.AssertEq(t, len(volumes.Volumes), 0) 152 }) 153 }) 154 155 when("there is no cache volume", func() { 156 it("does not fail", func() { 157 err := subject.Clear(ctx) 158 h.AssertNil(t, err) 159 }) 160 }) 161 }) 162 }