-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathdebug.go
61 lines (54 loc) · 1.84 KB
/
debug.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package mocker
import (
"reflect"
"github.com/tencent/goom/arg"
"github.com/tencent/goom/internal/hack"
"github.com/tencent/goom/internal/iface"
"github.com/tencent/goom/internal/logger"
)
// excludeFunc 对 excludeFunc 不进行拦截
const (
excludeFunc = "time.Now"
)
// interceptDebugInfo 添加对 apply 的拦截代理,截取函数调用信息用于 debug
func interceptDebugInfo(imp interface{}, pFunc iface.PFunc, mocker Mocker) (interface{}, iface.PFunc) {
if !logger.IsDebugOpen() {
return imp, pFunc
}
// 因为当使用了 when 时候,imp 代理会被覆盖,pFunc 会生效; 所以优先拦截有 pFunc 代理的 mock 回调
if pFunc != nil {
originPFunc := pFunc
pFunc = func(params []reflect.Value) []reflect.Value {
results := originPFunc(params)
// 日志打印用到了 time.Now,避免递归死循环
if mocker.String() == excludeFunc {
return results
}
logger.Consolefc(logger.DebugLevel, "mocker [%s] called, args [%s], results [%s]",
logger.Caller(hack.InterceptCallerSkip), mocker.String(), arg.SprintV(params), arg.SprintV(results))
return results
}
return imp, pFunc
}
if imp != nil {
originImp := imp
impType := reflect.TypeOf(imp)
imp = reflect.MakeFunc(impType, func(params []reflect.Value) []reflect.Value {
var results []reflect.Value
if impType.IsVariadic() {
results = reflect.ValueOf(originImp).CallSlice(params)
} else {
results = reflect.ValueOf(originImp).Call(params)
}
// 日志打印用到了 time.Now,避免递归死循环
if mocker.String() == excludeFunc {
return results
}
logger.Consolefc(logger.DebugLevel, "mocker [%s] called, args [%s], results [%s]",
logger.Caller(hack.InterceptCallerSkip), mocker.String(), arg.SprintV(params), arg.SprintV(results))
return results
}).Interface()
return imp, pFunc
}
return imp, pFunc
}