diff options
Diffstat (limited to 'proto/nil_test.go')
-rw-r--r-- | proto/nil_test.go | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/proto/nil_test.go b/proto/nil_test.go new file mode 100644 index 00000000..29d259d7 --- /dev/null +++ b/proto/nil_test.go @@ -0,0 +1,176 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package proto_test + +import ( + "testing" + + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/reflect/protoreflect" + + testpb "google.golang.org/protobuf/internal/testprotos/test" +) + +// TestNil tests for boundary conditions when nil and typed-nil messages +// are passed to various top-level functions. +// These tests are not necessarily a statement of proper behavior, +// but exist to detect accidental changes in behavior. +func TestNil(t *testing.T) { + nilMsg := (*testpb.TestAllExtensions)(nil) + extType := testpb.E_OptionalBool + extRanger := func(protoreflect.ExtensionType, interface{}) bool { return true } + + tests := []struct { + label string + test func() + panic bool + }{{ + label: "Size", + test: func() { proto.Size(nil) }, + }, { + label: "Size", + test: func() { proto.Size(nilMsg) }, + }, { + label: "Marshal", + test: func() { proto.Marshal(nil) }, + }, { + label: "Marshal", + test: func() { proto.Marshal(nilMsg) }, + }, { + label: "Unmarshal", + test: func() { proto.Unmarshal(nil, nil) }, + panic: true, + }, { + label: "Unmarshal", + test: func() { proto.Unmarshal(nil, nilMsg) }, + panic: true, + }, { + label: "Merge", + test: func() { proto.Merge(nil, nil) }, + panic: true, + }, { + label: "Merge", + test: func() { proto.Merge(nil, nilMsg) }, + panic: true, + }, { + label: "Merge", + test: func() { proto.Merge(nilMsg, nil) }, + panic: true, + }, { + label: "Merge", + test: func() { proto.Merge(nilMsg, nilMsg) }, + panic: true, + }, { + label: "Clone", + test: func() { proto.Clone(nil) }, + }, { + label: "Clone", + test: func() { proto.Clone(nilMsg) }, + }, { + label: "Equal", + test: func() { proto.Equal(nil, nil) }, + }, { + label: "Equal", + test: func() { proto.Equal(nil, nilMsg) }, + }, { + label: "Equal", + test: func() { proto.Equal(nilMsg, nil) }, + }, { + label: "Equal", + test: func() { proto.Equal(nilMsg, nilMsg) }, + }, { + label: "Reset", + test: func() { proto.Reset(nil) }, + panic: true, + }, { + label: "Reset", + test: func() { proto.Reset(nilMsg) }, + panic: true, + }, { + label: "HasExtension", + test: func() { proto.HasExtension(nil, nil) }, + }, { + label: "HasExtension", + test: func() { proto.HasExtension(nil, extType) }, + }, { + label: "HasExtension", + test: func() { proto.HasExtension(nilMsg, nil) }, + }, { + label: "HasExtension", + test: func() { proto.HasExtension(nilMsg, extType) }, + }, { + label: "GetExtension", + test: func() { proto.GetExtension(nil, nil) }, + panic: true, + }, { + label: "GetExtension", + test: func() { proto.GetExtension(nil, extType) }, + }, { + label: "GetExtension", + test: func() { proto.GetExtension(nilMsg, nil) }, + panic: true, + }, { + label: "GetExtension", + test: func() { proto.GetExtension(nilMsg, extType) }, + }, { + label: "SetExtension", + test: func() { proto.SetExtension(nil, nil, true) }, + panic: true, + }, { + label: "SetExtension", + test: func() { proto.SetExtension(nil, extType, true) }, + panic: true, + }, { + label: "SetExtension", + test: func() { proto.SetExtension(nilMsg, nil, true) }, + panic: true, + }, { + label: "SetExtension", + test: func() { proto.SetExtension(nilMsg, extType, true) }, + panic: true, + }, { + label: "ClearExtension", + test: func() { proto.ClearExtension(nil, nil) }, + panic: true, + }, { + label: "ClearExtension", + test: func() { proto.ClearExtension(nil, extType) }, + panic: true, + }, { + label: "ClearExtension", + test: func() { proto.ClearExtension(nilMsg, nil) }, + panic: true, + }, { + label: "ClearExtension", + test: func() { proto.ClearExtension(nilMsg, extType) }, + panic: true, + }, { + label: "RangeExtensions", + test: func() { proto.RangeExtensions(nil, nil) }, + }, { + label: "RangeExtensions", + test: func() { proto.RangeExtensions(nil, extRanger) }, + }, { + label: "RangeExtensions", + test: func() { proto.RangeExtensions(nilMsg, nil) }, + }, { + label: "RangeExtensions", + test: func() { proto.RangeExtensions(nilMsg, extRanger) }, + }} + + for _, tt := range tests { + t.Run(tt.label, func(t *testing.T) { + defer func() { + switch gotPanic := recover() != nil; { + case gotPanic && !tt.panic: + t.Errorf("unexpected panic") + case !gotPanic && tt.panic: + t.Errorf("expected panic") + } + }() + tt.test() + }) + } +} |