[fidl][go] Validate enums in Go bindings
Emitting an `I_EnumValues` method to retrieve all possible values of an
enum when creating a marhsaler.
See I1f7854f6b0eb79f1f26fb6efec581627118cd652 for validation using this
method in the Go FIDL runtime.
Test: fx test fidl_go_conformance
Bug: 8007
Change-Id: Ibf130e8a621bcf5d5391eabee8b4cd46a73ef5cf
Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/404855
Reviewed-by: Felix Zhu <fcz@google.com>
Testability-Review: Felix Zhu <fcz@google.com>
Commit-Queue: Pascal Perez <pascallouis@google.com>
diff --git a/garnet/go/src/fidl/compiler/backend/goldens/consts.test.json.go.golden b/garnet/go/src/fidl/compiler/backend/goldens/consts.test.json.go.golden
index b7592ff..c840ba3 100644
--- a/garnet/go/src/fidl/compiler/backend/goldens/consts.test.json.go.golden
+++ b/garnet/go/src/fidl/compiler/backend/goldens/consts.test.json.go.golden
@@ -25,6 +25,11 @@
EnumTypeValue EnumType = 1
)
+func (_ EnumType) I_EnumValues() []EnumType {
+ return []EnumType{
+ EnumTypeValue,
+ }
+}
func (x EnumType) String() string {
switch x {
case 1:
@@ -39,6 +44,11 @@
BitsTypeValue BitsType = 1
)
+func (_ BitsType) I_EnumValues() []BitsType {
+ return []BitsType{
+ BitsTypeValue,
+ }
+}
func (x BitsType) String() string {
switch x {
case 1:
diff --git a/garnet/go/src/fidl/compiler/backend/goldens/doc_comments.test.json.go.golden b/garnet/go/src/fidl/compiler/backend/goldens/doc_comments.test.json.go.golden
index 630e83c..da57b09 100644
--- a/garnet/go/src/fidl/compiler/backend/goldens/doc_comments.test.json.go.golden
+++ b/garnet/go/src/fidl/compiler/backend/goldens/doc_comments.test.json.go.golden
@@ -23,6 +23,12 @@
MyEnumBar MyEnum = 2
)
+func (_ MyEnum) I_EnumValues() []MyEnum {
+ return []MyEnum{
+ MyEnumFoo,
+ MyEnumBar,
+ }
+}
func (x MyEnum) String() string {
switch x {
case 1:
diff --git a/garnet/go/src/fidl/compiler/backend/goldens/enum.test.json.go.golden b/garnet/go/src/fidl/compiler/backend/goldens/enum.test.json.go.golden
index 22822ad..07f99e0 100644
--- a/garnet/go/src/fidl/compiler/backend/goldens/enum.test.json.go.golden
+++ b/garnet/go/src/fidl/compiler/backend/goldens/enum.test.json.go.golden
@@ -9,6 +9,12 @@
MyStrictEnumBar MyStrictEnum = 2
)
+func (_ MyStrictEnum) I_EnumValues() []MyStrictEnum {
+ return []MyStrictEnum{
+ MyStrictEnumFoo,
+ MyStrictEnumBar,
+ }
+}
func (x MyStrictEnum) String() string {
switch x {
case 1:
diff --git a/garnet/go/src/fidl/compiler/backend/goldens/handles.test.json.go.golden b/garnet/go/src/fidl/compiler/backend/goldens/handles.test.json.go.golden
index 1043d18..04f9479 100644
--- a/garnet/go/src/fidl/compiler/backend/goldens/handles.test.json.go.golden
+++ b/garnet/go/src/fidl/compiler/backend/goldens/handles.test.json.go.golden
@@ -42,6 +42,40 @@
ObjTypeMsiInterrupt ObjType = 33
)
+func (_ ObjType) I_EnumValues() []ObjType {
+ return []ObjType{
+ ObjTypeNone,
+ ObjTypeProcess,
+ ObjTypeThread,
+ ObjTypeVmo,
+ ObjTypeChannel,
+ ObjTypeEvent,
+ ObjTypePort,
+ ObjTypeInterrupt,
+ ObjTypePciDevice,
+ ObjTypeLog,
+ ObjTypeSocket,
+ ObjTypeResource,
+ ObjTypeEventpair,
+ ObjTypeJob,
+ ObjTypeVmar,
+ ObjTypeFifo,
+ ObjTypeGuest,
+ ObjTypeVcpu,
+ ObjTypeTimer,
+ ObjTypeIommu,
+ ObjTypeBti,
+ ObjTypeProfile,
+ ObjTypePmt,
+ ObjTypeSuspendToken,
+ ObjTypePager,
+ ObjTypeException,
+ ObjTypeClock,
+ ObjTypeStream,
+ ObjTypeMsiAllocation,
+ ObjTypeMsiInterrupt,
+ }
+}
func (x ObjType) String() string {
switch x {
case 0:
diff --git a/garnet/go/src/fidl/compiler/backend/goldens/handles_in_types.test.json.go.golden b/garnet/go/src/fidl/compiler/backend/goldens/handles_in_types.test.json.go.golden
index 357ee6b..26199f1 100644
--- a/garnet/go/src/fidl/compiler/backend/goldens/handles_in_types.test.json.go.golden
+++ b/garnet/go/src/fidl/compiler/backend/goldens/handles_in_types.test.json.go.golden
@@ -14,6 +14,12 @@
ObjTypeVmo ObjType = 3
)
+func (_ ObjType) I_EnumValues() []ObjType {
+ return []ObjType{
+ ObjTypeNone,
+ ObjTypeVmo,
+ }
+}
func (x ObjType) String() string {
switch x {
case 0:
diff --git a/garnet/go/src/fidl/compiler/backend/goldens/placement_of_attributes.test.json.go.golden b/garnet/go/src/fidl/compiler/backend/goldens/placement_of_attributes.test.json.go.golden
index d04ec46..e0b2d04 100644
--- a/garnet/go/src/fidl/compiler/backend/goldens/placement_of_attributes.test.json.go.golden
+++ b/garnet/go/src/fidl/compiler/backend/goldens/placement_of_attributes.test.json.go.golden
@@ -17,6 +17,11 @@
ExampleEnumMember ExampleEnum = 1
)
+func (_ ExampleEnum) I_EnumValues() []ExampleEnum {
+ return []ExampleEnum{
+ ExampleEnumMember,
+ }
+}
func (x ExampleEnum) String() string {
switch x {
case 1:
diff --git a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.json.go.golden b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.json.go.golden
index 6682039..e49eb9b 100644
--- a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.json.go.golden
+++ b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.json.go.golden
@@ -14,6 +14,12 @@
ObjTypeSocket ObjType = 14
)
+func (_ ObjType) I_EnumValues() []ObjType {
+ return []ObjType{
+ ObjTypeNone,
+ ObjTypeSocket,
+ }
+}
func (x ObjType) String() string {
switch x {
case 0:
@@ -31,6 +37,12 @@
ErrorEnunErrBar ErrorEnun = 2
)
+func (_ ErrorEnun) I_EnumValues() []ErrorEnun {
+ return []ErrorEnun{
+ ErrorEnunErrFoo,
+ ErrorEnunErrBar,
+ }
+}
func (x ErrorEnun) String() string {
switch x {
case 1:
diff --git a/garnet/go/src/fidl/compiler/backend/goldens/type_aliases.test.json.go.golden b/garnet/go/src/fidl/compiler/backend/goldens/type_aliases.test.json.go.golden
index 3e9b874..53234f5 100644
--- a/garnet/go/src/fidl/compiler/backend/goldens/type_aliases.test.json.go.golden
+++ b/garnet/go/src/fidl/compiler/backend/goldens/type_aliases.test.json.go.golden
@@ -15,6 +15,12 @@
ObjTypeChannel ObjType = 4
)
+func (_ ObjType) I_EnumValues() []ObjType {
+ return []ObjType{
+ ObjTypeNone,
+ ObjTypeChannel,
+ }
+}
func (x ObjType) String() string {
switch x {
case 0:
diff --git a/tools/fidl/fidlgen_go/templates/enum.tmpl.go b/tools/fidl/fidlgen_go/templates/enum.tmpl.go
index 9491ee3..6e08cf7 100644
--- a/tools/fidl/fidlgen_go/templates/enum.tmpl.go
+++ b/tools/fidl/fidlgen_go/templates/enum.tmpl.go
@@ -15,6 +15,13 @@
{{ $.Name }}{{ .Name }} {{ $.Name }} = {{ .Value }}
{{- end }}
)
+func (_ {{.Name}}) I_EnumValues() []{{.Name}} {
+ return []{{.Name}}{
+ {{- range .Members }}
+ {{ $.Name }}{{ .Name }},
+ {{- end }}
+ }
+}
func (x {{.Name}}) String() string {
switch x {
{{- range .Members }}