-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathutil.go
129 lines (114 loc) · 3.05 KB
/
util.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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package test
import (
"fmt"
"net/http"
"os"
"os/exec"
"path"
"testing"
"github.com/containerd/continuity/fs/fstest"
"github.com/google/pprof/profile"
"github.com/moby/buildkit-bench/util/testutil"
"github.com/stretchr/testify/require"
)
func tmpdir(tb testing.TB, appliers ...fstest.Applier) string {
tb.Helper()
tmpdir := tb.TempDir()
err := fstest.Apply(appliers...).Apply(tmpdir)
require.NoError(tb, err)
return tmpdir
}
type cmdOpt func(*exec.Cmd)
func withEnv(env ...string) cmdOpt {
return func(cmd *exec.Cmd) {
cmd.Env = append(cmd.Env, env...)
}
}
func withArgs(args ...string) cmdOpt {
return func(cmd *exec.Cmd) {
cmd.Args = append(cmd.Args, args...)
}
}
func withDir(dir string) cmdOpt {
return func(cmd *exec.Cmd) {
cmd.Dir = dir
}
}
func buildxCmd(sb testutil.Sandbox, opts ...cmdOpt) *exec.Cmd {
cmd := exec.Command(sb.BuildxBin())
cmd.Env = append([]string{}, os.Environ()...)
for _, opt := range opts {
opt(cmd)
}
if buildxConfigDir := sb.BuildxConfigDir(); buildxConfigDir != "" {
cmd.Env = append(cmd.Env, "BUILDX_CONFIG="+buildxConfigDir)
}
if builderName := sb.BuilderName(); builderName != "" {
cmd.Env = append(cmd.Env, "BUILDX_BUILDER="+builderName)
}
return cmd
}
func buildxBuildCmd(sb testutil.Sandbox, opts ...cmdOpt) (string, error) {
opts = append([]cmdOpt{withArgs("build")}, opts...)
cmd := buildxCmd(sb, opts...)
out, err := cmd.CombinedOutput()
return string(out), err
}
func buildctlCmd(sb testutil.Sandbox, opts ...cmdOpt) *exec.Cmd {
cmd := exec.Command(path.Join(sb.BuildKitBinsDir(), sb.Name(), "buildctl"))
cmd.Args = append(cmd.Args, "--debug")
if buildkitAddr := sb.Address(); buildkitAddr != "" {
cmd.Args = append(cmd.Args, "--addr", buildkitAddr)
}
cmd.Env = append([]string{}, os.Environ()...)
for _, opt := range opts {
opt(cmd)
}
return cmd
}
func buildctlBuildCmd(sb testutil.Sandbox, opts ...cmdOpt) (string, error) {
opts = append([]cmdOpt{withArgs("build", "--frontend=dockerfile.v0")}, opts...)
cmd := buildctlCmd(sb, opts...)
out, err := cmd.CombinedOutput()
return string(out), err
}
func reportBuildkitdAlloc(b *testing.B, sb testutil.Sandbox, cb func()) {
beforeAlloc, errb := buildkitdAlloc(sb)
cb()
afterAlloc, erra := buildkitdAlloc(sb)
testutil.ReportAlloc(b, afterAlloc-beforeAlloc)
require.NoError(b, errb)
require.NoError(b, erra)
}
func buildkitdAlloc(sb testutil.Sandbox) (int64, error) {
client := &http.Client{}
resp, err := client.Get(fmt.Sprintf("http://%s/debug/pprof/heap?gc=1", sb.DebugAddress()))
if err != nil {
return 0, err
}
defer resp.Body.Close()
p, err := profile.Parse(resp.Body)
if err != nil {
return 0, err
}
return func(prof *profile.Profile, value func(v []int64) int64) int64 {
var total, diff int64
for _, sample := range prof.Sample {
var v int64
v = value(sample.Value)
if v < 0 {
v = -v
}
total += v
if sample.DiffBaseSample() {
diff += v
}
}
if diff > 0 {
total = diff
}
return total
}(p, func(v []int64) int64 {
return v[1] // sample index of alloc_space in heap profiles
}), nil
}