github.com/buildpacks/pack@v0.33.3-0.20240516162812-884dd1837311/acceptance/assertions/image.go (about) 1 //go:build acceptance 2 // +build acceptance 3 4 package assertions 5 6 import ( 7 "fmt" 8 "testing" 9 "time" 10 11 "github.com/buildpacks/pack/acceptance/managers" 12 h "github.com/buildpacks/pack/testhelpers" 13 ) 14 15 type ImageAssertionManager struct { 16 testObject *testing.T 17 assert h.AssertionManager 18 imageManager managers.ImageManager 19 registry *h.TestRegistryConfig 20 } 21 22 func NewImageAssertionManager(t *testing.T, imageManager managers.ImageManager, registry *h.TestRegistryConfig) ImageAssertionManager { 23 return ImageAssertionManager{ 24 testObject: t, 25 assert: h.NewAssertionManager(t), 26 imageManager: imageManager, 27 registry: registry, 28 } 29 } 30 31 func (a ImageAssertionManager) ExistsLocally(name string) { 32 a.testObject.Helper() 33 _, err := a.imageManager.InspectLocal(name) 34 a.assert.Nil(err) 35 } 36 37 func (a ImageAssertionManager) NotExistsLocally(name string) { 38 a.testObject.Helper() 39 _, err := a.imageManager.InspectLocal(name) 40 a.assert.ErrorContains(err, "No such image") 41 } 42 43 func (a ImageAssertionManager) HasBaseImage(image, base string) { 44 a.testObject.Helper() 45 imageInspect, err := a.imageManager.InspectLocal(image) 46 a.assert.Nil(err) 47 baseInspect, err := a.imageManager.InspectLocal(base) 48 a.assert.Nil(err) 49 for i, layer := range baseInspect.RootFS.Layers { 50 a.assert.Equal(imageInspect.RootFS.Layers[i], layer) 51 } 52 } 53 54 func (a ImageAssertionManager) HasCreateTime(image string, expectedTime time.Time) { 55 a.testObject.Helper() 56 inspect, err := a.imageManager.InspectLocal(image) 57 a.assert.Nil(err) 58 actualTime, err := time.Parse("2006-01-02T15:04:05Z", inspect.Created) 59 a.assert.Nil(err) 60 a.assert.TrueWithMessage(actualTime.Sub(expectedTime) < 5*time.Second && expectedTime.Sub(actualTime) < 5*time.Second, fmt.Sprintf("expected image create time %s to match expected time %s", actualTime, expectedTime)) 61 } 62 63 func (a ImageAssertionManager) HasLabelContaining(image, label, data string) { 64 a.testObject.Helper() 65 inspect, err := a.imageManager.InspectLocal(image) 66 a.assert.Nil(err) 67 label, ok := inspect.Config.Labels[label] 68 a.assert.TrueWithMessage(ok, fmt.Sprintf("expected label %s to exist", label)) 69 a.assert.Contains(label, data) 70 } 71 72 func (a ImageAssertionManager) HasLabelNotContaining(image, label, data string) { 73 a.testObject.Helper() 74 inspect, err := a.imageManager.InspectLocal(image) 75 a.assert.Nil(err) 76 label, ok := inspect.Config.Labels[label] 77 a.assert.TrueWithMessage(ok, fmt.Sprintf("expected label %s to exist", label)) 78 a.assert.NotContains(label, data) 79 } 80 81 func (a ImageAssertionManager) HasLengthLayers(image string, length int) { 82 a.testObject.Helper() 83 inspect, err := a.imageManager.InspectLocal(image) 84 a.assert.Nil(err) 85 a.assert.TrueWithMessage(len(inspect.RootFS.Layers) == length, fmt.Sprintf("expected image to have %d layers, found %d", length, len(inspect.RootFS.Layers))) 86 } 87 88 func (a ImageAssertionManager) RunsWithOutput(image string, expectedOutputs ...string) { 89 a.testObject.Helper() 90 containerName := "test-" + h.RandString(10) 91 container := a.imageManager.ExposePortOnImage(image, containerName) 92 defer container.Cleanup() 93 94 output := container.WaitForResponse(managers.DefaultDuration) 95 a.assert.ContainsAll(output, expectedOutputs...) 96 } 97 98 func (a ImageAssertionManager) RunsWithLogs(image string, expectedOutputs ...string) { 99 a.testObject.Helper() 100 container := a.imageManager.CreateContainer(image) 101 defer container.Cleanup() 102 103 output := container.RunWithOutput() 104 a.assert.ContainsAll(output, expectedOutputs...) 105 } 106 107 func (a ImageAssertionManager) CanBePulledFromRegistry(name string) { 108 a.testObject.Helper() 109 a.imageManager.PullImage(name, a.registry.RegistryAuth()) 110 a.ExistsLocally(name) 111 } 112 113 func (a ImageAssertionManager) ExistsInRegistryCatalog(name string) { 114 a.testObject.Helper() 115 contents, err := a.registry.RegistryCatalog() 116 a.assert.Nil(err) 117 a.assert.ContainsWithMessage(contents, name, fmt.Sprintf("Expected to see image %s in %%s", name)) 118 } 119 120 func (a ImageAssertionManager) NotExistsInRegistry(name string) { 121 a.testObject.Helper() 122 contents, err := a.registry.RegistryCatalog() 123 a.assert.Nil(err) 124 a.assert.NotContainWithMessage( 125 contents, 126 name, 127 "Didn't expect to see image %s in the registry", 128 ) 129 } 130 131 func (a ImageAssertionManager) DoesNotHaveDuplicateLayers(name string) { 132 a.testObject.Helper() 133 134 out, err := a.imageManager.InspectLocal(name) 135 a.assert.Nil(err) 136 137 layerSet := map[string]interface{}{} 138 for _, layer := range out.RootFS.Layers { 139 _, ok := layerSet[layer] 140 if ok { 141 a.testObject.Fatalf("duplicate layer found in builder %s", layer) 142 } 143 layerSet[layer] = true 144 } 145 }