diff --git a/bake/hcl_test.go b/bake/hcl_test.go index c18c5286..1881543b 100644 --- a/bake/hcl_test.go +++ b/bake/hcl_test.go @@ -8,65 +8,156 @@ import ( ) func TestParseHCL(t *testing.T) { - os.Setenv("BUILD_NUMBER", "456") - - var dt = []byte(` - variable "BUILD_NUMBER" { - default = "123" - } - - group "default" { - targets = ["db", "webapp"] - } - - target "db" { - context = "./db" - tags = ["docker.io/tonistiigi/db"] - } - - target "webapp" { - context = "./dir" - dockerfile = "Dockerfile-alternate" - args = { - buildno = "${BUILD_NUMBER}" + t.Parallel() + + t.Run("Basic", func(t *testing.T) { + dt := []byte(` + group "default" { + targets = ["db", "webapp"] + } + + target "db" { + context = "./db" + tags = ["docker.io/tonistiigi/db"] + } + + target "webapp" { + context = "./dir" + dockerfile = "Dockerfile-alternate" + args = { + buildno = "123" + } } - } - - target "cross" { - platforms = [ - "linux/amd64", - "linux/arm64" - ] - } - - target "webapp-plus" { - inherits = ["webapp", "cross"] - args = { - IAMCROSS = "true" + + target "cross" { + platforms = [ + "linux/amd64", + "linux/arm64" + ] + } + + target "webapp-plus" { + inherits = ["webapp", "cross"] + args = { + IAMCROSS = "true" + } } - } - `) + `) + + c, err := ParseHCL(dt, "docker-bake.hcl") + require.NoError(t, err) + + require.Equal(t, 1, len(c.Groups)) + require.Equal(t, "default", c.Groups[0].Name) + require.Equal(t, []string{"db", "webapp"}, c.Groups[0].Targets) - c, err := ParseHCL(dt, "docker-bake.hcl") - require.NoError(t, err) + require.Equal(t, 4, len(c.Targets)) + require.Equal(t, c.Targets[0].Name, "db") + require.Equal(t, "./db", *c.Targets[0].Context) - require.Equal(t, 1, len(c.Groups)) - require.Equal(t, "default", c.Groups[0].Name) - require.Equal(t, []string{"db", "webapp"}, c.Groups[0].Targets) + require.Equal(t, c.Targets[1].Name, "webapp") + require.Equal(t, 1, len(c.Targets[1].Args)) + require.Equal(t, "123", c.Targets[1].Args["buildno"]) - require.Equal(t, 4, len(c.Targets)) - require.Equal(t, c.Targets[0].Name, "db") - require.Equal(t, "./db", *c.Targets[0].Context) + require.Equal(t, c.Targets[2].Name, "cross") + require.Equal(t, 2, len(c.Targets[2].Platforms)) + require.Equal(t, []string{"linux/amd64", "linux/arm64"}, c.Targets[2].Platforms) - require.Equal(t, c.Targets[1].Name, "webapp") - require.Equal(t, 1, len(c.Targets[1].Args)) - require.Equal(t, "456", c.Targets[1].Args["buildno"]) + require.Equal(t, c.Targets[3].Name, "webapp-plus") + require.Equal(t, 1, len(c.Targets[3].Args)) + require.Equal(t, map[string]string{"IAMCROSS": "true"}, c.Targets[3].Args) + }) + + t.Run("WithFunctions", func(t *testing.T) { + dt := []byte(` + group "default" { + targets = ["webapp"] + } + + target "webapp" { + args = { + buildno = "${add(123, 1)}" + } + } + `) + + c, err := ParseHCL(dt, "docker-bake.hcl") + require.NoError(t, err) + + require.Equal(t, 1, len(c.Groups)) + require.Equal(t, "default", c.Groups[0].Name) + require.Equal(t, []string{"webapp"}, c.Groups[0].Targets) + + require.Equal(t, 1, len(c.Targets)) + require.Equal(t, c.Targets[0].Name, "webapp") + require.Equal(t, "124", c.Targets[0].Args["buildno"]) + }) + + t.Run("WithVariables", func(t *testing.T) { + dt := []byte(` + variable "BUILD_NUMBER" { + default = "123" + } - require.Equal(t, c.Targets[2].Name, "cross") - require.Equal(t, 2, len(c.Targets[2].Platforms)) - require.Equal(t, []string{"linux/amd64", "linux/arm64"}, c.Targets[2].Platforms) + group "default" { + targets = ["webapp"] + } + + target "webapp" { + args = { + buildno = "${BUILD_NUMBER}" + } + } + `) + + c, err := ParseHCL(dt, "docker-bake.hcl") + require.NoError(t, err) + + require.Equal(t, 1, len(c.Groups)) + require.Equal(t, "default", c.Groups[0].Name) + require.Equal(t, []string{"webapp"}, c.Groups[0].Targets) + + require.Equal(t, 1, len(c.Targets)) + require.Equal(t, c.Targets[0].Name, "webapp") + require.Equal(t, "123", c.Targets[0].Args["buildno"]) + + os.Setenv("BUILD_NUMBER", "456") + + c, err = ParseHCL(dt, "docker-bake.hcl") + require.NoError(t, err) + + require.Equal(t, 1, len(c.Groups)) + require.Equal(t, "default", c.Groups[0].Name) + require.Equal(t, []string{"webapp"}, c.Groups[0].Targets) + + require.Equal(t, 1, len(c.Targets)) + require.Equal(t, c.Targets[0].Name, "webapp") + require.Equal(t, "456", c.Targets[0].Args["buildno"]) + }) + + t.Run("WithIncorrectVariables", func(t *testing.T) { + dt := []byte(` + variable "DEFAULT_BUILD_NUMBER" { + default = "1" + } + + variable "BUILD_NUMBER" { + default = "${DEFAULT_BUILD_NUMBER}" + } + + group "default" { + targets = ["webapp"] + } + + target "webapp" { + args = { + buildno = "${BUILD_NUMBER}" + } + } + `) - require.Equal(t, c.Targets[3].Name, "webapp-plus") - require.Equal(t, 1, len(c.Targets[3].Args)) - require.Equal(t, map[string]string{"IAMCROSS": "true"}, c.Targets[3].Args) + _, err := ParseHCL(dt, "docker-bake.hcl") + require.Error(t, err) + require.Contains(t, err.Error(), "docker-bake.hcl:7,17-37: Variables not allowed; Variables may not be used here.") + }) }