github.com/jhump/protoreflect@v1.16.0/dynamic/message_factory_test.go (about) 1 package dynamic 2 3 import ( 4 "reflect" 5 "testing" 6 7 "github.com/golang/protobuf/proto" 8 "google.golang.org/protobuf/types/descriptorpb" 9 "google.golang.org/protobuf/types/known/anypb" 10 "google.golang.org/protobuf/types/known/durationpb" 11 "google.golang.org/protobuf/types/known/emptypb" 12 "google.golang.org/protobuf/types/known/structpb" 13 "google.golang.org/protobuf/types/known/timestamppb" 14 "google.golang.org/protobuf/types/known/wrapperspb" 15 16 "github.com/jhump/protoreflect/desc" 17 "github.com/jhump/protoreflect/internal/testprotos" 18 "github.com/jhump/protoreflect/internal/testutil" 19 ) 20 21 var wellKnownTypes = []proto.Message{ 22 (*wrapperspb.BoolValue)(nil), 23 (*wrapperspb.BytesValue)(nil), 24 (*wrapperspb.StringValue)(nil), 25 (*wrapperspb.FloatValue)(nil), 26 (*wrapperspb.DoubleValue)(nil), 27 (*wrapperspb.Int32Value)(nil), 28 (*wrapperspb.Int64Value)(nil), 29 (*wrapperspb.UInt32Value)(nil), 30 (*wrapperspb.UInt64Value)(nil), 31 (*timestamppb.Timestamp)(nil), 32 (*durationpb.Duration)(nil), 33 (*anypb.Any)(nil), 34 (*emptypb.Empty)(nil), 35 (*structpb.Struct)(nil), 36 (*structpb.Value)(nil), 37 (*structpb.ListValue)(nil), 38 } 39 40 func TestKnownTypeRegistry_AddKnownType(t *testing.T) { 41 ktr := &KnownTypeRegistry{} 42 dp := (*descriptorpb.DescriptorProto)(nil) 43 ktr.AddKnownType(dp) 44 45 checkKnownTypes(t, ktr, wellKnownTypes...) 46 checkKnownTypes(t, ktr, dp) 47 checkUnknownTypes(t, ktr, (*descriptorpb.FileDescriptorProto)(nil), (*testprotos.TestMessage)(nil)) 48 } 49 50 func TestKnownTypeRegistry_WithoutWellKnownTypes(t *testing.T) { 51 ktr := NewKnownTypeRegistryWithoutWellKnownTypes() 52 dp := (*descriptorpb.DescriptorProto)(nil) 53 ktr.AddKnownType(dp) 54 55 checkKnownTypes(t, ktr, dp) 56 checkUnknownTypes(t, ktr, wellKnownTypes...) 57 checkUnknownTypes(t, ktr, (*descriptorpb.FileDescriptorProto)(nil), (*testprotos.TestMessage)(nil)) 58 } 59 60 func TestKnownTypeRegistry_WithDefaults(t *testing.T) { 61 ktr := NewKnownTypeRegistryWithDefaults() 62 dp := (*descriptorpb.DescriptorProto)(nil) 63 64 // they're all known 65 checkKnownTypes(t, ktr, dp) 66 checkKnownTypes(t, ktr, (*descriptorpb.DescriptorProto)(nil), (*descriptorpb.FileDescriptorProto)(nil), (*testprotos.TestMessage)(nil)) 67 } 68 69 func TestKnownTypeRegistry_WithDefaults_MapEntry(t *testing.T) { 70 ktr := NewKnownTypeRegistryWithDefaults() 71 msgType := ktr.GetKnownType("testprotos.MapKeyFields.SEntry") 72 testutil.Require(t, msgType == nil, "should not be a known type for map entry but got %v", msgType) 73 } 74 75 func checkKnownTypes(t *testing.T, ktr *KnownTypeRegistry, knownTypes ...proto.Message) { 76 for _, kt := range knownTypes { 77 md, err := desc.LoadMessageDescriptorForMessage(kt) 78 testutil.Ok(t, err) 79 m := ktr.CreateIfKnown(md.GetFullyQualifiedName()) 80 testutil.Require(t, m != nil, "%v should be a known type", reflect.TypeOf(kt)) 81 testutil.Eq(t, reflect.TypeOf(kt), reflect.TypeOf(m)) 82 } 83 } 84 85 func checkUnknownTypes(t *testing.T, ktr *KnownTypeRegistry, unknownTypes ...proto.Message) { 86 for _, kt := range unknownTypes { 87 md, err := desc.LoadMessageDescriptorForMessage(kt) 88 testutil.Ok(t, err) 89 m := ktr.CreateIfKnown(md.GetFullyQualifiedName()) 90 testutil.Require(t, m == nil, "%v should not be a known type", reflect.TypeOf(kt)) 91 } 92 } 93 94 func TestMessageFactory(t *testing.T) { 95 mf := &MessageFactory{} 96 97 checkTypes(t, mf, false, wellKnownTypes...) 98 checkTypes(t, mf, true, (*descriptorpb.DescriptorProto)(nil), (*descriptorpb.FileDescriptorProto)(nil), (*testprotos.TestMessage)(nil)) 99 } 100 101 func TestMessageFactory_WithDefaults(t *testing.T) { 102 mf := NewMessageFactoryWithDefaults() 103 104 checkTypes(t, mf, false, wellKnownTypes...) 105 checkTypes(t, mf, false, (*descriptorpb.DescriptorProto)(nil), (*descriptorpb.FileDescriptorProto)(nil), (*testprotos.TestMessage)(nil)) 106 } 107 108 func TestMessageFactory_WithKnownTypeRegistry(t *testing.T) { 109 ktr := NewKnownTypeRegistryWithoutWellKnownTypes() 110 mf := NewMessageFactoryWithKnownTypeRegistry(ktr) 111 112 checkTypes(t, mf, true, wellKnownTypes...) 113 checkTypes(t, mf, true, (*descriptorpb.DescriptorProto)(nil), (*descriptorpb.FileDescriptorProto)(nil), (*testprotos.TestMessage)(nil)) 114 } 115 116 func checkTypes(t *testing.T, mf *MessageFactory, dynamic bool, types ...proto.Message) { 117 for _, typ := range types { 118 md, err := desc.LoadMessageDescriptorForMessage(typ) 119 testutil.Ok(t, err) 120 m := mf.NewMessage(md) 121 if dynamic { 122 testutil.Eq(t, typeOfDynamicMessage, reflect.TypeOf(m)) 123 } else { 124 testutil.Eq(t, reflect.TypeOf(typ), reflect.TypeOf(m)) 125 } 126 } 127 128 }