forked from rogchap/v8go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cpuprofiler_test.go
109 lines (90 loc) · 2.33 KB
/
cpuprofiler_test.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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// Copyright 2021 the v8go contributors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package v8go_test
import (
"testing"
v8 "rogchap.com/v8go"
)
func TestCPUProfiler_Dispose(t *testing.T) {
t.Parallel()
iso := v8.NewIsolate()
defer iso.Dispose()
cpuProfiler := v8.NewCPUProfiler(iso)
cpuProfiler.Dispose()
// noop when called multiple times
cpuProfiler.Dispose()
// verify panics when profiler disposed
if recoverPanic(func() { cpuProfiler.StartProfiling("") }) == nil {
t.Error("expected panic")
}
if recoverPanic(func() { cpuProfiler.StopProfiling("") }) == nil {
t.Error("expected panic")
}
cpuProfiler = v8.NewCPUProfiler(iso)
defer cpuProfiler.Dispose()
iso.Dispose()
// verify panics when isolate disposed
if recoverPanic(func() { cpuProfiler.StartProfiling("") }) == nil {
t.Error("expected panic")
}
if recoverPanic(func() { cpuProfiler.StopProfiling("") }) == nil {
t.Error("expected panic")
}
}
func TestCPUProfiler(t *testing.T) {
t.Parallel()
ctx := v8.NewContext(nil)
iso := ctx.Isolate()
defer iso.Dispose()
defer ctx.Close()
cpuProfiler := v8.NewCPUProfiler(iso)
defer cpuProfiler.Dispose()
title := "cpuprofilertest"
cpuProfiler.StartProfiling(title)
_, err := ctx.RunScript(profileScript, "script.js")
fatalIf(t, err)
val, err := ctx.Global().Get("start")
fatalIf(t, err)
fn, err := val.AsFunction()
fatalIf(t, err)
timeout, err := v8.NewValue(iso, int32(0))
fatalIf(t, err)
_, err = fn.Call(ctx.Global(), timeout)
fatalIf(t, err)
cpuProfile := cpuProfiler.StopProfiling(title)
defer cpuProfile.Delete()
if cpuProfile.GetTitle() != title {
t.Errorf("expected %s, but got %s", title, cpuProfile.GetTitle())
}
}
const profileScript = `function loop(timeout) {
this.mmm = 0;
var start = Date.now();
while (Date.now() - start < timeout) {
var n = 10;
while(n > 1) {
n--;
this.mmm += n * n * n;
}
}
}
function delay() { try { loop(10); } catch(e) { } }
function bar() { delay(); }
function baz() { delay(); }
function foo() {
try {
delay();
bar();
delay();
baz();
} catch (e) { }
}
function start(timeout) {
var start = Date.now();
do {
foo();
var duration = Date.now() - start;
} while (duration < timeout);
return duration;
};`