@@ -2,8 +2,10 @@ package bake
22
33import (
44 "reflect"
5+ "regexp"
56 "testing"
67
8+ hcl "github.com/hashicorp/hcl/v2"
79 "github.com/stretchr/testify/require"
810)
911
@@ -647,7 +649,7 @@ func TestHCLAttrsCapsuleType(t *testing.T) {
647649 require .Equal (t , []string {"default" , "key=path/to/key" }, stringify (c .Targets [0 ].SSH ))
648650}
649651
650- func TestHCLAttrsCapsuleTypeVars (t * testing.T ) {
652+ func TestHCLAttrsCapsuleType_ObjectVars (t * testing.T ) {
651653 dt := []byte (`
652654 variable "foo" {
653655 default = "bar"
@@ -716,6 +718,52 @@ func TestHCLAttrsCapsuleTypeVars(t *testing.T) {
716718 require .Equal (t , []string {"id=oci,src=/local/secret" }, stringify (web .Secrets ))
717719}
718720
721+ func TestHCLAttrsCapsuleType_MissingVars (t * testing.T ) {
722+ dt := []byte (`
723+ target "app" {
724+ attest = [
725+ "type=sbom,disabled=${SBOM}",
726+ ]
727+
728+ cache-from = [
729+ { type = "registry", ref = "user/app:${FOO1}" },
730+ "type=local,src=path/to/cache:${FOO2}",
731+ ]
732+
733+ cache-to = [
734+ { type = "local", dest = "path/to/${BAR}" },
735+ ]
736+
737+ output = [
738+ { type = "oci", dest = "../${OUTPUT}.tar" },
739+ ]
740+
741+ secret = [
742+ { id = "mysecret", src = "/local/${SECRET}" },
743+ ]
744+
745+ ssh = [
746+ { id = "key", paths = ["path/to/${SSH_KEY}"] },
747+ ]
748+ }
749+ ` )
750+
751+ var diags hcl.Diagnostics
752+ _ , err := ParseFile (dt , "docker-bake.hcl" )
753+ require .ErrorAs (t , err , & diags )
754+
755+ re := regexp .MustCompile (`There is no variable named "([\w\d_]+)"` )
756+ var actual []string
757+ for _ , diag := range diags {
758+ if m := re .FindStringSubmatch (diag .Error ()); m != nil {
759+ actual = append (actual , m [1 ])
760+ }
761+ }
762+ require .ElementsMatch (t ,
763+ []string {"SBOM" , "FOO1" , "FOO2" , "BAR" , "OUTPUT" , "SECRET" , "SSH_KEY" },
764+ actual )
765+ }
766+
719767func TestHCLMultiFileAttrs (t * testing.T ) {
720768 dt := []byte (`
721769 variable "FOO" {
0 commit comments