1*1c12ee1eSDan Willemsen// Copyright 2019 The Go Authors. All rights reserved. 2*1c12ee1eSDan Willemsen// Use of this source code is governed by a BSD-style 3*1c12ee1eSDan Willemsen// license that can be found in the LICENSE file. 4*1c12ee1eSDan Willemsen 5*1c12ee1eSDan Willemsenpackage main 6*1c12ee1eSDan Willemsen 7*1c12ee1eSDan Willemsenimport ( 8*1c12ee1eSDan Willemsen "testing" 9*1c12ee1eSDan Willemsen 10*1c12ee1eSDan Willemsen "google.golang.org/protobuf/proto" 11*1c12ee1eSDan Willemsen "google.golang.org/protobuf/reflect/protoreflect" 12*1c12ee1eSDan Willemsen 13*1c12ee1eSDan Willemsen retentionpb "google.golang.org/protobuf/cmd/protoc-gen-go/testdata/retention" 14*1c12ee1eSDan Willemsen) 15*1c12ee1eSDan Willemsen 16*1c12ee1eSDan Willemsenfunc TestFileOptionRetention(t *testing.T) { 17*1c12ee1eSDan Willemsen options := retentionpb.File_cmd_protoc_gen_go_testdata_retention_retention_proto.Options() 18*1c12ee1eSDan Willemsen tests := []struct { 19*1c12ee1eSDan Willemsen name string 20*1c12ee1eSDan Willemsen ext protoreflect.ExtensionType 21*1c12ee1eSDan Willemsen wantField bool 22*1c12ee1eSDan Willemsen wantValue int32 23*1c12ee1eSDan Willemsen }{ 24*1c12ee1eSDan Willemsen { 25*1c12ee1eSDan Willemsen name: "imported_plain_option", 26*1c12ee1eSDan Willemsen ext: retentionpb.E_ImportedPlainOption, 27*1c12ee1eSDan Willemsen wantField: true, 28*1c12ee1eSDan Willemsen wantValue: 1, 29*1c12ee1eSDan Willemsen }, 30*1c12ee1eSDan Willemsen { 31*1c12ee1eSDan Willemsen name: "imported_runtime_option", 32*1c12ee1eSDan Willemsen ext: retentionpb.E_ImportedRuntimeRetentionOption, 33*1c12ee1eSDan Willemsen wantField: true, 34*1c12ee1eSDan Willemsen wantValue: 2, 35*1c12ee1eSDan Willemsen }, 36*1c12ee1eSDan Willemsen { 37*1c12ee1eSDan Willemsen name: "imported_source_option", 38*1c12ee1eSDan Willemsen ext: retentionpb.E_ImportedSourceRetentionOption, 39*1c12ee1eSDan Willemsen wantField: false, 40*1c12ee1eSDan Willemsen wantValue: 0, 41*1c12ee1eSDan Willemsen }, 42*1c12ee1eSDan Willemsen { 43*1c12ee1eSDan Willemsen name: "plain_option", 44*1c12ee1eSDan Willemsen ext: retentionpb.E_PlainOption, 45*1c12ee1eSDan Willemsen wantField: true, 46*1c12ee1eSDan Willemsen wantValue: 1, 47*1c12ee1eSDan Willemsen }, 48*1c12ee1eSDan Willemsen { 49*1c12ee1eSDan Willemsen name: "runtime_option", 50*1c12ee1eSDan Willemsen ext: retentionpb.E_RuntimeRetentionOption, 51*1c12ee1eSDan Willemsen wantField: true, 52*1c12ee1eSDan Willemsen wantValue: 2, 53*1c12ee1eSDan Willemsen }, 54*1c12ee1eSDan Willemsen { 55*1c12ee1eSDan Willemsen name: "source_option", 56*1c12ee1eSDan Willemsen ext: retentionpb.E_SourceRetentionOption, 57*1c12ee1eSDan Willemsen wantField: false, 58*1c12ee1eSDan Willemsen wantValue: 0, 59*1c12ee1eSDan Willemsen }, 60*1c12ee1eSDan Willemsen } 61*1c12ee1eSDan Willemsen 62*1c12ee1eSDan Willemsen for _, test := range tests { 63*1c12ee1eSDan Willemsen if test.wantField != proto.HasExtension(options, test.ext) { 64*1c12ee1eSDan Willemsen t.Errorf("HasExtension(%s): got %v, want %v", test.name, proto.HasExtension(options, test.ext), test.wantField) 65*1c12ee1eSDan Willemsen } 66*1c12ee1eSDan Willemsen if test.wantValue != proto.GetExtension(options, test.ext).(int32) { 67*1c12ee1eSDan Willemsen t.Errorf("GetExtension(%s): got %d, want %d", test.name, proto.GetExtension(options, test.ext).(int32), test.wantValue) 68*1c12ee1eSDan Willemsen } 69*1c12ee1eSDan Willemsen } 70*1c12ee1eSDan Willemsen} 71*1c12ee1eSDan Willemsen 72*1c12ee1eSDan Willemsenfunc TestAllEntitiesWithMessageOption(t *testing.T) { 73*1c12ee1eSDan Willemsen file := retentionpb.File_cmd_protoc_gen_go_testdata_retention_retention_proto 74*1c12ee1eSDan Willemsen verifyDescriptorOptions(t, string(file.Name()), file.Options()) 75*1c12ee1eSDan Willemsen verifyEnums(t, file.Enums()) 76*1c12ee1eSDan Willemsen verifyMessages(t, file.Messages()) 77*1c12ee1eSDan Willemsen verifyExtensions(t, file.Extensions()) 78*1c12ee1eSDan Willemsen verifyServices(t, file.Services()) 79*1c12ee1eSDan Willemsen} 80*1c12ee1eSDan Willemsen 81*1c12ee1eSDan Willemsenfunc verifyExtensions(t *testing.T, extensions protoreflect.ExtensionDescriptors) { 82*1c12ee1eSDan Willemsen t.Helper() 83*1c12ee1eSDan Willemsen for i := 0; i < extensions.Len(); i++ { 84*1c12ee1eSDan Willemsen verifyDescriptorOptions(t, string(extensions.Get(i).Name()), extensions.Get(i).Options()) 85*1c12ee1eSDan Willemsen } 86*1c12ee1eSDan Willemsen} 87*1c12ee1eSDan Willemsen 88*1c12ee1eSDan Willemsenfunc verifyMessages(t *testing.T, messages protoreflect.MessageDescriptors) { 89*1c12ee1eSDan Willemsen t.Helper() 90*1c12ee1eSDan Willemsen for i := 0; i < messages.Len(); i++ { 91*1c12ee1eSDan Willemsen verifyDescriptorOptions(t, string(messages.Get(i).Name()), messages.Get(i).Options()) 92*1c12ee1eSDan Willemsen verifyEnums(t, messages.Get(i).Enums()) 93*1c12ee1eSDan Willemsen verifyMessages(t, messages.Get(i).Messages()) 94*1c12ee1eSDan Willemsen verifyExtensions(t, messages.Get(i).Extensions()) 95*1c12ee1eSDan Willemsen verifyFields(t, messages.Get(i).Fields()) 96*1c12ee1eSDan Willemsen } 97*1c12ee1eSDan Willemsen} 98*1c12ee1eSDan Willemsen 99*1c12ee1eSDan Willemsenfunc verifyFields(t *testing.T, fields protoreflect.FieldDescriptors) { 100*1c12ee1eSDan Willemsen t.Helper() 101*1c12ee1eSDan Willemsen for i := 0; i < fields.Len(); i++ { 102*1c12ee1eSDan Willemsen verifyDescriptorOptions(t, string(fields.Get(i).Name()), fields.Get(i).Options()) 103*1c12ee1eSDan Willemsen } 104*1c12ee1eSDan Willemsen} 105*1c12ee1eSDan Willemsen 106*1c12ee1eSDan Willemsenfunc verifyEnums(t *testing.T, enums protoreflect.EnumDescriptors) { 107*1c12ee1eSDan Willemsen t.Helper() 108*1c12ee1eSDan Willemsen for i := 0; i < enums.Len(); i++ { 109*1c12ee1eSDan Willemsen verifyDescriptorOptions(t, string(enums.Get(i).Name()), enums.Get(i).Options()) 110*1c12ee1eSDan Willemsen verifyEnumValues(t, enums.Get(i).Values()) 111*1c12ee1eSDan Willemsen } 112*1c12ee1eSDan Willemsen} 113*1c12ee1eSDan Willemsen 114*1c12ee1eSDan Willemsenfunc verifyEnumValues(t *testing.T, values protoreflect.EnumValueDescriptors) { 115*1c12ee1eSDan Willemsen t.Helper() 116*1c12ee1eSDan Willemsen for i := 0; i < values.Len(); i++ { 117*1c12ee1eSDan Willemsen verifyDescriptorOptions(t, string(values.Get(i).Name()), values.Get(i).Options()) 118*1c12ee1eSDan Willemsen } 119*1c12ee1eSDan Willemsen} 120*1c12ee1eSDan Willemsen 121*1c12ee1eSDan Willemsenfunc verifyServices(t *testing.T, services protoreflect.ServiceDescriptors) { 122*1c12ee1eSDan Willemsen t.Helper() 123*1c12ee1eSDan Willemsen for i := 0; i < services.Len(); i++ { 124*1c12ee1eSDan Willemsen verifyDescriptorOptions(t, string(services.Get(i).Name()), services.Get(i).Options()) 125*1c12ee1eSDan Willemsen verifyMethods(t, services.Get(i).Methods()) 126*1c12ee1eSDan Willemsen } 127*1c12ee1eSDan Willemsen} 128*1c12ee1eSDan Willemsen 129*1c12ee1eSDan Willemsenfunc verifyMethods(t *testing.T, methods protoreflect.MethodDescriptors) { 130*1c12ee1eSDan Willemsen t.Helper() 131*1c12ee1eSDan Willemsen for i := 0; i < methods.Len(); i++ { 132*1c12ee1eSDan Willemsen verifyDescriptorOptions(t, string(methods.Get(i).Name()), methods.Get(i).Options()) 133*1c12ee1eSDan Willemsen } 134*1c12ee1eSDan Willemsen} 135*1c12ee1eSDan Willemsen 136*1c12ee1eSDan Willemsenfunc verifyDescriptorOptions(t *testing.T, entity string, options protoreflect.ProtoMessage) { 137*1c12ee1eSDan Willemsen t.Helper() 138*1c12ee1eSDan Willemsen options.ProtoReflect().Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { 139*1c12ee1eSDan Willemsen maybeVerifyOption(t, fd, v) 140*1c12ee1eSDan Willemsen return true 141*1c12ee1eSDan Willemsen }) 142*1c12ee1eSDan Willemsen} 143*1c12ee1eSDan Willemsen 144*1c12ee1eSDan Willemsenfunc maybeVerifyOption(t *testing.T, fd protoreflect.FieldDescriptor, v protoreflect.Value) { 145*1c12ee1eSDan Willemsen t.Helper() 146*1c12ee1eSDan Willemsen if fd.Kind() == protoreflect.MessageKind && string(fd.Message().FullName()) == "goproto.proto.testretention.OptionsMessage" { 147*1c12ee1eSDan Willemsen if fd.IsList() { 148*1c12ee1eSDan Willemsen for i := 0; i < v.List().Len(); i++ { 149*1c12ee1eSDan Willemsen verifyOptionsMessage(t, string(fd.FullName()), v.List().Get(i).Message().Interface().(*retentionpb.OptionsMessage)) 150*1c12ee1eSDan Willemsen } 151*1c12ee1eSDan Willemsen } else { 152*1c12ee1eSDan Willemsen verifyOptionsMessage(t, string(fd.FullName()), v.Message().Interface().(*retentionpb.OptionsMessage)) 153*1c12ee1eSDan Willemsen } 154*1c12ee1eSDan Willemsen } 155*1c12ee1eSDan Willemsen} 156*1c12ee1eSDan Willemsen 157*1c12ee1eSDan Willemsenfunc verifyOptionsMessage(t *testing.T, entity string, msg *retentionpb.OptionsMessage) { 158*1c12ee1eSDan Willemsen t.Helper() 159*1c12ee1eSDan Willemsen if msg.PlainField == nil { 160*1c12ee1eSDan Willemsen t.Errorf("%s.OptionsMessage.HasField(plain_field): got false, want true", entity) 161*1c12ee1eSDan Willemsen } 162*1c12ee1eSDan Willemsen if msg.GetPlainField() != 1 { 163*1c12ee1eSDan Willemsen t.Errorf("%s.OptionsMessage.GetField(plain_field): got %d, want 1", entity, msg.GetPlainField()) 164*1c12ee1eSDan Willemsen } 165*1c12ee1eSDan Willemsen if msg.RuntimeRetentionField == nil { 166*1c12ee1eSDan Willemsen t.Errorf("%s.OptionsMessage.HasField(runtime_retention_field): got false, want true", entity) 167*1c12ee1eSDan Willemsen } 168*1c12ee1eSDan Willemsen if msg.GetRuntimeRetentionField() != 2 { 169*1c12ee1eSDan Willemsen t.Errorf("%s.OptionsMessage.GetField(runtime_retention_field): got %d, want 2", entity, msg.GetRuntimeRetentionField()) 170*1c12ee1eSDan Willemsen } 171*1c12ee1eSDan Willemsen if msg.SourceRetentionField != nil { 172*1c12ee1eSDan Willemsen t.Errorf("%s.OptionsMessage.HasField(source_retention_field): got true, want false", entity) 173*1c12ee1eSDan Willemsen } 174*1c12ee1eSDan Willemsen if msg.GetSourceRetentionField() != 0 { 175*1c12ee1eSDan Willemsen // Checking that we get 0 even though this was set to 3 in the source file 176*1c12ee1eSDan Willemsen t.Errorf("%s.OptionsMessage.GetField(source_retention_field): got %d, want 0", entity, msg.GetSourceRetentionField()) 177*1c12ee1eSDan Willemsen } 178*1c12ee1eSDan Willemsen} 179