Skip to content
This repository was archived by the owner on Aug 17, 2020. It is now read-only.

Commit bedb332

Browse files
committed
changes
1 parent d3df6d6 commit bedb332

File tree

3 files changed

+82
-55
lines changed

3 files changed

+82
-55
lines changed

autoinstrument/init.go

+29-21
Original file line numberDiff line numberDiff line change
@@ -18,31 +18,39 @@ var (
1818

1919
func init() {
2020
once.Do(func() {
21-
var m *testing.M
22-
var mRunMethod reflect.Method
23-
var ok bool
24-
mType := reflect.TypeOf(m)
25-
if mRunMethod, ok = mType.MethodByName("Run"); !ok {
26-
return
27-
}
28-
29-
var runPatch *mpatch.Patch
30-
var err error
31-
runPatch, err = mpatch.PatchMethodByReflect(mRunMethod, func(m *testing.M) int {
32-
logOnError(runPatch.Unpatch())
33-
defer func() {
34-
logOnError(runPatch.Patch())
35-
}()
36-
scopetesting.PatchTestingLogger()
37-
defer scopetesting.UnpatchTestingLogger()
38-
return scopeagent.Run(m)
39-
})
40-
logOnError(err)
21+
patchMRun()
22+
scopetesting.PatchTRun()
23+
scopetesting.PatchBRun()
4124
})
4225
}
4326

44-
func logOnError(err error) {
27+
func patchMRun() {
28+
var m *testing.M
29+
var mRunMethod reflect.Method
30+
var ok bool
31+
mType := reflect.TypeOf(m)
32+
if mRunMethod, ok = mType.MethodByName("Run"); !ok {
33+
return
34+
}
35+
36+
var runPatch *mpatch.Patch
37+
var err error
38+
runPatch, err = mpatch.PatchMethodByReflect(mRunMethod, func(m *testing.M) int {
39+
logOnError(runPatch.Unpatch())
40+
defer func() {
41+
logOnError(runPatch.Patch())
42+
}()
43+
scopetesting.PatchTestingLogger()
44+
defer scopetesting.UnpatchTestingLogger()
45+
return scopeagent.Run(m)
46+
})
47+
logOnError(err)
48+
}
49+
50+
func logOnError(err error) bool {
4551
if err != nil {
4652
instrumentation.Logger().Println(err)
53+
return true
4754
}
55+
return false
4856
}

instrumentation/testing/init.go

+49-31
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package testing
22

33
import (
4-
"os"
54
"reflect"
65
"runtime"
76
"testing"
@@ -11,6 +10,11 @@ import (
1110
"go.undefinedlabs.com/scopeagent/reflection"
1211
)
1312

13+
var (
14+
tRunPatched bool
15+
bRunPatched bool
16+
)
17+
1418
// Initialize the testing instrumentation
1519
func Init(m *testing.M) {
1620
if tPointer, err := reflection.GetFieldPointerOf(m, "tests"); err == nil {
@@ -41,7 +45,7 @@ func Init(m *testing.M) {
4145
benchmarks = append(benchmarks, testing.InternalBenchmark{
4246
Name: benchmark.Name,
4347
F: func(b *testing.B) { // Indirection of the original benchmark
44-
if envDMPatch, set := os.LookupEnv("SCOPE_DISABLE_MONKEY_PATCHING"); !set || envDMPatch == "" {
48+
if bRunPatched {
4549
funcValue(b)
4650
} else {
4751
startBenchmark(b, funcPointer, funcValue)
@@ -51,36 +55,50 @@ func Init(m *testing.M) {
5155
}
5256
*intBenchmarks = benchmarks
5357
}
58+
}
5459

55-
if envDMPatch, set := os.LookupEnv("SCOPE_DISABLE_MONKEY_PATCHING"); !set || envDMPatch == "" {
56-
// We monkey patch the `testing.T.Run()` func to auto instrument sub tests
57-
var t *testing.T
58-
tType := reflect.TypeOf(t)
59-
if tRunMethod, ok := tType.MethodByName("Run"); ok {
60-
_, err := mpatch.PatchMethodByReflect(tRunMethod, func(t *testing.T, name string, f func(t *testing.T)) bool {
61-
pc, _, _, _ := runtime.Caller(1)
62-
gT := FromTestingT(t)
63-
return gT.Run(name, func(childT *testing.T) {
64-
addAutoInstrumentedTest(childT)
65-
childTest := StartTestFromCaller(childT, pc)
66-
defer childTest.end()
67-
f(childT)
68-
})
69-
})
70-
logOnError(err)
71-
}
60+
func PatchTRun() {
61+
// We monkey patch the `testing.T.Run()` func to auto instrument sub tests
62+
var t *testing.T
63+
var tRunMethod reflect.Method
64+
var ok bool
65+
tType := reflect.TypeOf(t)
66+
if tRunMethod, ok = tType.MethodByName("Run"); !ok {
67+
return
68+
}
7269

73-
// We monkey patch the `testing.B.Run()` func to auto instrument sub benchmark
74-
var b *testing.B
75-
bType := reflect.TypeOf(b)
76-
if bRunMethod, ok := bType.MethodByName("Run"); ok {
77-
_, err := mpatch.PatchMethodByReflect(bRunMethod, func(b *testing.B, name string, f func(b *testing.B)) bool {
78-
pc, _, _, _ := runtime.Caller(1)
79-
return FromTestingB(b).Run(name, func(b *testing.B) {
80-
StartBenchmark(b, pc, f)
81-
})
82-
})
83-
logOnError(err)
84-
}
70+
_, err := mpatch.PatchMethodByReflect(tRunMethod, func(t *testing.T, name string, f func(t *testing.T)) bool {
71+
pc, _, _, _ := runtime.Caller(1)
72+
gT := FromTestingT(t)
73+
return gT.Run(name, func(childT *testing.T) {
74+
addAutoInstrumentedTest(childT)
75+
childTest := StartTestFromCaller(childT, pc)
76+
defer childTest.end()
77+
f(childT)
78+
})
79+
})
80+
if !logOnError(err) {
81+
tRunPatched = true
82+
}
83+
}
84+
85+
func PatchBRun() {
86+
// We monkey patch the `testing.B.Run()` func to auto instrument sub benchmark
87+
var b *testing.B
88+
var bRunMethod reflect.Method
89+
var ok bool
90+
bType := reflect.TypeOf(b)
91+
if bRunMethod, ok = bType.MethodByName("Run"); !ok {
92+
return
93+
}
94+
95+
_, err := mpatch.PatchMethodByReflect(bRunMethod, func(b *testing.B, name string, f func(b *testing.B)) bool {
96+
pc, _, _, _ := runtime.Caller(1)
97+
return FromTestingB(b).Run(name, func(b *testing.B) {
98+
StartBenchmark(b, pc, f)
99+
})
100+
})
101+
if !logOnError(err) {
102+
bRunPatched = true
85103
}
86104
}

instrumentation/testing/logger.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -149,17 +149,18 @@ func patch(methodName string, methodBody func(test *Test, argsValues []reflect.V
149149
methodBody(test, in[1:])
150150
return nil
151151
})
152-
logOnError(err)
153-
if err == nil {
152+
if !logOnError(err) {
154153
patches[methodName] = methodPatch
155154
patchPointers[reflect.ValueOf(methodBody).Pointer()] = true
156155
}
157156
}
158157

159-
func logOnError(err error) {
158+
func logOnError(err error) bool {
160159
if err != nil {
161160
instrumentation.Logger().Println(err)
161+
return true
162162
}
163+
return false
163164
}
164165

165166
func isAPatchPointer(ptr uintptr) bool {

0 commit comments

Comments
 (0)