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  }