...
1
2
3
4
5 package starlark_test
6
7 import (
8 "bytes"
9 "fmt"
10 "io/ioutil"
11 "os"
12 "os/exec"
13 "strings"
14 "testing"
15
16 "go.starlark.net/starlark"
17 )
18
19
20
21 func TestProfile(t *testing.T) {
22 prof, err := ioutil.TempFile("", "profile_test")
23 if err != nil {
24 t.Fatal(err)
25 }
26 defer prof.Close()
27 defer os.Remove(prof.Name())
28 if err := starlark.StartProfile(prof); err != nil {
29 t.Fatal(err)
30 }
31
32 const src = `
33 def fibonacci(n):
34 x, y = 1, 1
35 for i in range(n):
36 x, y = y, x+y
37 return y
38
39 fibonacci(100000)
40 `
41
42 thread := new(starlark.Thread)
43 if _, err := starlark.ExecFile(thread, "foo.star", src, nil); err != nil {
44 _ = starlark.StopProfile()
45 t.Fatal(err)
46 }
47 if err := starlark.StopProfile(); err != nil {
48 t.Fatal(err)
49 }
50 prof.Sync()
51 cmd := exec.Command("go", "tool", "pprof", "-top", prof.Name())
52 cmd.Stderr = new(bytes.Buffer)
53 cmd.Stdout = new(bytes.Buffer)
54 if err := cmd.Run(); err != nil {
55 t.Fatalf("pprof failed: %v; output=<<%s>>", err, cmd.Stderr)
56 }
57
58
59
60
61
62
63
64
65
66
67
68
69 got := fmt.Sprint(cmd.Stdout)
70 for _, want := range []string{
71 "flat%",
72 "fibonacci",
73 "foo.star",
74 } {
75 if !strings.Contains(got, want) {
76 t.Errorf("output did not contain %q", want)
77 }
78 }
79 if t.Failed() {
80 t.Logf("stderr=%v", cmd.Stderr)
81 t.Logf("stdout=%v", cmd.Stdout)
82 }
83 }
84
View as plain text