Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 10 additions & 4 deletions internal/protohcl/primitives.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,14 +63,20 @@ func protoEnumFromCty(desc protoreflect.FieldDescriptor, val cty.Value) (protore
}

if val.IsNull() {
defaultValDesc := desc.DefaultEnumValue()
return protoreflect.ValueOfEnum(defaultValDesc.Number()), nil
if desc.HasDefault() {
defaultValDesc := desc.DefaultEnumValue()
return protoreflect.ValueOfEnum(defaultValDesc.Number()), nil
}
return protoreflect.Value{}, fmt.Errorf("no default value for type and value is null")
}

valDesc := desc.Enum().Values().ByName(protoreflect.Name(val.AsString()))
if valDesc == nil {
defaultValDesc := desc.DefaultEnumValue()
return protoreflect.ValueOfEnum(defaultValDesc.Number()), nil
if desc.HasDefault() {
defaultValDesc := desc.DefaultEnumValue()
return protoreflect.ValueOfEnum(defaultValDesc.Number()), nil
}
return protoreflect.Value{}, fmt.Errorf("no default value for type and value is invalid")
}

return protoreflect.ValueOfEnum(valDesc.Number()), nil
Expand Down
7 changes: 5 additions & 2 deletions internal/resourcehcl/any.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,15 @@ func (p anyProvider) AnyType(ctx *protohcl.UnmarshalContext, decoder protohcl.Me
if !isResource {
return p.base.AnyType(ctx, decoder)
}

resourceType := res.GetId().GetType()
if res == nil {
return "", nil, errors.New("ID.Type not found")
}

resourceType := res.GetId().GetType()
if resourceType == nil {
return "", nil, errors.New("ID.Type is nil")
}

reg, ok := p.reg.Resolve(resourceType)
if !ok {
return "", nil, fmt.Errorf("unknown resource type: %s", resource.ToGVK(resourceType))
Expand Down
3 changes: 3 additions & 0 deletions internal/resourcehcl/naming.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ func (n fieldNamer) GetField(fds protoreflect.FieldDescriptors, name string) pro
}
}

if len(name) <= 1 {
return fds.ByJSONName(name)
}
camel := strings.ToLower(name[:1]) + name[1:]
return fds.ByJSONName(camel)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("Data{}")
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("ID={\"\"=\"\"}")
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("ID {\nType = gvk(\"demo.v1.Artist\")\n} \nData {\nGenre = \"\"\n} ")
41 changes: 41 additions & 0 deletions internal/resourcehcl/unmarshal_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,47 @@ import (

var update = flag.Bool("update", false, "update golden files")

func FuzzUnmarshall(f *testing.F) {
entries, err := os.ReadDir("./testdata")
require.NoError(f, err)

read := func(t *testing.F, path string) ([]byte, bool) {
t.Helper()

bytes, err := os.ReadFile(fmt.Sprintf("./testdata/%s", path))
switch {
case err == nil:
return bytes, true
case os.IsNotExist(err):
return nil, false
}

t.Fatalf("failed to read file %s %v", path, err)
return nil, false
}
for _, entry := range entries {
ext := path.Ext(entry.Name())

if ext != ".hcl" {
continue
}
input, _ := read(f, entry.Name())
f.Add(input)
}
registry := resource.NewRegistry()
demo.RegisterTypes(registry)
mesh.RegisterTypes(registry)

f.Fuzz(func(t *testing.T, input []byte) {
got, err := resourcehcl.Unmarshal(input, registry)
if err != nil {
return
}
require.NotNil(t, got)
})

}

func TestUnmarshal(t *testing.T) {
entries, err := os.ReadDir("./testdata")
require.NoError(t, err)
Expand Down