go-sandbox/container/benchmark_linux_test.go
2021-06-05 16:16:05 -07:00

140 lines
2.5 KiB
Go

package container
import (
"context"
"errors"
"os"
"runtime"
"syscall"
"testing"
"github.com/criyle/go-sandbox/runner"
)
func init() {
Init()
}
func BenchmarkContainer(b *testing.B) {
tmpDir, err := os.MkdirTemp("", "")
if err != nil {
b.Error(err)
}
builder := &Builder{
Root: tmpDir,
Stderr: os.Stderr,
}
n := runtime.GOMAXPROCS(0)
ch := make(chan Environment, n)
for i := 0; i < n; i++ {
m, err := builder.Build()
if err != nil {
b.Error(err)
}
b.Cleanup(func() {
m.Destroy()
})
ch <- m
}
b.ResetTimer()
b.RunParallel(func(pb *testing.PB) {
m := <-ch
for pb.Next() {
r := m.Execve(context.TODO(), ExecveParam{
Args: []string{"/bin/true"},
Env: []string{"PATH=/bin"},
})
if r.Status != runner.StatusNormal {
b.Error(r.Status, r.Error)
}
}
})
}
func TestContainerSuccess(t *testing.T) {
t.Parallel()
m := getEnv(t, nil)
r := m.Execve(context.TODO(), ExecveParam{
Args: []string{"/bin/true"},
Env: []string{"PATH=/bin"},
})
if r.Status != runner.StatusNormal {
t.Fatal(r.Status, r.Error, r)
}
}
type credgen struct{}
func (c credgen) Get() syscall.Credential {
return syscall.Credential{
Uid: 10000,
Gid: 10000,
}
}
func TestContainerSetCred(t *testing.T) {
t.Parallel()
if os.Getpid() != 1 {
t.Skip("root required for this test")
}
m := getEnv(t, credgen{})
r := m.Execve(context.TODO(), ExecveParam{
Args: []string{"/bin/true"},
Env: []string{"PATH=/bin"},
})
if r.Status != runner.StatusNormal {
t.Fatal(r.Status, r.Error)
}
}
func TestContainerNotExists(t *testing.T) {
t.Parallel()
m := getEnv(t, nil)
r := m.Execve(context.TODO(), ExecveParam{
Args: []string{"not_exists"},
Env: []string{"PATH=/bin"},
})
if r.Status != runner.StatusRunnerError {
t.Fatal(r.Status, r.Error)
}
}
func TestContainerSyncFuncFail(t *testing.T) {
t.Parallel()
m := getEnv(t, nil)
err := errors.New("test error")
r := m.Execve(context.TODO(), ExecveParam{
Args: []string{"/bin/true"},
Env: []string{"PATH=/bin"},
SyncFunc: func(pid int) error {
return err
},
})
if r.Status != runner.StatusRunnerError {
t.Fatal(r.Status, r.Error)
}
}
func getEnv(t *testing.T, credGen CredGenerator) Environment {
tmpDir, err := os.MkdirTemp("", "")
if err != nil {
t.Fatal(err)
}
t.Cleanup(func() {
os.Remove(tmpDir)
})
builder := &Builder{
Root: tmpDir,
CredGenerator: credGen,
Stderr: os.Stderr,
}
m, err := builder.Build()
if err != nil {
t.Fatal(err)
}
t.Cleanup(func() {
m.Destroy()
})
return m
}