59 lines
1.6 KiB
Go
59 lines
1.6 KiB
Go
//go:build enable_antithesis_sdk
|
|
|
|
package assert
|
|
|
|
import (
|
|
"path"
|
|
"runtime"
|
|
"strings"
|
|
)
|
|
|
|
// stackFrameOffset indicates how many frames to go up in the
|
|
// call stack to find the filename/location/line info. As
|
|
// this work is always done in NewLocationInfo(), the offset is
|
|
// specified from the perspective of NewLocationInfo
|
|
type stackFrameOffset int
|
|
|
|
// Order is important here since iota is being used
|
|
const (
|
|
offsetNewLocationInfo stackFrameOffset = iota
|
|
offsetHere
|
|
offsetAPICaller
|
|
offsetAPICallersCaller
|
|
)
|
|
|
|
// locationInfo represents the attributes known at instrumentation time
|
|
// for each Antithesis assertion discovered
|
|
type locationInfo struct {
|
|
Classname string `json:"class"`
|
|
Funcname string `json:"function"`
|
|
Filename string `json:"file"`
|
|
Line int `json:"begin_line"`
|
|
Column int `json:"begin_column"`
|
|
}
|
|
|
|
// columnUnknown is used when the column associated with
|
|
// a locationInfo is not available
|
|
const columnUnknown = 0
|
|
|
|
// NewLocationInfo creates a locationInfo directly from
|
|
// the current execution context
|
|
func newLocationInfo(nframes stackFrameOffset) *locationInfo {
|
|
// Get location info and add to details
|
|
funcname := "*function*"
|
|
classname := "*class*"
|
|
pc, filename, line, ok := runtime.Caller(int(nframes))
|
|
if !ok {
|
|
filename = "*file*"
|
|
line = 0
|
|
} else {
|
|
if this_func := runtime.FuncForPC(pc); this_func != nil {
|
|
fullname := this_func.Name()
|
|
funcname = path.Ext(fullname)
|
|
classname, _ = strings.CutSuffix(fullname, funcname)
|
|
funcname = funcname[1:]
|
|
}
|
|
}
|
|
return &locationInfo{classname, funcname, filename, line, columnUnknown}
|
|
}
|