Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow user to skip (ignore) specific caller frames in assert.CallerInfo() #1527

Open
xuxife opened this issue Jan 30, 2024 · 1 comment
Open

Comments

@xuxife
Copy link

xuxife commented Jan 30, 2024

Hi, I notice my assertion failure message sometimes has loooong stack traces, where most of them are from sdk or framework.
I hope there could be a feature that I can customize assert.CallerInfo(), such that I can focus the stacks in my codebase.

for instance, allow a package-level callback like SkipCallerFrame(pc uintptr, file, line string) bool to skip the frame if the callback returns true.

	callers := []string{}
	for i := 0; ; i++ {
		pc, file, line, ok = runtime.Caller(i)
		if !ok {
			// The breaks below failed to terminate the loop, and we ran off the
			// end of the call stack.
			break
		}

             +  if SkipCallerFrame(pc, file, line) {
             +          break
             +  }
		// This is a huge edge case, but it will panic if this is the case, see #180
		if file == "<autogenerated>" {
			break
		}

		f := runtime.FuncForPC(pc)
		if f == nil {
			break
		}
		name = f.Name()

		// testing.tRunner is the standard library function that calls
		// tests. Subtests are called directly by tRunner, without going through
		// the Test/Benchmark/Example function that contains the t.Run calls, so
		// with subtests we should break when we hit tRunner, without adding it
		// to the list of callers.
		if name == "testing.tRunner" {
			break
		}
@brackendawson
Copy link
Collaborator

An aside: I'm pretty sure CallerInfo isn't supposed to be exported. I've noted this in #1431.

How long is too long? Can you show us an example? In go 1.21 the Go runtime chose to only print the first and last 50 frames: https://tip.golang.org/doc/go1.21#runtime-changes We could emulate that.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants