xref: /aosp_15_r20/external/golang-protobuf/proto/nil_test.go (revision 1c12ee1efe575feb122dbf939ff15148a3b3e8f2)
1*1c12ee1eSDan Willemsen// Copyright 2020 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 proto_test
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	testpb "google.golang.org/protobuf/internal/testprotos/test"
14*1c12ee1eSDan Willemsen)
15*1c12ee1eSDan Willemsen
16*1c12ee1eSDan Willemsen// TestNil tests for boundary conditions when nil and typed-nil messages
17*1c12ee1eSDan Willemsen// are passed to various top-level functions.
18*1c12ee1eSDan Willemsen// These tests are not necessarily a statement of proper behavior,
19*1c12ee1eSDan Willemsen// but exist to detect accidental changes in behavior.
20*1c12ee1eSDan Willemsenfunc TestNil(t *testing.T) {
21*1c12ee1eSDan Willemsen	nilMsg := (*testpb.TestAllExtensions)(nil)
22*1c12ee1eSDan Willemsen	extType := testpb.E_OptionalBool
23*1c12ee1eSDan Willemsen	extRanger := func(protoreflect.ExtensionType, interface{}) bool { return true }
24*1c12ee1eSDan Willemsen
25*1c12ee1eSDan Willemsen	tests := []struct {
26*1c12ee1eSDan Willemsen		label string
27*1c12ee1eSDan Willemsen		test  func()
28*1c12ee1eSDan Willemsen		panic bool
29*1c12ee1eSDan Willemsen	}{{
30*1c12ee1eSDan Willemsen		label: "Size",
31*1c12ee1eSDan Willemsen		test:  func() { proto.Size(nil) },
32*1c12ee1eSDan Willemsen	}, {
33*1c12ee1eSDan Willemsen		label: "Size",
34*1c12ee1eSDan Willemsen		test:  func() { proto.Size(nilMsg) },
35*1c12ee1eSDan Willemsen	}, {
36*1c12ee1eSDan Willemsen		label: "Marshal",
37*1c12ee1eSDan Willemsen		test:  func() { proto.Marshal(nil) },
38*1c12ee1eSDan Willemsen	}, {
39*1c12ee1eSDan Willemsen		label: "Marshal",
40*1c12ee1eSDan Willemsen		test:  func() { proto.Marshal(nilMsg) },
41*1c12ee1eSDan Willemsen	}, {
42*1c12ee1eSDan Willemsen		label: "Unmarshal",
43*1c12ee1eSDan Willemsen		test:  func() { proto.Unmarshal(nil, nil) },
44*1c12ee1eSDan Willemsen		panic: true,
45*1c12ee1eSDan Willemsen	}, {
46*1c12ee1eSDan Willemsen		label: "Unmarshal",
47*1c12ee1eSDan Willemsen		test:  func() { proto.Unmarshal(nil, nilMsg) },
48*1c12ee1eSDan Willemsen		panic: true,
49*1c12ee1eSDan Willemsen	}, {
50*1c12ee1eSDan Willemsen		label: "Merge",
51*1c12ee1eSDan Willemsen		test:  func() { proto.Merge(nil, nil) },
52*1c12ee1eSDan Willemsen		panic: true,
53*1c12ee1eSDan Willemsen	}, {
54*1c12ee1eSDan Willemsen		label: "Merge",
55*1c12ee1eSDan Willemsen		test:  func() { proto.Merge(nil, nilMsg) },
56*1c12ee1eSDan Willemsen		panic: true,
57*1c12ee1eSDan Willemsen	}, {
58*1c12ee1eSDan Willemsen		label: "Merge",
59*1c12ee1eSDan Willemsen		test:  func() { proto.Merge(nilMsg, nil) },
60*1c12ee1eSDan Willemsen		panic: true,
61*1c12ee1eSDan Willemsen	}, {
62*1c12ee1eSDan Willemsen		label: "Merge",
63*1c12ee1eSDan Willemsen		test:  func() { proto.Merge(nilMsg, nilMsg) },
64*1c12ee1eSDan Willemsen		panic: true,
65*1c12ee1eSDan Willemsen	}, {
66*1c12ee1eSDan Willemsen		label: "Clone",
67*1c12ee1eSDan Willemsen		test:  func() { proto.Clone(nil) },
68*1c12ee1eSDan Willemsen	}, {
69*1c12ee1eSDan Willemsen		label: "Clone",
70*1c12ee1eSDan Willemsen		test:  func() { proto.Clone(nilMsg) },
71*1c12ee1eSDan Willemsen	}, {
72*1c12ee1eSDan Willemsen		label: "Equal",
73*1c12ee1eSDan Willemsen		test:  func() { proto.Equal(nil, nil) },
74*1c12ee1eSDan Willemsen	}, {
75*1c12ee1eSDan Willemsen		label: "Equal",
76*1c12ee1eSDan Willemsen		test:  func() { proto.Equal(nil, nilMsg) },
77*1c12ee1eSDan Willemsen	}, {
78*1c12ee1eSDan Willemsen		label: "Equal",
79*1c12ee1eSDan Willemsen		test:  func() { proto.Equal(nilMsg, nil) },
80*1c12ee1eSDan Willemsen	}, {
81*1c12ee1eSDan Willemsen		label: "Equal",
82*1c12ee1eSDan Willemsen		test:  func() { proto.Equal(nilMsg, nilMsg) },
83*1c12ee1eSDan Willemsen	}, {
84*1c12ee1eSDan Willemsen		label: "Reset",
85*1c12ee1eSDan Willemsen		test:  func() { proto.Reset(nil) },
86*1c12ee1eSDan Willemsen		panic: true,
87*1c12ee1eSDan Willemsen	}, {
88*1c12ee1eSDan Willemsen		label: "Reset",
89*1c12ee1eSDan Willemsen		test:  func() { proto.Reset(nilMsg) },
90*1c12ee1eSDan Willemsen		panic: true,
91*1c12ee1eSDan Willemsen	}, {
92*1c12ee1eSDan Willemsen		label: "HasExtension",
93*1c12ee1eSDan Willemsen		test:  func() { proto.HasExtension(nil, nil) },
94*1c12ee1eSDan Willemsen	}, {
95*1c12ee1eSDan Willemsen		label: "HasExtension",
96*1c12ee1eSDan Willemsen		test:  func() { proto.HasExtension(nil, extType) },
97*1c12ee1eSDan Willemsen	}, {
98*1c12ee1eSDan Willemsen		label: "HasExtension",
99*1c12ee1eSDan Willemsen		test:  func() { proto.HasExtension(nilMsg, nil) },
100*1c12ee1eSDan Willemsen	}, {
101*1c12ee1eSDan Willemsen		label: "HasExtension",
102*1c12ee1eSDan Willemsen		test:  func() { proto.HasExtension(nilMsg, extType) },
103*1c12ee1eSDan Willemsen	}, {
104*1c12ee1eSDan Willemsen		label: "GetExtension",
105*1c12ee1eSDan Willemsen		test:  func() { proto.GetExtension(nil, nil) },
106*1c12ee1eSDan Willemsen		panic: true,
107*1c12ee1eSDan Willemsen	}, {
108*1c12ee1eSDan Willemsen		label: "GetExtension",
109*1c12ee1eSDan Willemsen		test:  func() { proto.GetExtension(nil, extType) },
110*1c12ee1eSDan Willemsen	}, {
111*1c12ee1eSDan Willemsen		label: "GetExtension",
112*1c12ee1eSDan Willemsen		test:  func() { proto.GetExtension(nilMsg, nil) },
113*1c12ee1eSDan Willemsen		panic: true,
114*1c12ee1eSDan Willemsen	}, {
115*1c12ee1eSDan Willemsen		label: "GetExtension",
116*1c12ee1eSDan Willemsen		test:  func() { proto.GetExtension(nilMsg, extType) },
117*1c12ee1eSDan Willemsen	}, {
118*1c12ee1eSDan Willemsen		label: "SetExtension",
119*1c12ee1eSDan Willemsen		test:  func() { proto.SetExtension(nil, nil, true) },
120*1c12ee1eSDan Willemsen		panic: true,
121*1c12ee1eSDan Willemsen	}, {
122*1c12ee1eSDan Willemsen		label: "SetExtension",
123*1c12ee1eSDan Willemsen		test:  func() { proto.SetExtension(nil, extType, true) },
124*1c12ee1eSDan Willemsen		panic: true,
125*1c12ee1eSDan Willemsen	}, {
126*1c12ee1eSDan Willemsen		label: "SetExtension",
127*1c12ee1eSDan Willemsen		test:  func() { proto.SetExtension(nilMsg, nil, true) },
128*1c12ee1eSDan Willemsen		panic: true,
129*1c12ee1eSDan Willemsen	}, {
130*1c12ee1eSDan Willemsen		label: "SetExtension",
131*1c12ee1eSDan Willemsen		test:  func() { proto.SetExtension(nilMsg, extType, true) },
132*1c12ee1eSDan Willemsen		panic: true,
133*1c12ee1eSDan Willemsen	}, {
134*1c12ee1eSDan Willemsen		label: "ClearExtension",
135*1c12ee1eSDan Willemsen		test:  func() { proto.ClearExtension(nil, nil) },
136*1c12ee1eSDan Willemsen		panic: true,
137*1c12ee1eSDan Willemsen	}, {
138*1c12ee1eSDan Willemsen		label: "ClearExtension",
139*1c12ee1eSDan Willemsen		test:  func() { proto.ClearExtension(nil, extType) },
140*1c12ee1eSDan Willemsen		panic: true,
141*1c12ee1eSDan Willemsen	}, {
142*1c12ee1eSDan Willemsen		label: "ClearExtension",
143*1c12ee1eSDan Willemsen		test:  func() { proto.ClearExtension(nilMsg, nil) },
144*1c12ee1eSDan Willemsen		panic: true,
145*1c12ee1eSDan Willemsen	}, {
146*1c12ee1eSDan Willemsen		label: "ClearExtension",
147*1c12ee1eSDan Willemsen		test:  func() { proto.ClearExtension(nilMsg, extType) },
148*1c12ee1eSDan Willemsen		panic: true,
149*1c12ee1eSDan Willemsen	}, {
150*1c12ee1eSDan Willemsen		label: "RangeExtensions",
151*1c12ee1eSDan Willemsen		test:  func() { proto.RangeExtensions(nil, nil) },
152*1c12ee1eSDan Willemsen	}, {
153*1c12ee1eSDan Willemsen		label: "RangeExtensions",
154*1c12ee1eSDan Willemsen		test:  func() { proto.RangeExtensions(nil, extRanger) },
155*1c12ee1eSDan Willemsen	}, {
156*1c12ee1eSDan Willemsen		label: "RangeExtensions",
157*1c12ee1eSDan Willemsen		test:  func() { proto.RangeExtensions(nilMsg, nil) },
158*1c12ee1eSDan Willemsen	}, {
159*1c12ee1eSDan Willemsen		label: "RangeExtensions",
160*1c12ee1eSDan Willemsen		test:  func() { proto.RangeExtensions(nilMsg, extRanger) },
161*1c12ee1eSDan Willemsen	}}
162*1c12ee1eSDan Willemsen
163*1c12ee1eSDan Willemsen	for _, tt := range tests {
164*1c12ee1eSDan Willemsen		t.Run(tt.label, func(t *testing.T) {
165*1c12ee1eSDan Willemsen			defer func() {
166*1c12ee1eSDan Willemsen				switch gotPanic := recover() != nil; {
167*1c12ee1eSDan Willemsen				case gotPanic && !tt.panic:
168*1c12ee1eSDan Willemsen					t.Errorf("unexpected panic")
169*1c12ee1eSDan Willemsen				case !gotPanic && tt.panic:
170*1c12ee1eSDan Willemsen					t.Errorf("expected panic")
171*1c12ee1eSDan Willemsen				}
172*1c12ee1eSDan Willemsen			}()
173*1c12ee1eSDan Willemsen			tt.test()
174*1c12ee1eSDan Willemsen		})
175*1c12ee1eSDan Willemsen	}
176*1c12ee1eSDan Willemsen}
177