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  }