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 }