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