| // Copyright 2023 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 runtime_test | |
| import ( | |
| "reflect" | |
| "runtime" | |
| "runtime/metrics" | |
| "testing" | |
| ) | |
| func TestPanicNil(t *testing.T) { | |
| t.Run("default", func(t *testing.T) { | |
| checkPanicNil(t, new(runtime.PanicNilError)) | |
| }) | |
| t.Run("GODEBUG=panicnil=0", func(t *testing.T) { | |
| t.Setenv("GODEBUG", "panicnil=0") | |
| checkPanicNil(t, new(runtime.PanicNilError)) | |
| }) | |
| t.Run("GODEBUG=panicnil=1", func(t *testing.T) { | |
| t.Setenv("GODEBUG", "panicnil=1") | |
| checkPanicNil(t, nil) | |
| }) | |
| } | |
| func checkPanicNil(t *testing.T, want any) { | |
| name := "/godebug/non-default-behavior/panicnil:events" | |
| s := []metrics.Sample{{Name: name}} | |
| metrics.Read(s) | |
| v1 := s[0].Value.Uint64() | |
| defer func() { | |
| e := recover() | |
| if reflect.TypeOf(e) != reflect.TypeOf(want) { | |
| println(e, want) | |
| t.Errorf("recover() = %v, want %v", e, want) | |
| panic(e) | |
| } | |
| metrics.Read(s) | |
| v2 := s[0].Value.Uint64() | |
| if want == nil { | |
| if v2 != v1+1 { | |
| t.Errorf("recover() with panicnil=1 did not increment metric %s", name) | |
| } | |
| } else { | |
| if v2 != v1 { | |
| t.Errorf("recover() with panicnil=0 incremented metric %s: %d -> %d", name, v1, v2) | |
| } | |
| } | |
| }() | |
| panic(nil) | |
| } |