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  }