103 lines
2.0 KiB
Go
103 lines
2.0 KiB
Go
package goja
|
|
|
|
import (
|
|
"sync/atomic"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestProfiler(t *testing.T) {
|
|
|
|
err := StartProfile(nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
vm := New()
|
|
go func() {
|
|
_, err := vm.RunScript("test123.js", `
|
|
const a = 2 + 2;
|
|
function loop() {
|
|
for(;;) {}
|
|
}
|
|
loop();
|
|
`)
|
|
if err != nil {
|
|
if _, ok := err.(*InterruptedError); !ok {
|
|
panic(err)
|
|
}
|
|
}
|
|
}()
|
|
|
|
time.Sleep(200 * time.Millisecond)
|
|
|
|
atomic.StoreInt32(&globalProfiler.enabled, 0)
|
|
pr := globalProfiler.p.stop()
|
|
|
|
if len(pr.Sample) == 0 {
|
|
t.Fatal("No samples were recorded")
|
|
}
|
|
|
|
var running bool
|
|
for i := 0; i < 10; i++ {
|
|
time.Sleep(10 * time.Millisecond)
|
|
globalProfiler.p.mu.Lock()
|
|
running = globalProfiler.p.running
|
|
globalProfiler.p.mu.Unlock()
|
|
if !running {
|
|
break
|
|
}
|
|
}
|
|
if running {
|
|
t.Fatal("The profiler is still running")
|
|
}
|
|
vm.Interrupt(nil)
|
|
}
|
|
|
|
func TestProfiler1(t *testing.T) {
|
|
t.Skip("This test takes too long with race detector enabled and is non-deterministic. It's left here mostly for documentation purposes.")
|
|
|
|
err := StartProfile(nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
go func() {
|
|
sleep := func() {
|
|
time.Sleep(1 * time.Second)
|
|
}
|
|
// Spawn new vms faster than once every 10ms (the profiler interval) and make sure they don't finish too soon.
|
|
// This means (*profiler).run() won't be fast enough to collect the samples, so they must be collected
|
|
// after the profiler is stopped.
|
|
for i := 0; i < 500; i++ {
|
|
go func() {
|
|
vm := New()
|
|
vm.Set("sleep", sleep)
|
|
_, err := vm.RunScript("test123.js", `
|
|
function loop() {
|
|
for (let i = 0; i < 50000; i++) {
|
|
const a = Math.pow(Math.Pi, Math.Pi);
|
|
}
|
|
}
|
|
loop();
|
|
sleep();
|
|
`)
|
|
if err != nil {
|
|
if _, ok := err.(*InterruptedError); !ok {
|
|
panic(err)
|
|
}
|
|
}
|
|
}()
|
|
time.Sleep(1 * time.Millisecond)
|
|
}
|
|
}()
|
|
|
|
time.Sleep(500 * time.Millisecond)
|
|
atomic.StoreInt32(&globalProfiler.enabled, 0)
|
|
pr := globalProfiler.p.stop()
|
|
|
|
if len(pr.Sample) == 0 {
|
|
t.Fatal("No samples were recorded")
|
|
}
|
|
}
|