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