Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 1 | // Copyright 2018 The Go Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style |
| 3 | // license that can be found in the LICENSE file. |
| 4 | |
Joe Tsai | d888139 | 2019-06-06 13:01:53 -0700 | [diff] [blame] | 5 | package filedesc_test |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 6 | |
| 7 | import ( |
Joe Tsai | 1776498 | 2018-08-24 03:03:21 -0700 | [diff] [blame] | 8 | "fmt" |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 9 | "reflect" |
Joe Tsai | dd00a27 | 2018-09-13 12:50:58 -0700 | [diff] [blame] | 10 | "regexp" |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 11 | "strconv" |
| 12 | "strings" |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 13 | "testing" |
| 14 | |
Joe Tsai | ac31a35 | 2019-05-13 14:32:56 -0700 | [diff] [blame] | 15 | "github.com/google/go-cmp/cmp" |
Damien Neil | e89e624 | 2019-05-13 23:55:40 -0700 | [diff] [blame] | 16 | detrand "google.golang.org/protobuf/internal/detrand" |
Joe Tsai | d888139 | 2019-06-06 13:01:53 -0700 | [diff] [blame] | 17 | "google.golang.org/protobuf/internal/filedesc" |
Joe Tsai | d888139 | 2019-06-06 13:01:53 -0700 | [diff] [blame] | 18 | "google.golang.org/protobuf/proto" |
Damien Neil | e89e624 | 2019-05-13 23:55:40 -0700 | [diff] [blame] | 19 | pdesc "google.golang.org/protobuf/reflect/protodesc" |
| 20 | pref "google.golang.org/protobuf/reflect/protoreflect" |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 21 | |
Joe Tsai | a95b29f | 2019-05-16 12:47:20 -0700 | [diff] [blame] | 22 | "google.golang.org/protobuf/types/descriptorpb" |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 23 | ) |
| 24 | |
Joe Tsai | 05d60cd | 2018-12-06 16:44:24 -0800 | [diff] [blame] | 25 | func init() { |
| 26 | // Disable detrand to enable direct comparisons on outputs. |
| 27 | detrand.Disable() |
| 28 | } |
| 29 | |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 30 | // TODO: Test protodesc.NewFile with imported files. |
Joe Tsai | 23ddbd1 | 2018-08-26 22:48:17 -0700 | [diff] [blame] | 31 | |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 32 | func TestFile(t *testing.T) { |
Joe Tsai | d888139 | 2019-06-06 13:01:53 -0700 | [diff] [blame] | 33 | f1 := &descriptorpb.FileDescriptorProto{ |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 34 | Syntax: proto.String("proto2"), |
| 35 | Name: proto.String("path/to/file.proto"), |
| 36 | Package: proto.String("test"), |
| 37 | Options: &descriptorpb.FileOptions{Deprecated: proto.Bool(true)}, |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 38 | MessageType: []*descriptorpb.DescriptorProto{{ |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 39 | Name: proto.String("A"), |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 40 | Options: &descriptorpb.MessageOptions{ |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 41 | Deprecated: proto.Bool(true), |
Damien Neil | 204f1c0 | 2018-10-23 15:03:38 -0700 | [diff] [blame] | 42 | }, |
Joe Tsai | 23ddbd1 | 2018-08-26 22:48:17 -0700 | [diff] [blame] | 43 | }, { |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 44 | Name: proto.String("B"), |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 45 | Field: []*descriptorpb.FieldDescriptorProto{{ |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 46 | Name: proto.String("field_one"), |
| 47 | Number: proto.Int32(1), |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 48 | Label: descriptorpb.FieldDescriptorProto_Label(pref.Optional).Enum(), |
| 49 | Type: descriptorpb.FieldDescriptorProto_Type(pref.StringKind).Enum(), |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 50 | DefaultValue: proto.String("hello, \"world!\"\n"), |
| 51 | OneofIndex: proto.Int32(0), |
Joe Tsai | 23ddbd1 | 2018-08-26 22:48:17 -0700 | [diff] [blame] | 52 | }, { |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 53 | Name: proto.String("field_two"), |
| 54 | JsonName: proto.String("Field2"), |
| 55 | Number: proto.Int32(2), |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 56 | Label: descriptorpb.FieldDescriptorProto_Label(pref.Optional).Enum(), |
| 57 | Type: descriptorpb.FieldDescriptorProto_Type(pref.EnumKind).Enum(), |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 58 | DefaultValue: proto.String("BAR"), |
| 59 | TypeName: proto.String(".test.E1"), |
| 60 | OneofIndex: proto.Int32(1), |
Joe Tsai | 23ddbd1 | 2018-08-26 22:48:17 -0700 | [diff] [blame] | 61 | }, { |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 62 | Name: proto.String("field_three"), |
| 63 | Number: proto.Int32(3), |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 64 | Label: descriptorpb.FieldDescriptorProto_Label(pref.Optional).Enum(), |
| 65 | Type: descriptorpb.FieldDescriptorProto_Type(pref.MessageKind).Enum(), |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 66 | TypeName: proto.String(".test.C"), |
| 67 | OneofIndex: proto.Int32(1), |
Joe Tsai | 23ddbd1 | 2018-08-26 22:48:17 -0700 | [diff] [blame] | 68 | }, { |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 69 | Name: proto.String("field_four"), |
| 70 | JsonName: proto.String("Field4"), |
| 71 | Number: proto.Int32(4), |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 72 | Label: descriptorpb.FieldDescriptorProto_Label(pref.Repeated).Enum(), |
| 73 | Type: descriptorpb.FieldDescriptorProto_Type(pref.MessageKind).Enum(), |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 74 | TypeName: proto.String(".test.B.FieldFourEntry"), |
Joe Tsai | 23ddbd1 | 2018-08-26 22:48:17 -0700 | [diff] [blame] | 75 | }, { |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 76 | Name: proto.String("field_five"), |
| 77 | Number: proto.Int32(5), |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 78 | Label: descriptorpb.FieldDescriptorProto_Label(pref.Repeated).Enum(), |
| 79 | Type: descriptorpb.FieldDescriptorProto_Type(pref.Int32Kind).Enum(), |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 80 | Options: &descriptorpb.FieldOptions{Packed: proto.Bool(true)}, |
Joe Tsai | 23ddbd1 | 2018-08-26 22:48:17 -0700 | [diff] [blame] | 81 | }, { |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 82 | Name: proto.String("field_six"), |
| 83 | Number: proto.Int32(6), |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 84 | Label: descriptorpb.FieldDescriptorProto_Label(pref.Required).Enum(), |
| 85 | Type: descriptorpb.FieldDescriptorProto_Type(pref.BytesKind).Enum(), |
Joe Tsai | 23ddbd1 | 2018-08-26 22:48:17 -0700 | [diff] [blame] | 86 | }}, |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 87 | OneofDecl: []*descriptorpb.OneofDescriptorProto{ |
Damien Neil | 204f1c0 | 2018-10-23 15:03:38 -0700 | [diff] [blame] | 88 | { |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 89 | Name: proto.String("O1"), |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 90 | Options: &descriptorpb.OneofOptions{ |
| 91 | UninterpretedOption: []*descriptorpb.UninterpretedOption{ |
Damien Neil | 204f1c0 | 2018-10-23 15:03:38 -0700 | [diff] [blame] | 92 | {StringValue: []byte("option")}, |
| 93 | }, |
| 94 | }, |
| 95 | }, |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 96 | {Name: proto.String("O2")}, |
Joe Tsai | 23ddbd1 | 2018-08-26 22:48:17 -0700 | [diff] [blame] | 97 | }, |
Joe Tsai | bce82b8 | 2018-12-06 09:39:03 -0800 | [diff] [blame] | 98 | ReservedName: []string{"fizz", "buzz"}, |
| 99 | ReservedRange: []*descriptorpb.DescriptorProto_ReservedRange{ |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 100 | {Start: proto.Int32(100), End: proto.Int32(200)}, |
| 101 | {Start: proto.Int32(300), End: proto.Int32(301)}, |
Joe Tsai | bce82b8 | 2018-12-06 09:39:03 -0800 | [diff] [blame] | 102 | }, |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 103 | ExtensionRange: []*descriptorpb.DescriptorProto_ExtensionRange{ |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 104 | {Start: proto.Int32(1000), End: proto.Int32(2000)}, |
| 105 | {Start: proto.Int32(3000), End: proto.Int32(3001), Options: new(descriptorpb.ExtensionRangeOptions)}, |
Joe Tsai | 23ddbd1 | 2018-08-26 22:48:17 -0700 | [diff] [blame] | 106 | }, |
Joe Tsai | 1507635 | 2019-07-02 15:19:08 -0700 | [diff] [blame] | 107 | NestedType: []*descriptorpb.DescriptorProto{{ |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 108 | Name: proto.String("FieldFourEntry"), |
Joe Tsai | 1507635 | 2019-07-02 15:19:08 -0700 | [diff] [blame] | 109 | Field: []*descriptorpb.FieldDescriptorProto{{ |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 110 | Name: proto.String("key"), |
| 111 | Number: proto.Int32(1), |
Joe Tsai | 1507635 | 2019-07-02 15:19:08 -0700 | [diff] [blame] | 112 | Label: descriptorpb.FieldDescriptorProto_Label(pref.Optional).Enum(), |
| 113 | Type: descriptorpb.FieldDescriptorProto_Type(pref.StringKind).Enum(), |
| 114 | }, { |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 115 | Name: proto.String("value"), |
| 116 | Number: proto.Int32(2), |
Joe Tsai | 1507635 | 2019-07-02 15:19:08 -0700 | [diff] [blame] | 117 | Label: descriptorpb.FieldDescriptorProto_Label(pref.Optional).Enum(), |
| 118 | Type: descriptorpb.FieldDescriptorProto_Type(pref.MessageKind).Enum(), |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 119 | TypeName: proto.String(".test.B"), |
Joe Tsai | 1507635 | 2019-07-02 15:19:08 -0700 | [diff] [blame] | 120 | }}, |
| 121 | Options: &descriptorpb.MessageOptions{ |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 122 | MapEntry: proto.Bool(true), |
Joe Tsai | 1507635 | 2019-07-02 15:19:08 -0700 | [diff] [blame] | 123 | }, |
| 124 | }}, |
Joe Tsai | 23ddbd1 | 2018-08-26 22:48:17 -0700 | [diff] [blame] | 125 | }, { |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 126 | Name: proto.String("C"), |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 127 | NestedType: []*descriptorpb.DescriptorProto{{ |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 128 | Name: proto.String("A"), |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 129 | Field: []*descriptorpb.FieldDescriptorProto{{ |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 130 | Name: proto.String("F"), |
| 131 | Number: proto.Int32(1), |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 132 | Label: descriptorpb.FieldDescriptorProto_Label(pref.Required).Enum(), |
| 133 | Type: descriptorpb.FieldDescriptorProto_Type(pref.BytesKind).Enum(), |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 134 | DefaultValue: proto.String(`dead\276\357`), |
Joe Tsai | 23ddbd1 | 2018-08-26 22:48:17 -0700 | [diff] [blame] | 135 | }}, |
| 136 | }}, |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 137 | EnumType: []*descriptorpb.EnumDescriptorProto{{ |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 138 | Name: proto.String("E1"), |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 139 | Value: []*descriptorpb.EnumValueDescriptorProto{ |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 140 | {Name: proto.String("FOO"), Number: proto.Int32(0)}, |
| 141 | {Name: proto.String("BAR"), Number: proto.Int32(1)}, |
Joe Tsai | 23ddbd1 | 2018-08-26 22:48:17 -0700 | [diff] [blame] | 142 | }, |
| 143 | }}, |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 144 | Extension: []*descriptorpb.FieldDescriptorProto{{ |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 145 | Name: proto.String("X"), |
| 146 | Number: proto.Int32(1000), |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 147 | Label: descriptorpb.FieldDescriptorProto_Label(pref.Repeated).Enum(), |
| 148 | Type: descriptorpb.FieldDescriptorProto_Type(pref.MessageKind).Enum(), |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 149 | TypeName: proto.String(".test.C"), |
| 150 | Extendee: proto.String(".test.B"), |
Joe Tsai | 23ddbd1 | 2018-08-26 22:48:17 -0700 | [diff] [blame] | 151 | }}, |
| 152 | }}, |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 153 | EnumType: []*descriptorpb.EnumDescriptorProto{{ |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 154 | Name: proto.String("E1"), |
| 155 | Options: &descriptorpb.EnumOptions{Deprecated: proto.Bool(true)}, |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 156 | Value: []*descriptorpb.EnumValueDescriptorProto{ |
Damien Neil | 204f1c0 | 2018-10-23 15:03:38 -0700 | [diff] [blame] | 157 | { |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 158 | Name: proto.String("FOO"), |
| 159 | Number: proto.Int32(0), |
| 160 | Options: &descriptorpb.EnumValueOptions{Deprecated: proto.Bool(true)}, |
Damien Neil | 204f1c0 | 2018-10-23 15:03:38 -0700 | [diff] [blame] | 161 | }, |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 162 | {Name: proto.String("BAR"), Number: proto.Int32(1)}, |
Joe Tsai | 23ddbd1 | 2018-08-26 22:48:17 -0700 | [diff] [blame] | 163 | }, |
Joe Tsai | bce82b8 | 2018-12-06 09:39:03 -0800 | [diff] [blame] | 164 | ReservedName: []string{"FIZZ", "BUZZ"}, |
| 165 | ReservedRange: []*descriptorpb.EnumDescriptorProto_EnumReservedRange{ |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 166 | {Start: proto.Int32(10), End: proto.Int32(19)}, |
| 167 | {Start: proto.Int32(30), End: proto.Int32(30)}, |
Joe Tsai | bce82b8 | 2018-12-06 09:39:03 -0800 | [diff] [blame] | 168 | }, |
Joe Tsai | 23ddbd1 | 2018-08-26 22:48:17 -0700 | [diff] [blame] | 169 | }}, |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 170 | Extension: []*descriptorpb.FieldDescriptorProto{{ |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 171 | Name: proto.String("X"), |
| 172 | Number: proto.Int32(1000), |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 173 | Label: descriptorpb.FieldDescriptorProto_Label(pref.Repeated).Enum(), |
Joe Tsai | 1507635 | 2019-07-02 15:19:08 -0700 | [diff] [blame] | 174 | Type: descriptorpb.FieldDescriptorProto_Type(pref.EnumKind).Enum(), |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 175 | Options: &descriptorpb.FieldOptions{Packed: proto.Bool(true)}, |
| 176 | TypeName: proto.String(".test.E1"), |
| 177 | Extendee: proto.String(".test.B"), |
Joe Tsai | 23ddbd1 | 2018-08-26 22:48:17 -0700 | [diff] [blame] | 178 | }}, |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 179 | Service: []*descriptorpb.ServiceDescriptorProto{{ |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 180 | Name: proto.String("S"), |
| 181 | Options: &descriptorpb.ServiceOptions{Deprecated: proto.Bool(true)}, |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 182 | Method: []*descriptorpb.MethodDescriptorProto{{ |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 183 | Name: proto.String("M"), |
| 184 | InputType: proto.String(".test.A"), |
| 185 | OutputType: proto.String(".test.C.A"), |
| 186 | ClientStreaming: proto.Bool(true), |
| 187 | ServerStreaming: proto.Bool(true), |
| 188 | Options: &descriptorpb.MethodOptions{Deprecated: proto.Bool(true)}, |
Joe Tsai | 23ddbd1 | 2018-08-26 22:48:17 -0700 | [diff] [blame] | 189 | }}, |
| 190 | }}, |
| 191 | } |
Joe Tsai | d888139 | 2019-06-06 13:01:53 -0700 | [diff] [blame] | 192 | fd1, err := pdesc.NewFile(f1, nil) |
Joe Tsai | 23ddbd1 | 2018-08-26 22:48:17 -0700 | [diff] [blame] | 193 | if err != nil { |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 194 | t.Fatalf("protodesc.NewFile() error: %v", err) |
Joe Tsai | 23ddbd1 | 2018-08-26 22:48:17 -0700 | [diff] [blame] | 195 | } |
| 196 | |
Joe Tsai | d888139 | 2019-06-06 13:01:53 -0700 | [diff] [blame] | 197 | b, err := proto.Marshal(f1) |
| 198 | if err != nil { |
| 199 | t.Fatalf("proto.Marshal() error: %v", err) |
| 200 | } |
Joe Tsai | 52ec175 | 2019-08-05 15:49:29 -0700 | [diff] [blame] | 201 | fd2 := filedesc.Builder{RawDescriptor: b}.Build().File |
Joe Tsai | d888139 | 2019-06-06 13:01:53 -0700 | [diff] [blame] | 202 | |
Joe Tsai | 23ddbd1 | 2018-08-26 22:48:17 -0700 | [diff] [blame] | 203 | tests := []struct { |
| 204 | name string |
| 205 | desc pref.FileDescriptor |
| 206 | }{ |
Joe Tsai | d888139 | 2019-06-06 13:01:53 -0700 | [diff] [blame] | 207 | {"protodesc.NewFile", fd1}, |
Joe Tsai | 52ec175 | 2019-08-05 15:49:29 -0700 | [diff] [blame] | 208 | {"filedesc.Builder.Build", fd2}, |
Joe Tsai | 23ddbd1 | 2018-08-26 22:48:17 -0700 | [diff] [blame] | 209 | } |
| 210 | for _, tt := range tests { |
Joe Tsai | 1776498 | 2018-08-24 03:03:21 -0700 | [diff] [blame] | 211 | tt := tt |
Joe Tsai | 23ddbd1 | 2018-08-26 22:48:17 -0700 | [diff] [blame] | 212 | t.Run(tt.name, func(t *testing.T) { |
Joe Tsai | 1776498 | 2018-08-24 03:03:21 -0700 | [diff] [blame] | 213 | // Run sub-tests in parallel to induce potential races. |
| 214 | for i := 0; i < 2; i++ { |
| 215 | t.Run("Accessors", func(t *testing.T) { t.Parallel(); testFileAccessors(t, tt.desc) }) |
Joe Tsai | dd00a27 | 2018-09-13 12:50:58 -0700 | [diff] [blame] | 216 | t.Run("Format", func(t *testing.T) { t.Parallel(); testFileFormat(t, tt.desc) }) |
Joe Tsai | 1776498 | 2018-08-24 03:03:21 -0700 | [diff] [blame] | 217 | } |
Joe Tsai | 23ddbd1 | 2018-08-26 22:48:17 -0700 | [diff] [blame] | 218 | }) |
| 219 | } |
| 220 | } |
| 221 | |
| 222 | func testFileAccessors(t *testing.T, fd pref.FileDescriptor) { |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 223 | // Represent the descriptor as a map where each key is an accessor method |
| 224 | // and the value is either the wanted tail value or another accessor map. |
| 225 | type M = map[string]interface{} |
| 226 | want := M{ |
| 227 | "Parent": nil, |
Damien Neil | 3de06c0 | 2018-09-07 09:39:44 -0700 | [diff] [blame] | 228 | "Index": 0, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 229 | "Syntax": pref.Proto2, |
| 230 | "Name": pref.Name("test"), |
| 231 | "FullName": pref.FullName("test"), |
| 232 | "Path": "path/to/file.proto", |
| 233 | "Package": pref.FullName("test"), |
| 234 | "IsPlaceholder": false, |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 235 | "Options": &descriptorpb.FileOptions{Deprecated: proto.Bool(true)}, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 236 | "Messages": M{ |
| 237 | "Len": 3, |
| 238 | "Get:0": M{ |
| 239 | "Parent": M{"FullName": pref.FullName("test")}, |
Damien Neil | 3de06c0 | 2018-09-07 09:39:44 -0700 | [diff] [blame] | 240 | "Index": 0, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 241 | "Syntax": pref.Proto2, |
| 242 | "Name": pref.Name("A"), |
| 243 | "FullName": pref.FullName("test.A"), |
| 244 | "IsPlaceholder": false, |
Joe Tsai | 1507635 | 2019-07-02 15:19:08 -0700 | [diff] [blame] | 245 | "IsMapEntry": false, |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 246 | "Options": &descriptorpb.MessageOptions{ |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 247 | Deprecated: proto.Bool(true), |
Damien Neil | 204f1c0 | 2018-10-23 15:03:38 -0700 | [diff] [blame] | 248 | }, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 249 | "Oneofs": M{"Len": 0}, |
| 250 | "RequiredNumbers": M{"Len": 0}, |
| 251 | "ExtensionRanges": M{"Len": 0}, |
| 252 | "Messages": M{"Len": 0}, |
| 253 | "Enums": M{"Len": 0}, |
| 254 | "Extensions": M{"Len": 0}, |
| 255 | }, |
| 256 | "ByName:B": M{ |
Damien Neil | 3de06c0 | 2018-09-07 09:39:44 -0700 | [diff] [blame] | 257 | "Name": pref.Name("B"), |
| 258 | "Index": 1, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 259 | "Fields": M{ |
| 260 | "Len": 6, |
| 261 | "ByJSONName:field_one": nil, |
| 262 | "ByJSONName:fieldOne": M{ |
Joe Tsai | ac31a35 | 2019-05-13 14:32:56 -0700 | [diff] [blame] | 263 | "Name": pref.Name("field_one"), |
| 264 | "Index": 0, |
| 265 | "JSONName": "fieldOne", |
| 266 | "Default": "hello, \"world!\"\n", |
| 267 | "ContainingOneof": M{"Name": pref.Name("O1"), "IsPlaceholder": false}, |
| 268 | "ContainingMessage": M{"FullName": pref.FullName("test.B")}, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 269 | }, |
| 270 | "ByJSONName:fieldTwo": nil, |
| 271 | "ByJSONName:Field2": M{ |
Joe Tsai | ac31a35 | 2019-05-13 14:32:56 -0700 | [diff] [blame] | 272 | "Name": pref.Name("field_two"), |
| 273 | "Index": 1, |
| 274 | "HasJSONName": true, |
| 275 | "JSONName": "Field2", |
| 276 | "Default": pref.EnumNumber(1), |
| 277 | "ContainingOneof": M{"Name": pref.Name("O2"), "IsPlaceholder": false}, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 278 | }, |
| 279 | "ByName:fieldThree": nil, |
| 280 | "ByName:field_three": M{ |
Joe Tsai | ac31a35 | 2019-05-13 14:32:56 -0700 | [diff] [blame] | 281 | "IsExtension": false, |
| 282 | "IsMap": false, |
| 283 | "MapKey": nil, |
| 284 | "MapValue": nil, |
| 285 | "Message": M{"FullName": pref.FullName("test.C"), "IsPlaceholder": false}, |
| 286 | "ContainingOneof": M{"Name": pref.Name("O2"), "IsPlaceholder": false}, |
| 287 | "ContainingMessage": M{"FullName": pref.FullName("test.B")}, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 288 | }, |
| 289 | "ByNumber:12": nil, |
| 290 | "ByNumber:4": M{ |
| 291 | "Cardinality": pref.Repeated, |
Joe Tsai | ac31a35 | 2019-05-13 14:32:56 -0700 | [diff] [blame] | 292 | "IsExtension": false, |
| 293 | "IsList": false, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 294 | "IsMap": true, |
Joe Tsai | ac31a35 | 2019-05-13 14:32:56 -0700 | [diff] [blame] | 295 | "MapKey": M{"Kind": pref.StringKind}, |
| 296 | "MapValue": M{"Kind": pref.MessageKind, "Message": M{"FullName": pref.FullName("test.B")}}, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 297 | "Default": nil, |
Joe Tsai | 1507635 | 2019-07-02 15:19:08 -0700 | [diff] [blame] | 298 | "Message": M{"FullName": pref.FullName("test.B.FieldFourEntry"), "IsPlaceholder": false}, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 299 | }, |
| 300 | "ByNumber:5": M{ |
| 301 | "Cardinality": pref.Repeated, |
| 302 | "Kind": pref.Int32Kind, |
| 303 | "IsPacked": true, |
Joe Tsai | ac31a35 | 2019-05-13 14:32:56 -0700 | [diff] [blame] | 304 | "IsList": true, |
| 305 | "IsMap": false, |
Joe Tsai | 851185d | 2019-07-01 13:45:52 -0700 | [diff] [blame] | 306 | "Default": nil, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 307 | }, |
| 308 | "ByNumber:6": M{ |
Joe Tsai | ac31a35 | 2019-05-13 14:32:56 -0700 | [diff] [blame] | 309 | "Cardinality": pref.Required, |
| 310 | "Default": []byte(nil), |
| 311 | "ContainingOneof": nil, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 312 | }, |
| 313 | }, |
| 314 | "Oneofs": M{ |
| 315 | "Len": 2, |
| 316 | "ByName:O0": nil, |
| 317 | "ByName:O1": M{ |
| 318 | "FullName": pref.FullName("test.B.O1"), |
Damien Neil | 3de06c0 | 2018-09-07 09:39:44 -0700 | [diff] [blame] | 319 | "Index": 0, |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 320 | "Options": &descriptorpb.OneofOptions{ |
| 321 | UninterpretedOption: []*descriptorpb.UninterpretedOption{ |
Damien Neil | 204f1c0 | 2018-10-23 15:03:38 -0700 | [diff] [blame] | 322 | {StringValue: []byte("option")}, |
| 323 | }, |
| 324 | }, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 325 | "Fields": M{ |
| 326 | "Len": 1, |
| 327 | "Get:0": M{"FullName": pref.FullName("test.B.field_one")}, |
| 328 | }, |
| 329 | }, |
| 330 | "Get:1": M{ |
| 331 | "FullName": pref.FullName("test.B.O2"), |
Damien Neil | 3de06c0 | 2018-09-07 09:39:44 -0700 | [diff] [blame] | 332 | "Index": 1, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 333 | "Fields": M{ |
| 334 | "Len": 2, |
| 335 | "ByName:field_two": M{"Name": pref.Name("field_two")}, |
| 336 | "Get:1": M{"Name": pref.Name("field_three")}, |
| 337 | }, |
| 338 | }, |
| 339 | }, |
Joe Tsai | bce82b8 | 2018-12-06 09:39:03 -0800 | [diff] [blame] | 340 | "ReservedNames": M{ |
| 341 | "Len": 2, |
| 342 | "Get:0": pref.Name("fizz"), |
| 343 | "Has:buzz": true, |
| 344 | "Has:noexist": false, |
| 345 | }, |
| 346 | "ReservedRanges": M{ |
| 347 | "Len": 2, |
| 348 | "Get:0": [2]pref.FieldNumber{100, 200}, |
| 349 | "Has:99": false, |
| 350 | "Has:100": true, |
| 351 | "Has:150": true, |
| 352 | "Has:199": true, |
| 353 | "Has:200": false, |
| 354 | "Has:300": true, |
| 355 | "Has:301": false, |
| 356 | }, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 357 | "RequiredNumbers": M{ |
| 358 | "Len": 1, |
| 359 | "Get:0": pref.FieldNumber(6), |
| 360 | "Has:1": false, |
| 361 | "Has:6": true, |
| 362 | }, |
| 363 | "ExtensionRanges": M{ |
Joe Tsai | 1776498 | 2018-08-24 03:03:21 -0700 | [diff] [blame] | 364 | "Len": 2, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 365 | "Get:0": [2]pref.FieldNumber{1000, 2000}, |
| 366 | "Has:999": false, |
| 367 | "Has:1000": true, |
| 368 | "Has:1500": true, |
| 369 | "Has:1999": true, |
| 370 | "Has:2000": false, |
Joe Tsai | 1776498 | 2018-08-24 03:03:21 -0700 | [diff] [blame] | 371 | "Has:3000": true, |
Joe Tsai | bce82b8 | 2018-12-06 09:39:03 -0800 | [diff] [blame] | 372 | "Has:3001": false, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 373 | }, |
Joe Tsai | 381f04c | 2018-12-06 12:10:41 -0800 | [diff] [blame] | 374 | "ExtensionRangeOptions:0": (*descriptorpb.ExtensionRangeOptions)(nil), |
| 375 | "ExtensionRangeOptions:1": new(descriptorpb.ExtensionRangeOptions), |
Joe Tsai | 1507635 | 2019-07-02 15:19:08 -0700 | [diff] [blame] | 376 | "Messages": M{ |
| 377 | "Get:0": M{ |
| 378 | "Fields": M{ |
| 379 | "Len": 2, |
| 380 | "ByNumber:1": M{ |
| 381 | "Parent": M{"FullName": pref.FullName("test.B.FieldFourEntry")}, |
| 382 | "Index": 0, |
| 383 | "Name": pref.Name("key"), |
| 384 | "FullName": pref.FullName("test.B.FieldFourEntry.key"), |
| 385 | "Number": pref.FieldNumber(1), |
| 386 | "Cardinality": pref.Optional, |
| 387 | "Kind": pref.StringKind, |
| 388 | "Options": (*descriptorpb.FieldOptions)(nil), |
| 389 | "HasJSONName": false, |
| 390 | "JSONName": "key", |
| 391 | "IsPacked": false, |
| 392 | "IsList": false, |
| 393 | "IsMap": false, |
| 394 | "IsExtension": false, |
| 395 | "IsWeak": false, |
| 396 | "Default": "", |
| 397 | "ContainingOneof": nil, |
| 398 | "ContainingMessage": M{"FullName": pref.FullName("test.B.FieldFourEntry")}, |
| 399 | "Message": nil, |
| 400 | "Enum": nil, |
| 401 | }, |
| 402 | "ByNumber:2": M{ |
| 403 | "Parent": M{"FullName": pref.FullName("test.B.FieldFourEntry")}, |
| 404 | "Index": 1, |
| 405 | "Name": pref.Name("value"), |
| 406 | "FullName": pref.FullName("test.B.FieldFourEntry.value"), |
| 407 | "Number": pref.FieldNumber(2), |
| 408 | "Cardinality": pref.Optional, |
| 409 | "Kind": pref.MessageKind, |
| 410 | "JSONName": "value", |
| 411 | "IsPacked": false, |
| 412 | "IsList": false, |
| 413 | "IsMap": false, |
| 414 | "IsExtension": false, |
| 415 | "IsWeak": false, |
| 416 | "Default": nil, |
| 417 | "ContainingOneof": nil, |
| 418 | "ContainingMessage": M{"FullName": pref.FullName("test.B.FieldFourEntry")}, |
| 419 | "Message": M{"FullName": pref.FullName("test.B"), "IsPlaceholder": false}, |
| 420 | "Enum": nil, |
| 421 | }, |
| 422 | "ByNumber:3": nil, |
| 423 | }, |
| 424 | }, |
| 425 | }, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 426 | }, |
| 427 | "Get:2": M{ |
Damien Neil | 3de06c0 | 2018-09-07 09:39:44 -0700 | [diff] [blame] | 428 | "Name": pref.Name("C"), |
| 429 | "Index": 2, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 430 | "Messages": M{ |
| 431 | "Len": 1, |
| 432 | "Get:0": M{"FullName": pref.FullName("test.C.A")}, |
| 433 | }, |
| 434 | "Enums": M{ |
| 435 | "Len": 1, |
| 436 | "Get:0": M{"FullName": pref.FullName("test.C.E1")}, |
| 437 | }, |
| 438 | "Extensions": M{ |
| 439 | "Len": 1, |
| 440 | "Get:0": M{"FullName": pref.FullName("test.C.X")}, |
| 441 | }, |
| 442 | }, |
| 443 | }, |
| 444 | "Enums": M{ |
| 445 | "Len": 1, |
| 446 | "Get:0": M{ |
Damien Neil | 204f1c0 | 2018-10-23 15:03:38 -0700 | [diff] [blame] | 447 | "Name": pref.Name("E1"), |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 448 | "Options": &descriptorpb.EnumOptions{Deprecated: proto.Bool(true)}, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 449 | "Values": M{ |
| 450 | "Len": 2, |
| 451 | "ByName:Foo": nil, |
Damien Neil | 204f1c0 | 2018-10-23 15:03:38 -0700 | [diff] [blame] | 452 | "ByName:FOO": M{ |
| 453 | "FullName": pref.FullName("test.FOO"), |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 454 | "Options": &descriptorpb.EnumValueOptions{Deprecated: proto.Bool(true)}, |
Damien Neil | 204f1c0 | 2018-10-23 15:03:38 -0700 | [diff] [blame] | 455 | }, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 456 | "ByNumber:2": nil, |
| 457 | "ByNumber:1": M{"FullName": pref.FullName("test.BAR")}, |
| 458 | }, |
Joe Tsai | bce82b8 | 2018-12-06 09:39:03 -0800 | [diff] [blame] | 459 | "ReservedNames": M{ |
| 460 | "Len": 2, |
| 461 | "Get:0": pref.Name("FIZZ"), |
| 462 | "Has:BUZZ": true, |
| 463 | "Has:NOEXIST": false, |
| 464 | }, |
| 465 | "ReservedRanges": M{ |
| 466 | "Len": 2, |
| 467 | "Get:0": [2]pref.EnumNumber{10, 19}, |
| 468 | "Has:9": false, |
| 469 | "Has:10": true, |
| 470 | "Has:15": true, |
| 471 | "Has:19": true, |
| 472 | "Has:20": false, |
| 473 | "Has:30": true, |
| 474 | "Has:31": false, |
| 475 | }, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 476 | }, |
| 477 | }, |
| 478 | "Extensions": M{ |
| 479 | "Len": 1, |
| 480 | "ByName:X": M{ |
Joe Tsai | ac31a35 | 2019-05-13 14:32:56 -0700 | [diff] [blame] | 481 | "Name": pref.Name("X"), |
| 482 | "Number": pref.FieldNumber(1000), |
| 483 | "Cardinality": pref.Repeated, |
Joe Tsai | 1507635 | 2019-07-02 15:19:08 -0700 | [diff] [blame] | 484 | "Kind": pref.EnumKind, |
Joe Tsai | ac31a35 | 2019-05-13 14:32:56 -0700 | [diff] [blame] | 485 | "IsExtension": true, |
Joe Tsai | d888139 | 2019-06-06 13:01:53 -0700 | [diff] [blame] | 486 | "IsPacked": true, |
Joe Tsai | ac31a35 | 2019-05-13 14:32:56 -0700 | [diff] [blame] | 487 | "IsList": true, |
| 488 | "IsMap": false, |
| 489 | "MapKey": nil, |
| 490 | "MapValue": nil, |
| 491 | "ContainingOneof": nil, |
| 492 | "ContainingMessage": M{"FullName": pref.FullName("test.B"), "IsPlaceholder": false}, |
Joe Tsai | 1507635 | 2019-07-02 15:19:08 -0700 | [diff] [blame] | 493 | "Enum": M{"FullName": pref.FullName("test.E1"), "IsPlaceholder": false}, |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 494 | "Options": &descriptorpb.FieldOptions{Packed: proto.Bool(true)}, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 495 | }, |
| 496 | }, |
| 497 | "Services": M{ |
| 498 | "Len": 1, |
| 499 | "ByName:s": nil, |
| 500 | "ByName:S": M{ |
| 501 | "Parent": M{"FullName": pref.FullName("test")}, |
| 502 | "Name": pref.Name("S"), |
| 503 | "FullName": pref.FullName("test.S"), |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 504 | "Options": &descriptorpb.ServiceOptions{Deprecated: proto.Bool(true)}, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 505 | "Methods": M{ |
| 506 | "Len": 1, |
| 507 | "Get:0": M{ |
| 508 | "Parent": M{"FullName": pref.FullName("test.S")}, |
| 509 | "Name": pref.Name("M"), |
| 510 | "FullName": pref.FullName("test.S.M"), |
Joe Tsai | d24bc72 | 2019-04-15 23:39:09 -0700 | [diff] [blame] | 511 | "Input": M{"FullName": pref.FullName("test.A"), "IsPlaceholder": false}, |
| 512 | "Output": M{"FullName": pref.FullName("test.C.A"), "IsPlaceholder": false}, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 513 | "IsStreamingClient": true, |
| 514 | "IsStreamingServer": true, |
Damien Neil | a8a2cea | 2019-07-10 16:17:16 -0700 | [diff] [blame] | 515 | "Options": &descriptorpb.MethodOptions{Deprecated: proto.Bool(true)}, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 516 | }, |
| 517 | }, |
| 518 | }, |
| 519 | }, |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 520 | } |
Joe Tsai | 23ddbd1 | 2018-08-26 22:48:17 -0700 | [diff] [blame] | 521 | checkAccessors(t, "", reflect.ValueOf(fd), want) |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 522 | } |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 523 | func checkAccessors(t *testing.T, p string, rv reflect.Value, want map[string]interface{}) { |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 524 | p0 := p |
| 525 | defer func() { |
| 526 | if ex := recover(); ex != nil { |
| 527 | t.Errorf("panic at %v: %v", p, ex) |
| 528 | } |
| 529 | }() |
| 530 | |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 531 | if rv.Interface() == nil { |
| 532 | t.Errorf("%v is nil, want non-nil", p) |
| 533 | return |
| 534 | } |
| 535 | for s, v := range want { |
| 536 | // Call the accessor method. |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame] | 537 | p = p0 + "." + s |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 538 | var rets []reflect.Value |
| 539 | if i := strings.IndexByte(s, ':'); i >= 0 { |
| 540 | // Accessor method takes in a single argument, which is encoded |
| 541 | // after the accessor name, separated by a ':' delimiter. |
| 542 | fnc := rv.MethodByName(s[:i]) |
| 543 | arg := reflect.New(fnc.Type().In(0)).Elem() |
| 544 | s = s[i+len(":"):] |
| 545 | switch arg.Kind() { |
| 546 | case reflect.String: |
| 547 | arg.SetString(s) |
| 548 | case reflect.Int32, reflect.Int: |
| 549 | n, _ := strconv.ParseInt(s, 0, 64) |
| 550 | arg.SetInt(n) |
| 551 | } |
| 552 | rets = fnc.Call([]reflect.Value{arg}) |
| 553 | } else { |
| 554 | rets = rv.MethodByName(s).Call(nil) |
| 555 | } |
| 556 | |
| 557 | // Check that (val, ok) pattern is internally consistent. |
| 558 | if len(rets) == 2 { |
| 559 | if rets[0].IsNil() && rets[1].Bool() { |
| 560 | t.Errorf("%v = (nil, true), want (nil, false)", p) |
| 561 | } |
| 562 | if !rets[0].IsNil() && !rets[1].Bool() { |
| 563 | t.Errorf("%v = (non-nil, false), want (non-nil, true)", p) |
| 564 | } |
| 565 | } |
| 566 | |
| 567 | // Check that the accessor output matches. |
| 568 | if want, ok := v.(map[string]interface{}); ok { |
| 569 | checkAccessors(t, p, rets[0], want) |
Damien Neil | 204f1c0 | 2018-10-23 15:03:38 -0700 | [diff] [blame] | 570 | continue |
| 571 | } |
| 572 | |
| 573 | got := rets[0].Interface() |
| 574 | if pv, ok := got.(pref.Value); ok { |
| 575 | got = pv.Interface() |
| 576 | } |
| 577 | |
| 578 | // Compare with proto.Equal if possible. |
Joe Tsai | d888139 | 2019-06-06 13:01:53 -0700 | [diff] [blame] | 579 | gotMsg, gotMsgOK := got.(proto.Message) |
| 580 | wantMsg, wantMsgOK := v.(proto.Message) |
Damien Neil | 204f1c0 | 2018-10-23 15:03:38 -0700 | [diff] [blame] | 581 | if gotMsgOK && wantMsgOK { |
Joe Tsai | d888139 | 2019-06-06 13:01:53 -0700 | [diff] [blame] | 582 | gotNil := reflect.ValueOf(gotMsg).IsNil() |
| 583 | wantNil := reflect.ValueOf(wantMsg).IsNil() |
| 584 | switch { |
| 585 | case !gotNil && wantNil: |
| 586 | t.Errorf("%v = non-nil, want nil", p) |
| 587 | case gotNil && !wantNil: |
| 588 | t.Errorf("%v = nil, want non-nil", p) |
| 589 | case !proto.Equal(gotMsg, wantMsg): |
| 590 | t.Errorf("%v = %v, want %v", p, gotMsg, wantMsg) |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 591 | } |
Damien Neil | 204f1c0 | 2018-10-23 15:03:38 -0700 | [diff] [blame] | 592 | continue |
| 593 | } |
| 594 | |
| 595 | if want := v; !reflect.DeepEqual(got, want) { |
Joe Tsai | 381f04c | 2018-12-06 12:10:41 -0800 | [diff] [blame] | 596 | t.Errorf("%v = %T(%v), want %T(%v)", p, got, got, want, want) |
Joe Tsai | bfda014 | 2018-08-10 13:58:07 -0700 | [diff] [blame] | 597 | } |
| 598 | } |
| 599 | } |
| 600 | |
Joe Tsai | dd00a27 | 2018-09-13 12:50:58 -0700 | [diff] [blame] | 601 | func testFileFormat(t *testing.T, fd pref.FileDescriptor) { |
Joe Tsai | 1776498 | 2018-08-24 03:03:21 -0700 | [diff] [blame] | 602 | const want = `FileDescriptor{ |
| 603 | Syntax: proto2 |
| 604 | Path: "path/to/file.proto" |
| 605 | Package: test |
| 606 | Messages: [{ |
Joe Tsai | 1507635 | 2019-07-02 15:19:08 -0700 | [diff] [blame] | 607 | Name: A |
Joe Tsai | 1776498 | 2018-08-24 03:03:21 -0700 | [diff] [blame] | 608 | }, { |
| 609 | Name: B |
| 610 | Fields: [{ |
| 611 | Name: field_one |
| 612 | Number: 1 |
| 613 | Cardinality: optional |
| 614 | Kind: string |
| 615 | JSONName: "fieldOne" |
Damien Neil | e6fa22a | 2018-09-12 15:15:40 -0700 | [diff] [blame] | 616 | HasDefault: true |
Joe Tsai | 1dab2cb | 2018-09-28 13:39:07 -0700 | [diff] [blame] | 617 | Default: "hello, \"world!\"\n" |
Joe Tsai | d24bc72 | 2019-04-15 23:39:09 -0700 | [diff] [blame] | 618 | Oneof: O1 |
Joe Tsai | 1776498 | 2018-08-24 03:03:21 -0700 | [diff] [blame] | 619 | }, { |
| 620 | Name: field_two |
| 621 | Number: 2 |
| 622 | Cardinality: optional |
| 623 | Kind: enum |
Joe Tsai | bce82b8 | 2018-12-06 09:39:03 -0800 | [diff] [blame] | 624 | HasJSONName: true |
Joe Tsai | 1776498 | 2018-08-24 03:03:21 -0700 | [diff] [blame] | 625 | JSONName: "Field2" |
Damien Neil | e6fa22a | 2018-09-12 15:15:40 -0700 | [diff] [blame] | 626 | HasDefault: true |
Joe Tsai | 1776498 | 2018-08-24 03:03:21 -0700 | [diff] [blame] | 627 | Default: 1 |
Joe Tsai | d24bc72 | 2019-04-15 23:39:09 -0700 | [diff] [blame] | 628 | Oneof: O2 |
| 629 | Enum: test.E1 |
Joe Tsai | 1776498 | 2018-08-24 03:03:21 -0700 | [diff] [blame] | 630 | }, { |
| 631 | Name: field_three |
| 632 | Number: 3 |
| 633 | Cardinality: optional |
| 634 | Kind: message |
| 635 | JSONName: "fieldThree" |
Joe Tsai | d24bc72 | 2019-04-15 23:39:09 -0700 | [diff] [blame] | 636 | Oneof: O2 |
| 637 | Message: test.C |
Joe Tsai | 1776498 | 2018-08-24 03:03:21 -0700 | [diff] [blame] | 638 | }, { |
| 639 | Name: field_four |
| 640 | Number: 4 |
| 641 | Cardinality: repeated |
| 642 | Kind: message |
Joe Tsai | bce82b8 | 2018-12-06 09:39:03 -0800 | [diff] [blame] | 643 | HasJSONName: true |
Joe Tsai | 1776498 | 2018-08-24 03:03:21 -0700 | [diff] [blame] | 644 | JSONName: "Field4" |
| 645 | IsMap: true |
Joe Tsai | ac31a35 | 2019-05-13 14:32:56 -0700 | [diff] [blame] | 646 | MapKey: string |
| 647 | MapValue: test.B |
Joe Tsai | 1776498 | 2018-08-24 03:03:21 -0700 | [diff] [blame] | 648 | }, { |
| 649 | Name: field_five |
| 650 | Number: 5 |
| 651 | Cardinality: repeated |
| 652 | Kind: int32 |
| 653 | JSONName: "fieldFive" |
| 654 | IsPacked: true |
Joe Tsai | ac31a35 | 2019-05-13 14:32:56 -0700 | [diff] [blame] | 655 | IsList: true |
Joe Tsai | 1776498 | 2018-08-24 03:03:21 -0700 | [diff] [blame] | 656 | }, { |
| 657 | Name: field_six |
| 658 | Number: 6 |
| 659 | Cardinality: required |
| 660 | Kind: bytes |
| 661 | JSONName: "fieldSix" |
| 662 | }] |
| 663 | Oneofs: [{ |
| 664 | Name: O1 |
| 665 | Fields: [field_one] |
| 666 | }, { |
| 667 | Name: O2 |
| 668 | Fields: [field_two, field_three] |
| 669 | }] |
Joe Tsai | bce82b8 | 2018-12-06 09:39:03 -0800 | [diff] [blame] | 670 | ReservedNames: [fizz, buzz] |
| 671 | ReservedRanges: [100:200, 300] |
Joe Tsai | 1776498 | 2018-08-24 03:03:21 -0700 | [diff] [blame] | 672 | RequiredNumbers: [6] |
| 673 | ExtensionRanges: [1000:2000, 3000] |
Joe Tsai | 1507635 | 2019-07-02 15:19:08 -0700 | [diff] [blame] | 674 | Messages: [{ |
| 675 | Name: FieldFourEntry |
| 676 | IsMapEntry: true |
| 677 | Fields: [{ |
| 678 | Name: key |
| 679 | Number: 1 |
| 680 | Cardinality: optional |
| 681 | Kind: string |
| 682 | JSONName: "key" |
| 683 | }, { |
| 684 | Name: value |
| 685 | Number: 2 |
| 686 | Cardinality: optional |
| 687 | Kind: message |
| 688 | JSONName: "value" |
| 689 | Message: test.B |
| 690 | }] |
| 691 | }] |
Joe Tsai | 1776498 | 2018-08-24 03:03:21 -0700 | [diff] [blame] | 692 | }, { |
| 693 | Name: C |
| 694 | Messages: [{ |
| 695 | Name: A |
| 696 | Fields: [{ |
| 697 | Name: F |
| 698 | Number: 1 |
| 699 | Cardinality: required |
| 700 | Kind: bytes |
| 701 | JSONName: "F" |
Damien Neil | e6fa22a | 2018-09-12 15:15:40 -0700 | [diff] [blame] | 702 | HasDefault: true |
Joe Tsai | 1776498 | 2018-08-24 03:03:21 -0700 | [diff] [blame] | 703 | Default: "dead\xbe\xef" |
| 704 | }] |
| 705 | RequiredNumbers: [1] |
| 706 | }] |
| 707 | Enums: [{ |
| 708 | Name: E1 |
| 709 | Values: [ |
| 710 | {Name: FOO} |
| 711 | {Name: BAR, Number: 1} |
| 712 | ] |
| 713 | }] |
| 714 | Extensions: [{ |
Joe Tsai | d24bc72 | 2019-04-15 23:39:09 -0700 | [diff] [blame] | 715 | Name: X |
| 716 | Number: 1000 |
| 717 | Cardinality: repeated |
| 718 | Kind: message |
Joe Tsai | d888139 | 2019-06-06 13:01:53 -0700 | [diff] [blame] | 719 | JSONName: "X" |
Joe Tsai | ac31a35 | 2019-05-13 14:32:56 -0700 | [diff] [blame] | 720 | IsExtension: true |
| 721 | IsList: true |
Joe Tsai | d24bc72 | 2019-04-15 23:39:09 -0700 | [diff] [blame] | 722 | Extendee: test.B |
| 723 | Message: test.C |
Joe Tsai | 1776498 | 2018-08-24 03:03:21 -0700 | [diff] [blame] | 724 | }] |
| 725 | }] |
| 726 | Enums: [{ |
| 727 | Name: E1 |
| 728 | Values: [ |
| 729 | {Name: FOO} |
| 730 | {Name: BAR, Number: 1} |
| 731 | ] |
Joe Tsai | bce82b8 | 2018-12-06 09:39:03 -0800 | [diff] [blame] | 732 | ReservedNames: [FIZZ, BUZZ] |
| 733 | ReservedRanges: [10:20, 30] |
Joe Tsai | 1776498 | 2018-08-24 03:03:21 -0700 | [diff] [blame] | 734 | }] |
| 735 | Extensions: [{ |
Joe Tsai | d24bc72 | 2019-04-15 23:39:09 -0700 | [diff] [blame] | 736 | Name: X |
| 737 | Number: 1000 |
| 738 | Cardinality: repeated |
Joe Tsai | 1507635 | 2019-07-02 15:19:08 -0700 | [diff] [blame] | 739 | Kind: enum |
Joe Tsai | d888139 | 2019-06-06 13:01:53 -0700 | [diff] [blame] | 740 | JSONName: "X" |
| 741 | IsPacked: true |
Joe Tsai | ac31a35 | 2019-05-13 14:32:56 -0700 | [diff] [blame] | 742 | IsExtension: true |
| 743 | IsList: true |
Joe Tsai | d24bc72 | 2019-04-15 23:39:09 -0700 | [diff] [blame] | 744 | Extendee: test.B |
Joe Tsai | 1507635 | 2019-07-02 15:19:08 -0700 | [diff] [blame] | 745 | Enum: test.E1 |
Joe Tsai | 1776498 | 2018-08-24 03:03:21 -0700 | [diff] [blame] | 746 | }] |
| 747 | Services: [{ |
| 748 | Name: S |
| 749 | Methods: [{ |
| 750 | Name: M |
Joe Tsai | d24bc72 | 2019-04-15 23:39:09 -0700 | [diff] [blame] | 751 | Input: test.A |
| 752 | Output: test.C.A |
Joe Tsai | 1776498 | 2018-08-24 03:03:21 -0700 | [diff] [blame] | 753 | IsStreamingClient: true |
| 754 | IsStreamingServer: true |
| 755 | }] |
| 756 | }] |
| 757 | }` |
Joe Tsai | dd00a27 | 2018-09-13 12:50:58 -0700 | [diff] [blame] | 758 | tests := []struct{ fmt, want string }{{"%v", compactMultiFormat(want)}, {"%+v", want}} |
| 759 | for _, tt := range tests { |
| 760 | got := fmt.Sprintf(tt.fmt, fd) |
Joe Tsai | ac31a35 | 2019-05-13 14:32:56 -0700 | [diff] [blame] | 761 | if diff := cmp.Diff(got, tt.want); diff != "" { |
| 762 | t.Errorf("fmt.Sprintf(%q, fd) mismatch (-got +want):\n%s", tt.fmt, diff) |
Joe Tsai | dd00a27 | 2018-09-13 12:50:58 -0700 | [diff] [blame] | 763 | } |
Joe Tsai | 1776498 | 2018-08-24 03:03:21 -0700 | [diff] [blame] | 764 | } |
| 765 | } |
| 766 | |
Joe Tsai | dd00a27 | 2018-09-13 12:50:58 -0700 | [diff] [blame] | 767 | // compactMultiFormat returns the single line form of a multi line output. |
| 768 | func compactMultiFormat(s string) string { |
| 769 | var b []byte |
| 770 | for _, s := range strings.Split(s, "\n") { |
| 771 | s = strings.TrimSpace(s) |
| 772 | s = regexp.MustCompile(": +").ReplaceAllString(s, ": ") |
| 773 | prevWord := len(b) > 0 && b[len(b)-1] != '[' && b[len(b)-1] != '{' |
| 774 | nextWord := len(s) > 0 && s[0] != ']' && s[0] != '}' |
| 775 | if prevWord && nextWord { |
| 776 | b = append(b, ", "...) |
| 777 | } |
| 778 | b = append(b, s...) |
| 779 | } |
| 780 | return string(b) |
| 781 | } |