|
|
|
package pprof
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
"fmt"
|
|
|
|
"math/rand"
|
|
|
|
"os"
|
|
|
|
"path/filepath"
|
|
|
|
"reflect"
|
|
|
|
"runtime/pprof"
|
|
|
|
"strings"
|
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestUnpackProfilesIntoMap(t *testing.T) {
|
|
|
|
tests := []struct {
|
|
|
|
input *Config
|
|
|
|
expMap map[string]Profile
|
|
|
|
expErr error
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
input: &Config{},
|
|
|
|
expMap: nil,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
input: &Config{
|
|
|
|
ProfileNames: []string{"cpu", "cpu"},
|
|
|
|
},
|
|
|
|
expMap: map[string]Profile{
|
|
|
|
"cpu": {
|
|
|
|
Name: "cpu",
|
|
|
|
Interval: 0,
|
|
|
|
Debug: 0,
|
|
|
|
ProfileRef: pprof.Lookup("cpu"),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
input: &Config{
|
|
|
|
ProfileNames: []string{"test"},
|
|
|
|
},
|
|
|
|
expMap: nil,
|
|
|
|
expErr: errors.New("pprof profile does not exist: test"),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
input: &Config{
|
|
|
|
ProfileNames: []string{"cpu", "heap"},
|
|
|
|
ProfileIntervals: []int{0, 60},
|
|
|
|
ProfileDebugValues: []int{1},
|
|
|
|
},
|
|
|
|
expMap: map[string]Profile{
|
|
|
|
"cpu": {
|
|
|
|
Name: "cpu",
|
|
|
|
Interval: 0,
|
|
|
|
Debug: 1,
|
|
|
|
ProfileRef: pprof.Lookup("cpu"),
|
|
|
|
},
|
|
|
|
"heap": {
|
|
|
|
Name: "heap",
|
|
|
|
Interval: 60,
|
|
|
|
Debug: 1,
|
|
|
|
ProfileRef: pprof.Lookup("heap"),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
for i, test := range tests {
|
|
|
|
actual, err := test.input.unpackProfilesIntoMap()
|
|
|
|
if assErr := assertError(err, test.expErr); assErr != nil {
|
|
|
|
t.Fatalf("Test %v: %v", i, assErr)
|
|
|
|
}
|
|
|
|
if !reflect.DeepEqual(actual, test.expMap) {
|
|
|
|
t.Errorf("Test %v: unexpected map\n\t%+v\n\t%+v", i, actual, test.expMap)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestStart(t *testing.T) {
|
|
|
|
input := &Config{
|
|
|
|
Enabled: true,
|
|
|
|
Folder: tempTestDir(),
|
|
|
|
ProfileNames: []string{"cpu"},
|
|
|
|
ProfileIntervals: []int{1},
|
|
|
|
}
|
|
|
|
defer os.RemoveAll(input.Folder)
|
|
|
|
s := NewService(*input)
|
|
|
|
err := s.Start()
|
|
|
|
if assErr := assertError(err, nil); assErr != nil {
|
|
|
|
t.Fatal(assErr)
|
|
|
|
}
|
|
|
|
time.Sleep(1 * time.Second)
|
|
|
|
}
|
|
|
|
|
|
|
|
func tempTestDir() string {
|
|
|
|
tempDir := os.TempDir()
|
|
|
|
testDir := filepath.Join(tempDir, fmt.Sprintf("pprof-service-test-%d-%d", os.Getpid(), rand.Int()))
|
|
|
|
os.RemoveAll(testDir)
|
|
|
|
return testDir
|
|
|
|
}
|
|
|
|
|
|
|
|
func assertError(gotErr, expErr error) error {
|
|
|
|
if (gotErr == nil) != (expErr == nil) {
|
|
|
|
return fmt.Errorf("error unexpected [%v] / [%v]", gotErr, expErr)
|
|
|
|
}
|
|
|
|
if gotErr == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
if !strings.Contains(gotErr.Error(), expErr.Error()) {
|
|
|
|
return fmt.Errorf("error unexpected [%v] / [%v]", gotErr, expErr)
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|