xref: /aosp_15_r20/external/golang-protobuf/internal/cmd/pbdump/pbdump_test.go (revision 1c12ee1efe575feb122dbf939ff15148a3b3e8f2)
1*1c12ee1eSDan Willemsen// Copyright 2018 The Go Authors. All rights reserved.
2*1c12ee1eSDan Willemsen// Use of this source code is governed by a BSD-style
3*1c12ee1eSDan Willemsen// license that can be found in the LICENSE file.
4*1c12ee1eSDan Willemsen
5*1c12ee1eSDan Willemsenpackage main
6*1c12ee1eSDan Willemsen
7*1c12ee1eSDan Willemsenimport (
8*1c12ee1eSDan Willemsen	"fmt"
9*1c12ee1eSDan Willemsen	"strings"
10*1c12ee1eSDan Willemsen	"testing"
11*1c12ee1eSDan Willemsen
12*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/encoding/prototext"
13*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/proto"
14*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/reflect/protoreflect"
15*1c12ee1eSDan Willemsen
16*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/types/descriptorpb"
17*1c12ee1eSDan Willemsen)
18*1c12ee1eSDan Willemsen
19*1c12ee1eSDan Willemsenfunc mustMakeMessage(s string) *descriptorpb.DescriptorProto {
20*1c12ee1eSDan Willemsen	s = fmt.Sprintf(`name:"test.proto" syntax:"proto2" message_type:[{%s}]`, s)
21*1c12ee1eSDan Willemsen	pb := new(descriptorpb.FileDescriptorProto)
22*1c12ee1eSDan Willemsen	if err := prototext.Unmarshal([]byte(s), pb); err != nil {
23*1c12ee1eSDan Willemsen		panic(err)
24*1c12ee1eSDan Willemsen	}
25*1c12ee1eSDan Willemsen	return pb.MessageType[0]
26*1c12ee1eSDan Willemsen}
27*1c12ee1eSDan Willemsen
28*1c12ee1eSDan Willemsenfunc TestFields(t *testing.T) {
29*1c12ee1eSDan Willemsen	type fieldsKind struct {
30*1c12ee1eSDan Willemsen		kind   protoreflect.Kind
31*1c12ee1eSDan Willemsen		fields string
32*1c12ee1eSDan Willemsen	}
33*1c12ee1eSDan Willemsen	tests := []struct {
34*1c12ee1eSDan Willemsen		inFields []fieldsKind
35*1c12ee1eSDan Willemsen		wantMsg  *descriptorpb.DescriptorProto
36*1c12ee1eSDan Willemsen		wantErr  string
37*1c12ee1eSDan Willemsen	}{{
38*1c12ee1eSDan Willemsen		inFields: []fieldsKind{{protoreflect.MessageKind, ""}},
39*1c12ee1eSDan Willemsen		wantMsg:  mustMakeMessage(`name:"X"`),
40*1c12ee1eSDan Willemsen	}, {
41*1c12ee1eSDan Willemsen		inFields: []fieldsKind{{protoreflect.MessageKind, "987654321"}},
42*1c12ee1eSDan Willemsen		wantErr:  "invalid field: 987654321",
43*1c12ee1eSDan Willemsen	}, {
44*1c12ee1eSDan Willemsen		inFields: []fieldsKind{{protoreflect.MessageKind, "-1"}},
45*1c12ee1eSDan Willemsen		wantErr:  "invalid field: -1",
46*1c12ee1eSDan Willemsen	}, {
47*1c12ee1eSDan Willemsen		inFields: []fieldsKind{{protoreflect.MessageKind, "k"}},
48*1c12ee1eSDan Willemsen		wantErr:  "invalid field: k",
49*1c12ee1eSDan Willemsen	}, {
50*1c12ee1eSDan Willemsen		inFields: []fieldsKind{{protoreflect.MessageKind, "1.2"}, {protoreflect.Int32Kind, "1"}},
51*1c12ee1eSDan Willemsen		wantErr:  "field 1 of int32 type cannot have sub-fields",
52*1c12ee1eSDan Willemsen	}, {
53*1c12ee1eSDan Willemsen		inFields: []fieldsKind{{protoreflect.Int32Kind, "1"}, {protoreflect.MessageKind, "1.2"}},
54*1c12ee1eSDan Willemsen		wantErr:  "field 1 of int32 type cannot have sub-fields",
55*1c12ee1eSDan Willemsen	}, {
56*1c12ee1eSDan Willemsen		inFields: []fieldsKind{{protoreflect.Int32Kind, "30"}, {protoreflect.Int32Kind, "30"}},
57*1c12ee1eSDan Willemsen		wantErr:  "field 30 already set as int32 type",
58*1c12ee1eSDan Willemsen	}, {
59*1c12ee1eSDan Willemsen		inFields: []fieldsKind{
60*1c12ee1eSDan Willemsen			{protoreflect.Int32Kind, "10.20.31"},
61*1c12ee1eSDan Willemsen			{protoreflect.MessageKind, "  10.20.30, 10.21   "},
62*1c12ee1eSDan Willemsen			{protoreflect.GroupKind, "10"},
63*1c12ee1eSDan Willemsen		},
64*1c12ee1eSDan Willemsen		wantMsg: mustMakeMessage(`
65*1c12ee1eSDan Willemsen			name: "X"
66*1c12ee1eSDan Willemsen			field: [
67*1c12ee1eSDan Willemsen				{name:"x10" number:10 label:LABEL_OPTIONAL type:TYPE_GROUP type_name:".X.X10"}
68*1c12ee1eSDan Willemsen			]
69*1c12ee1eSDan Willemsen			nested_type: [{
70*1c12ee1eSDan Willemsen				name: "X10"
71*1c12ee1eSDan Willemsen				field: [
72*1c12ee1eSDan Willemsen					{name:"x20" number:20 label:LABEL_OPTIONAL type:TYPE_MESSAGE type_name:".X.X10.X20"},
73*1c12ee1eSDan Willemsen					{name:"x21" number:21 label:LABEL_OPTIONAL type:TYPE_MESSAGE type_name:".X.X10.X21"}
74*1c12ee1eSDan Willemsen				]
75*1c12ee1eSDan Willemsen				nested_type: [{
76*1c12ee1eSDan Willemsen					name: "X20"
77*1c12ee1eSDan Willemsen					field:[
78*1c12ee1eSDan Willemsen						{name:"x30" number:30 label:LABEL_OPTIONAL type:TYPE_MESSAGE, type_name:".X.X10.X20.X30"},
79*1c12ee1eSDan Willemsen						{name:"x31" number:31 label:LABEL_REPEATED type:TYPE_INT32 options:{packed:true}}
80*1c12ee1eSDan Willemsen					]
81*1c12ee1eSDan Willemsen					nested_type: [{
82*1c12ee1eSDan Willemsen						name: "X30"
83*1c12ee1eSDan Willemsen					}]
84*1c12ee1eSDan Willemsen				}, {
85*1c12ee1eSDan Willemsen					name: "X21"
86*1c12ee1eSDan Willemsen				}]
87*1c12ee1eSDan Willemsen			}]
88*1c12ee1eSDan Willemsen		`),
89*1c12ee1eSDan Willemsen	}}
90*1c12ee1eSDan Willemsen
91*1c12ee1eSDan Willemsen	for _, tt := range tests {
92*1c12ee1eSDan Willemsen		t.Run("", func(t *testing.T) {
93*1c12ee1eSDan Willemsen			var fields fields
94*1c12ee1eSDan Willemsen			for i, tc := range tt.inFields {
95*1c12ee1eSDan Willemsen				gotErr := fields.Set(tc.fields, tc.kind)
96*1c12ee1eSDan Willemsen				if gotErr != nil {
97*1c12ee1eSDan Willemsen					if tt.wantErr == "" || !strings.Contains(fmt.Sprint(gotErr), tt.wantErr) {
98*1c12ee1eSDan Willemsen						t.Fatalf("fields %d, Set(%q, %v) = %v, want %v", i, tc.fields, tc.kind, gotErr, tt.wantErr)
99*1c12ee1eSDan Willemsen					}
100*1c12ee1eSDan Willemsen					return
101*1c12ee1eSDan Willemsen				}
102*1c12ee1eSDan Willemsen			}
103*1c12ee1eSDan Willemsen			if tt.wantErr != "" {
104*1c12ee1eSDan Willemsen				t.Errorf("all Set calls succeeded, want %v error", tt.wantErr)
105*1c12ee1eSDan Willemsen			}
106*1c12ee1eSDan Willemsen			gotMsg := fields.messageDescriptor("X")
107*1c12ee1eSDan Willemsen			if !proto.Equal(gotMsg, tt.wantMsg) {
108*1c12ee1eSDan Willemsen				t.Errorf("messageDescriptor() mismatch:\ngot  %v\nwant %v", gotMsg, tt.wantMsg)
109*1c12ee1eSDan Willemsen			}
110*1c12ee1eSDan Willemsen			if _, err := fields.Descriptor(); err != nil {
111*1c12ee1eSDan Willemsen				t.Errorf("Descriptor() = %v, want nil error", err)
112*1c12ee1eSDan Willemsen			}
113*1c12ee1eSDan Willemsen		})
114*1c12ee1eSDan Willemsen	}
115*1c12ee1eSDan Willemsen}
116