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