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