12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- package framework
- import (
- "bytes"
- "fmt"
- "regexp"
- "runtime/debug"
- "time"
- "github.com/onsi/ginkgo"
- e2eginkgowrapper "github.com/fatedier/frp/test/e2e/framework/ginkgowrapper"
- )
- func nowStamp() string {
- return time.Now().Format(time.StampMilli)
- }
- func log(level string, format string, args ...interface{}) {
- fmt.Fprintf(ginkgo.GinkgoWriter, nowStamp()+": "+level+": "+format+"\n", args...)
- }
- func Logf(format string, args ...interface{}) {
- log("INFO", format, args...)
- }
- func Failf(format string, args ...interface{}) {
- FailfWithOffset(1, format, args...)
- }
- func FailfWithOffset(offset int, format string, args ...interface{}) {
- msg := fmt.Sprintf(format, args...)
- skip := offset + 1
- log("FAIL", "%s\n\nFull Stack Trace\n%s", msg, PrunedStack(skip))
- e2eginkgowrapper.Fail(nowStamp()+": "+msg, skip)
- }
- func Fail(msg string, callerSkip ...int) {
- skip := 1
- if len(callerSkip) > 0 {
- skip += callerSkip[0]
- }
- log("FAIL", "%s\n\nFull Stack Trace\n%s", msg, PrunedStack(skip))
- e2eginkgowrapper.Fail(nowStamp()+": "+msg, skip)
- }
- var codeFilterRE = regexp.MustCompile(`/github.com/onsi/ginkgo/`)
- func PrunedStack(skip int) []byte {
- fullStackTrace := debug.Stack()
- stack := bytes.Split(fullStackTrace, []byte("\n"))
-
-
- if len(stack) > 0 && bytes.HasPrefix(stack[0], []byte("goroutine ")) {
-
- stack = stack[1:]
- }
-
-
-
- skip += 2
- if len(stack) > 2*skip {
- stack = stack[2*skip:]
- }
- n := 0
- for i := 0; i < len(stack)/2; i++ {
-
- if !codeFilterRE.Match([]byte(stack[i*2+1])) {
- stack[n] = stack[i*2]
- stack[n+1] = stack[i*2+1]
- n += 2
- }
- }
- stack = stack[:n]
- return bytes.Join(stack, []byte("\n"))
- }
|