github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/dockerfile/inject_test.go (about) 1 package dockerfile 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/assert" 7 8 "github.com/tilt-dev/tilt/internal/container" 9 ) 10 11 func TestInjectUntagged(t *testing.T) { 12 df := Dockerfile(` 13 FROM gcr.io/windmill/foo 14 ADD . . 15 `) 16 ref := container.MustParseNamedTagged("gcr.io/windmill/foo:deadbeef") 17 newDf, modified, err := InjectImageDigest(df, container.NameSelector(ref), ref, nil) 18 if assert.NoError(t, err) { 19 assert.True(t, modified) 20 assert.Equal(t, ` 21 FROM gcr.io/windmill/foo:deadbeef 22 ADD . . 23 `, string(newDf)) 24 } 25 } 26 27 func TestInjectTagged(t *testing.T) { 28 df := Dockerfile(` 29 FROM gcr.io/windmill/foo:v1 30 ADD . . 31 `) 32 ref := container.MustParseNamedTagged("gcr.io/windmill/foo:deadbeef") 33 newDf, modified, err := InjectImageDigest(df, container.NameSelector(ref), ref, nil) 34 if assert.NoError(t, err) { 35 assert.True(t, modified) 36 assert.Equal(t, ` 37 FROM gcr.io/windmill/foo:deadbeef 38 ADD . . 39 `, string(newDf)) 40 } 41 } 42 43 func TestInjectNoMatch(t *testing.T) { 44 df := Dockerfile(` 45 FROM gcr.io/windmill/bar:v1 46 ADD . . 47 `) 48 ref := container.MustParseNamedTagged("gcr.io/windmill/foo:deadbeef") 49 newDf, modified, err := InjectImageDigest(df, container.NameSelector(ref), ref, nil) 50 if assert.NoError(t, err) { 51 assert.False(t, modified) 52 assert.Equal(t, df, newDf) 53 } 54 } 55 56 func TestInjectCopyFrom(t *testing.T) { 57 df := Dockerfile(` 58 FROM golang:1.10 59 COPY --from=gcr.io/windmill/foo /src/package.json /src/package.json 60 ADD . . 61 `) 62 ref := container.MustParseNamedTagged("gcr.io/windmill/foo:deadbeef") 63 newDf, modified, err := InjectImageDigest(df, container.NameSelector(ref), ref, nil) 64 if assert.NoError(t, err) { 65 assert.True(t, modified) 66 assert.Equal(t, ` 67 FROM golang:1.10 68 COPY --from=gcr.io/windmill/foo:deadbeef /src/package.json /src/package.json 69 ADD . . 70 `, string(newDf)) 71 } 72 } 73 74 func TestInjectCopyFromWithTag(t *testing.T) { 75 df := Dockerfile(` 76 FROM golang:1.10 77 COPY --from=gcr.io/windmill/foo:bar /src/package.json /src/package.json 78 ADD . . 79 `) 80 ref := container.MustParseNamedTagged("gcr.io/windmill/foo:deadbeef") 81 newDf, modified, err := InjectImageDigest(df, container.NameSelector(ref), ref, nil) 82 if assert.NoError(t, err) { 83 assert.True(t, modified) 84 assert.Equal(t, ` 85 FROM golang:1.10 86 COPY --from=gcr.io/windmill/foo:deadbeef /src/package.json /src/package.json 87 ADD . . 88 `, string(newDf)) 89 } 90 } 91 92 func TestInjectCopyNormalizedNames(t *testing.T) { 93 df := Dockerfile(` 94 FROM golang:1.10 95 COPY --from=vandelay/common /usr/src/common/package.json /usr/src/common/yarn.lock /usr/src/common/ 96 ADD . . 97 `) 98 ref := container.MustParseNamedTagged("vandelay/common:deadbeef") 99 newDf, modified, err := InjectImageDigest(df, container.NameSelector(ref), ref, nil) 100 if assert.NoError(t, err) { 101 assert.True(t, modified) 102 assert.Equal(t, ` 103 FROM golang:1.10 104 COPY --from=vandelay/common:deadbeef /usr/src/common/package.json /usr/src/common/yarn.lock /usr/src/common/ 105 ADD . . 106 `, string(newDf)) 107 } 108 } 109 110 func TestInjectTwice(t *testing.T) { 111 df := Dockerfile(` 112 FROM golang:1.10 113 COPY --from="vandelay/common" /usr/src/common/package.json /usr/src/common/yarn.lock 114 ADD . . 115 `) 116 ref := container.MustParseNamedTagged("vandelay/common:deadbeef") 117 ast, err := ParseAST(df) 118 if err != nil { 119 t.Fatal(err) 120 } 121 122 modified, err := ast.InjectImageDigest(container.NameSelector(ref), ref, nil) 123 if assert.NoError(t, err) { 124 assert.True(t, modified) 125 126 newDf, err := ast.Print() 127 if err != nil { 128 t.Fatal(err) 129 } 130 assert.Equal(t, ` 131 FROM golang:1.10 132 COPY --from=vandelay/common:deadbeef /usr/src/common/package.json /usr/src/common/yarn.lock 133 ADD . . 134 `, string(newDf)) 135 } 136 137 modified, err = ast.InjectImageDigest(container.NameSelector(ref), ref, nil) 138 if assert.NoError(t, err) { 139 assert.True(t, modified) 140 141 newDf, err := ast.Print() 142 if err != nil { 143 t.Fatal(err) 144 } 145 assert.Equal(t, ` 146 FROM golang:1.10 147 COPY --from=vandelay/common:deadbeef /usr/src/common/package.json /usr/src/common/yarn.lock 148 ADD . . 149 `, string(newDf)) 150 } 151 } 152 153 func TestInjectBuildArgDefault(t *testing.T) { 154 df := Dockerfile(` 155 ARG TAG="latest" 156 FROM gcr.io/windmill/foo:${TAG} 157 ADD . . 158 `) 159 ref := container.MustParseNamedTagged("gcr.io/windmill/foo:deadbeef") 160 newDf, modified, err := InjectImageDigest(df, container.NameSelector(ref), ref, nil) 161 if assert.NoError(t, err) { 162 assert.True(t, modified) 163 assert.Equal(t, ` 164 ARG TAG="latest" 165 FROM gcr.io/windmill/foo:deadbeef 166 ADD . . 167 `, string(newDf)) 168 } 169 } 170 171 func TestInjectBuildArgNoDefault(t *testing.T) { 172 df := Dockerfile(` 173 ARG TAG 174 FROM gcr.io/windmill/foo:${TAG} 175 ADD . . 176 `) 177 ref := container.MustParseNamedTagged("gcr.io/windmill/foo:deadbeef") 178 newDf, modified, err := InjectImageDigest(df, container.NameSelector(ref), ref, []string{"TAG=latest"}) 179 if assert.NoError(t, err) { 180 assert.True(t, modified) 181 // N.B. the rendered AST should still maintain the original value for the build arg 182 assert.Equal(t, ` 183 ARG TAG 184 FROM gcr.io/windmill/foo:deadbeef 185 ADD . . 186 `, string(newDf)) 187 } 188 } 189 190 func TestInjectBuildArgOverride(t *testing.T) { 191 df := Dockerfile(` 192 ARG TAG="latest" 193 FROM gcr.io/windmill/foo:${TAG} 194 ADD . . 195 `) 196 ref := container.MustParseNamedTagged("gcr.io/windmill/foo:deadbeef") 197 newDf, modified, err := InjectImageDigest(df, container.NameSelector(ref), ref, []string{"TAG=v2.0.1"}) 198 if assert.NoError(t, err) { 199 assert.True(t, modified) 200 // N.B. the rendered AST should still maintain the original value for the build arg 201 assert.Equal(t, ` 202 ARG TAG="latest" 203 FROM gcr.io/windmill/foo:deadbeef 204 ADD . . 205 `, string(newDf)) 206 } 207 }