diff --git a/pkg/dockerfile/client_test.go b/pkg/dockerfile/client_test.go new file mode 100644 index 00000000..d7e6ae15 --- /dev/null +++ b/pkg/dockerfile/client_test.go @@ -0,0 +1,74 @@ +package dockerfile_test + +import ( + "fmt" + "os" + "testing" + + "github.com/crazy-max/diun/v4/pkg/dockerfile" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +var ( + dc *dockerfile.Client +) + +func TestMain(m *testing.M) { + var err error + + dc, err = dockerfile.New(dockerfile.Options{ + Filename: "./fixtures/valid.Dockerfile", + }) + if err != nil { + panic(err.Error()) + } + + os.Exit(m.Run()) +} + +func TestNew(t *testing.T) { + assert.NotNil(t, dc) +} + +func TestLoadFile(t *testing.T) { + cases := []struct { + name string + dfile string + wantErr bool + }{ + { + name: "Failed on non-existing file", + dfile: "", + wantErr: true, + }, + { + name: "Fail on empty file", + dfile: "./fixtures/empty.Dockerfile", + wantErr: true, + }, + { + name: "Fail on wrong file format", + dfile: "./fixtures/invalid.Dockerfile", + wantErr: true, + }, + { + name: "Valid", + dfile: "./fixtures/valid.Dockerfile", + wantErr: false, + }, + } + for _, tt := range cases { + t.Run(tt.name, func(t *testing.T) { + c, err := dockerfile.New(dockerfile.Options{ + Filename: tt.dfile, + }) + if tt.wantErr { + fmt.Println(err) + require.Error(t, err) + return + } + assert.NotNil(t, c) + }) + } +} diff --git a/pkg/dockerfile/fixtures/empty.Dockerfile b/pkg/dockerfile/fixtures/empty.Dockerfile new file mode 100644 index 00000000..e69de29b diff --git a/pkg/dockerfile/fixtures/invalid.Dockerfile b/pkg/dockerfile/fixtures/invalid.Dockerfile new file mode 100644 index 00000000..7f173134 --- /dev/null +++ b/pkg/dockerfile/fixtures/invalid.Dockerfile @@ -0,0 +1 @@ +invalid dockerfile diff --git a/pkg/dockerfile/fixtures/valid.Dockerfile b/pkg/dockerfile/fixtures/valid.Dockerfile new file mode 100644 index 00000000..a295b329 --- /dev/null +++ b/pkg/dockerfile/fixtures/valid.Dockerfile @@ -0,0 +1,17 @@ +# syntax=docker/dockerfile:1.3 +ARG ALPINE_VERSION=3.14 + +# diun.platform=linux/amd64 +FROM alpine:${ALPINE_VERSION} + +# diun.watch_repo=true +# diun.max_tags=10 +# diun.platform=linux/amd64 +COPY --from=crazymax/yasu / / + +# diun.watch_repo=true +# diun.include_tags=^\d+\.\d+\.\d+$ +# diun.platform=linux/amd64 +RUN --mount=type=bind,target=.,rw \ + --mount=type=bind,from=crazymax/docker:20.10.6,source=/usr/local/bin/docker,target=/usr/bin/docker \ + yasu --version diff --git a/pkg/dockerfile/image.go b/pkg/dockerfile/image.go index a7ded6bf..fb177d6e 100644 --- a/pkg/dockerfile/image.go +++ b/pkg/dockerfile/image.go @@ -1,6 +1,8 @@ package dockerfile import ( + "strings" + "github.com/moby/buildkit/frontend/dockerfile/command" "github.com/moby/buildkit/frontend/dockerfile/instructions" "github.com/pkg/errors" @@ -29,7 +31,7 @@ func (c *Client) FromImages() (Images, error) { images := Images{} for _, node := range c.ast.Children { - switch node.Value { + switch strings.ToLower(node.Value) { case command.From: ins, err := instructions.ParseInstruction(node) if err != nil { diff --git a/pkg/dockerfile/image_test.go b/pkg/dockerfile/image_test.go new file mode 100644 index 00000000..a4d909fa --- /dev/null +++ b/pkg/dockerfile/image_test.go @@ -0,0 +1,34 @@ +package dockerfile_test + +import ( + "testing" + + "github.com/crazy-max/diun/v4/pkg/dockerfile" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestFromImages(t *testing.T) { + c, err := dockerfile.New(dockerfile.Options{ + Filename: "./fixtures/valid.Dockerfile", + }) + require.NoError(t, err) + require.NotNil(t, c) + + img, err := c.FromImages() + require.NoError(t, err) + require.NotNil(t, img) + require.Equal(t, 3, len(img)) + + assert.Equal(t, "alpine:3.14", img[0].Name) + assert.Equal(t, 5, img[0].Line) + assert.Equal(t, []string{"diun.platform=linux/amd64"}, img[0].Comments) + + assert.Equal(t, "crazymax/yasu", img[1].Name) + assert.Equal(t, 10, img[1].Line) + assert.Equal(t, []string{"diun.watch_repo=true", "diun.max_tags=10", "diun.platform=linux/amd64"}, img[1].Comments) + + assert.Equal(t, "crazymax/docker:20.10.6", img[2].Name) + assert.Equal(t, 15, img[2].Line) + assert.Equal(t, []string{"diun.watch_repo=true", "diun.include_tags=^\\d+\\.\\d+\\.\\d+$", "diun.platform=linux/amd64"}, img[2].Comments) +}