|  | // 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) | 
|  | } |