github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/dockerfile/dockerfile_test.go (about)

     1  package dockerfile
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/assert"
     7  )
     8  
     9  func TestFindImages(t *testing.T) {
    10  	df := Dockerfile(`FROM gcr.io/image-a`)
    11  	images, err := df.FindImages(nil)
    12  	assert.NoError(t, err)
    13  	if assert.Equal(t, 1, len(images)) {
    14  		assert.Equal(t, "gcr.io/image-a", images[0].String())
    15  	}
    16  }
    17  
    18  func TestFindImagesAsBuilder(t *testing.T) {
    19  	df := Dockerfile(`FROM gcr.io/image-a as builder`)
    20  	images, err := df.FindImages(nil)
    21  	assert.NoError(t, err)
    22  	if assert.Equal(t, 1, len(images)) {
    23  		assert.Equal(t, "gcr.io/image-a", images[0].String())
    24  	}
    25  }
    26  
    27  func TestFindImagesBadImageName(t *testing.T) {
    28  	// Capital letters aren't allowed in image names
    29  	df := Dockerfile(`FROM gcr.io/imageA`)
    30  	images, err := df.FindImages(nil)
    31  	assert.NoError(t, err)
    32  	assert.Equal(t, 0, len(images))
    33  }
    34  
    35  func TestFindImagesMissingImageName(t *testing.T) {
    36  	df := Dockerfile(`FROM`)
    37  	images, err := df.FindImages(nil)
    38  	assert.NoError(t, err)
    39  	assert.Equal(t, 0, len(images))
    40  }
    41  
    42  func TestFindImagesWeirdSyntax(t *testing.T) {
    43  	df := Dockerfile(`FROM a b`)
    44  	images, err := df.FindImages(nil)
    45  	assert.NoError(t, err)
    46  	if assert.Equal(t, 1, len(images)) {
    47  		assert.Equal(t, "docker.io/library/a", images[0].String())
    48  	}
    49  }
    50  
    51  func TestFindImagesCopyFrom(t *testing.T) {
    52  	df := Dockerfile(`COPY --from=gcr.io/image-a /srcA/package.json /srcB/package.json`)
    53  	images, err := df.FindImages(nil)
    54  	assert.NoError(t, err)
    55  	if assert.Equal(t, 1, len(images)) {
    56  		assert.Equal(t, "gcr.io/image-a", images[0].String())
    57  	}
    58  }
    59  
    60  func TestFindImagesWithDefaultArg(t *testing.T) {
    61  	df := Dockerfile(`
    62  ARG TAG="latest"
    63  FROM gcr.io/image-a:${TAG}
    64  `)
    65  	images, err := df.FindImages(nil)
    66  	assert.NoError(t, err)
    67  	if assert.Equal(t, 1, len(images)) {
    68  		assert.Equal(t, "gcr.io/image-a:latest", images[0].String())
    69  	}
    70  }
    71  
    72  func TestFindImagesWithNoDefaultArg(t *testing.T) {
    73  	df := Dockerfile(`
    74  ARG TAG
    75  FROM gcr.io/image-a:${TAG}
    76  `)
    77  	images, err := df.FindImages([]string{"TAG=latest"})
    78  	assert.NoError(t, err)
    79  	if assert.Equal(t, 1, len(images)) {
    80  		assert.Equal(t, "gcr.io/image-a:latest", images[0].String())
    81  	}
    82  }
    83  
    84  func TestFindImagesWithOverrideArg(t *testing.T) {
    85  	df := Dockerfile(`
    86  ARG TAG="latest"
    87  FROM gcr.io/image-a:${TAG}
    88  `)
    89  	images, err := df.FindImages([]string{"TAG=v2.0.1"})
    90  	assert.NoError(t, err)
    91  	if assert.Equal(t, 1, len(images)) {
    92  		assert.Equal(t, "gcr.io/image-a:v2.0.1", images[0].String())
    93  	}
    94  }
    95  
    96  func TestFindImagesWithMount(t *testing.T) {
    97  	// Example from:
    98  	// https://github.com/tilt-dev/tilt/issues/3331
    99  	//
   100  	// The buildkit experimental parser will parse commands
   101  	// like `RUN --mount` that the normal parser won't. So
   102  	// we want to make sure a partial parse succeeds:
   103  	// an bad parse later in the Dockerfile shouldn't interfere
   104  	// with commands further up.
   105  	df := Dockerfile(`
   106  # syntax=docker/dockerfile:experimental
   107  
   108  ARG PYTHON2_BASE="python2-base"
   109  FROM ${PYTHON2_BASE}
   110  
   111  RUN --mount=type=cache,id=pip,target=/root/.cache/pip pip install python-dateutil
   112  `)
   113  	images, err := df.FindImages(nil)
   114  	assert.NoError(t, err)
   115  	if assert.Equal(t, 1, len(images)) {
   116  		assert.Equal(t, "docker.io/library/python2-base", images[0].String())
   117  	}
   118  }