2014-12-30 22:09:05 +09:00
|
|
|
package process
|
2014-04-23 12:26:21 +09:00
|
|
|
|
|
|
|
import (
|
2014-04-25 16:38:23 +09:00
|
|
|
"os"
|
2014-04-24 01:07:15 +09:00
|
|
|
"runtime"
|
2015-03-06 11:02:59 +09:00
|
|
|
"strings"
|
2015-09-16 11:58:02 +09:00
|
|
|
"sync"
|
2014-04-23 12:26:21 +09:00
|
|
|
"testing"
|
2015-03-04 00:02:09 +09:00
|
|
|
"time"
|
2015-09-16 11:58:02 +09:00
|
|
|
|
|
|
|
"github.com/shirou/gopsutil/common"
|
2014-04-23 12:26:21 +09:00
|
|
|
)
|
|
|
|
|
2015-09-16 11:58:02 +09:00
|
|
|
var mu sync.Mutex
|
|
|
|
|
2014-08-15 20:05:26 +02:00
|
|
|
func testGetProcess() Process {
|
2015-03-06 10:05:58 +09:00
|
|
|
checkPid := os.Getpid() // process.test
|
2014-05-23 10:31:47 +09:00
|
|
|
ret, _ := NewProcess(int32(checkPid))
|
2014-05-01 18:27:43 +09:00
|
|
|
return *ret
|
|
|
|
}
|
|
|
|
|
2014-04-23 13:24:07 +09:00
|
|
|
func Test_Pids(t *testing.T) {
|
2014-05-23 10:31:47 +09:00
|
|
|
ret, err := Pids()
|
2014-04-23 12:26:21 +09:00
|
|
|
if err != nil {
|
|
|
|
t.Errorf("error %v", err)
|
|
|
|
}
|
2014-04-23 13:24:07 +09:00
|
|
|
if len(ret) == 0 {
|
|
|
|
t.Errorf("could not get pids %v", ret)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-09-16 11:58:02 +09:00
|
|
|
func Test_Pids_Fail(t *testing.T) {
|
2015-09-16 12:10:39 +09:00
|
|
|
if runtime.GOOS != "darwin" {
|
|
|
|
t.Skip("darwin only")
|
|
|
|
}
|
|
|
|
|
2015-09-16 11:58:02 +09:00
|
|
|
mu.Lock()
|
|
|
|
defer mu.Unlock()
|
|
|
|
|
2015-09-16 13:06:07 +09:00
|
|
|
invoke = common.FakeInvoke{Suffix: "fail"}
|
2015-09-16 11:58:02 +09:00
|
|
|
ret, err := Pids()
|
|
|
|
invoke = common.Invoke{}
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("error %v", err)
|
|
|
|
}
|
|
|
|
if len(ret) != 9 {
|
|
|
|
t.Errorf("wrong getted pid nums: %v/%d", ret, len(ret))
|
|
|
|
}
|
|
|
|
}
|
2014-04-23 13:24:07 +09:00
|
|
|
func Test_Pid_exists(t *testing.T) {
|
2015-03-06 10:05:58 +09:00
|
|
|
checkPid := os.Getpid()
|
2014-04-24 01:07:15 +09:00
|
|
|
|
2014-05-23 10:31:47 +09:00
|
|
|
ret, err := PidExists(int32(checkPid))
|
2014-04-23 13:24:07 +09:00
|
|
|
if err != nil {
|
|
|
|
t.Errorf("error %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if ret == false {
|
2015-03-11 11:38:02 +09:00
|
|
|
t.Errorf("could not get process exists: %v", ret)
|
2014-04-23 13:24:07 +09:00
|
|
|
}
|
2014-04-23 17:57:47 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
func Test_NewProcess(t *testing.T) {
|
2015-03-06 10:05:58 +09:00
|
|
|
checkPid := os.Getpid()
|
2015-03-07 22:06:52 +09:00
|
|
|
|
2014-05-23 10:31:47 +09:00
|
|
|
ret, err := NewProcess(int32(checkPid))
|
2014-04-23 17:57:47 +09:00
|
|
|
if err != nil {
|
|
|
|
t.Errorf("error %v", err)
|
|
|
|
}
|
2014-05-23 10:31:47 +09:00
|
|
|
empty := &Process{}
|
2014-05-12 11:51:08 +09:00
|
|
|
if runtime.GOOS != "windows" { // Windows pid is 0
|
|
|
|
if empty == ret {
|
|
|
|
t.Errorf("error %v", ret)
|
|
|
|
}
|
|
|
|
}
|
2014-04-23 13:24:07 +09:00
|
|
|
|
2014-04-23 12:26:21 +09:00
|
|
|
}
|
2014-04-25 16:29:15 +09:00
|
|
|
|
|
|
|
func Test_Process_memory_maps(t *testing.T) {
|
2014-04-30 16:16:07 +09:00
|
|
|
checkPid := os.Getpid()
|
2015-03-07 22:06:52 +09:00
|
|
|
|
2014-05-23 10:31:47 +09:00
|
|
|
ret, err := NewProcess(int32(checkPid))
|
2014-04-25 16:29:15 +09:00
|
|
|
|
2014-04-30 15:32:05 +09:00
|
|
|
mmaps, err := ret.MemoryMaps(false)
|
2014-04-25 16:29:15 +09:00
|
|
|
if err != nil {
|
|
|
|
t.Errorf("memory map get error %v", err)
|
|
|
|
}
|
2014-05-23 10:31:47 +09:00
|
|
|
empty := MemoryMapsStat{}
|
2014-04-25 16:29:15 +09:00
|
|
|
for _, m := range *mmaps {
|
2014-05-12 11:51:08 +09:00
|
|
|
if m == empty {
|
|
|
|
t.Errorf("memory map get error %v", m)
|
|
|
|
}
|
2014-04-25 16:29:15 +09:00
|
|
|
}
|
2015-03-06 11:02:59 +09:00
|
|
|
}
|
|
|
|
func Test_Process_MemoryInfo(t *testing.T) {
|
|
|
|
p := testGetProcess()
|
|
|
|
|
|
|
|
v, err := p.MemoryInfo()
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("geting ppid error %v", err)
|
|
|
|
}
|
|
|
|
empty := MemoryInfoStat{}
|
2015-03-07 22:06:52 +09:00
|
|
|
if v == nil || *v == empty {
|
2015-03-06 11:02:59 +09:00
|
|
|
t.Errorf("could not get memory info %v", v)
|
|
|
|
}
|
|
|
|
}
|
2014-04-25 16:29:15 +09:00
|
|
|
|
2015-03-06 11:02:59 +09:00
|
|
|
func Test_Process_CmdLine(t *testing.T) {
|
|
|
|
p := testGetProcess()
|
|
|
|
|
|
|
|
v, err := p.Cmdline()
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("geting ppid error %v", err)
|
|
|
|
}
|
2015-03-20 23:56:46 +09:00
|
|
|
if !strings.Contains(v, "process.test") {
|
2015-03-06 11:02:59 +09:00
|
|
|
t.Errorf("invalid cmd line %v", v)
|
|
|
|
}
|
2014-04-25 16:29:15 +09:00
|
|
|
}
|
2014-04-26 15:45:32 +09:00
|
|
|
|
|
|
|
func Test_Process_Ppid(t *testing.T) {
|
2014-08-15 20:05:26 +02:00
|
|
|
p := testGetProcess()
|
2014-04-26 15:45:32 +09:00
|
|
|
|
2014-05-01 18:27:43 +09:00
|
|
|
v, err := p.Ppid()
|
2014-04-26 15:45:32 +09:00
|
|
|
if err != nil {
|
2014-04-28 22:34:08 +09:00
|
|
|
t.Errorf("geting ppid error %v", err)
|
2014-04-26 15:45:32 +09:00
|
|
|
}
|
|
|
|
if v == 0 {
|
2014-04-28 22:34:08 +09:00
|
|
|
t.Errorf("return value is 0 %v", v)
|
2014-04-26 15:45:32 +09:00
|
|
|
}
|
|
|
|
}
|
2014-05-01 18:27:43 +09:00
|
|
|
|
2015-03-06 11:02:59 +09:00
|
|
|
func Test_Process_Status(t *testing.T) {
|
|
|
|
p := testGetProcess()
|
|
|
|
|
|
|
|
v, err := p.Status()
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("geting ppid error %v", err)
|
|
|
|
}
|
2015-03-06 12:55:41 +09:00
|
|
|
if !strings.HasPrefix(v, "S") && v != "running" && v != "sleeping" {
|
2015-03-06 11:02:59 +09:00
|
|
|
t.Errorf("could not get state %v", v)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func Test_Process_Terminal(t *testing.T) {
|
|
|
|
p := testGetProcess()
|
|
|
|
|
2015-03-06 12:57:07 +09:00
|
|
|
_, err := p.Terminal()
|
2015-03-06 11:02:59 +09:00
|
|
|
if err != nil {
|
|
|
|
t.Errorf("geting terminal error %v", err)
|
|
|
|
}
|
2015-03-06 12:57:07 +09:00
|
|
|
|
2015-03-06 12:55:41 +09:00
|
|
|
/*
|
|
|
|
if v == "" {
|
|
|
|
t.Errorf("could not get terminal %v", v)
|
|
|
|
}
|
|
|
|
*/
|
2015-03-06 11:02:59 +09:00
|
|
|
}
|
|
|
|
|
2014-05-01 18:27:43 +09:00
|
|
|
func Test_Process_IOCounters(t *testing.T) {
|
2014-08-15 20:05:26 +02:00
|
|
|
p := testGetProcess()
|
2014-05-01 18:27:43 +09:00
|
|
|
|
|
|
|
v, err := p.IOCounters()
|
|
|
|
if err != nil {
|
2015-03-06 11:02:59 +09:00
|
|
|
t.Errorf("geting iocounter error %v", err)
|
2014-05-01 18:46:40 +09:00
|
|
|
return
|
2014-05-01 18:27:43 +09:00
|
|
|
}
|
2014-05-23 10:31:47 +09:00
|
|
|
empty := &IOCountersStat{}
|
2014-05-12 11:51:08 +09:00
|
|
|
if v == empty {
|
|
|
|
t.Errorf("error %v", v)
|
2014-05-01 18:27:43 +09:00
|
|
|
}
|
|
|
|
}
|
2014-05-01 19:10:15 +09:00
|
|
|
|
|
|
|
func Test_Process_NumCtx(t *testing.T) {
|
2014-08-15 20:05:26 +02:00
|
|
|
p := testGetProcess()
|
2014-05-01 19:10:15 +09:00
|
|
|
|
|
|
|
_, err := p.NumCtxSwitches()
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("geting numctx error %v", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
2014-12-30 22:09:05 +09:00
|
|
|
|
|
|
|
func Test_Process_Nice(t *testing.T) {
|
|
|
|
p := testGetProcess()
|
|
|
|
|
2015-03-06 10:05:58 +09:00
|
|
|
n, err := p.Nice()
|
2014-12-30 22:09:05 +09:00
|
|
|
if err != nil {
|
|
|
|
t.Errorf("geting nice error %v", err)
|
2015-03-06 10:05:58 +09:00
|
|
|
}
|
2015-03-20 23:56:46 +09:00
|
|
|
if n != 0 && n != 20 && n != 8 {
|
2015-03-06 10:05:58 +09:00
|
|
|
t.Errorf("invalid nice: %d", n)
|
|
|
|
}
|
|
|
|
}
|
2015-03-20 23:56:46 +09:00
|
|
|
func Test_Process_NumThread(t *testing.T) {
|
|
|
|
p := testGetProcess()
|
|
|
|
|
|
|
|
n, err := p.NumThreads()
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("geting NumThread error %v", err)
|
|
|
|
}
|
|
|
|
if n < 0 {
|
|
|
|
t.Errorf("invalid NumThread: %d", n)
|
|
|
|
}
|
|
|
|
}
|
2015-03-06 10:05:58 +09:00
|
|
|
|
|
|
|
func Test_Process_Name(t *testing.T) {
|
|
|
|
p := testGetProcess()
|
|
|
|
|
|
|
|
n, err := p.Name()
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("geting name error %v", err)
|
|
|
|
}
|
2015-03-20 23:56:46 +09:00
|
|
|
if !strings.Contains(n, "process.test") {
|
|
|
|
t.Errorf("invalid Exe %s", n)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
func Test_Process_Exe(t *testing.T) {
|
|
|
|
p := testGetProcess()
|
|
|
|
|
|
|
|
n, err := p.Exe()
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("geting Exe error %v", err)
|
|
|
|
}
|
|
|
|
if !strings.Contains(n, "process.test") {
|
|
|
|
t.Errorf("invalid Exe %s", n)
|
2014-12-30 22:09:05 +09:00
|
|
|
}
|
|
|
|
}
|
2015-03-04 00:02:09 +09:00
|
|
|
|
|
|
|
func Test_Process_CpuPercent(t *testing.T) {
|
|
|
|
p := testGetProcess()
|
|
|
|
percent, err := p.CPUPercent(0)
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("error %v", err)
|
|
|
|
}
|
|
|
|
duration := time.Duration(1000) * time.Microsecond
|
|
|
|
time.Sleep(duration)
|
|
|
|
percent, err = p.CPUPercent(0)
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("error %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
numcpu := runtime.NumCPU()
|
2015-03-06 13:12:54 +09:00
|
|
|
// if percent < 0.0 || percent > 100.0*float64(numcpu) { // TODO
|
|
|
|
if percent < 0.0 {
|
2015-03-06 12:55:41 +09:00
|
|
|
t.Fatalf("CPUPercent value is invalid: %f, %d", percent, numcpu)
|
2015-03-04 00:02:09 +09:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func Test_Process_CpuPercentLoop(t *testing.T) {
|
|
|
|
p := testGetProcess()
|
|
|
|
numcpu := runtime.NumCPU()
|
|
|
|
|
|
|
|
for i := 0; i < 2; i++ {
|
|
|
|
duration := time.Duration(100) * time.Microsecond
|
|
|
|
percent, err := p.CPUPercent(duration)
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("error %v", err)
|
|
|
|
}
|
2015-03-06 13:12:54 +09:00
|
|
|
// if percent < 0.0 || percent > 100.0*float64(numcpu) { // TODO
|
|
|
|
if percent < 0.0 {
|
2015-03-06 12:55:41 +09:00
|
|
|
t.Fatalf("CPUPercent value is invalid: %f, %d", percent, numcpu)
|
2015-03-04 00:02:09 +09:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-06-19 12:04:33 +09:00
|
|
|
|
|
|
|
func Test_Process_CreateTime(t *testing.T) {
|
|
|
|
p := testGetProcess()
|
|
|
|
|
|
|
|
c, err := p.CreateTime()
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("error %v", err)
|
|
|
|
}
|
|
|
|
if c < 1420000000 {
|
|
|
|
t.Errorf("process created time is wrong.")
|
|
|
|
}
|
|
|
|
}
|
2015-09-16 13:06:07 +09:00
|
|
|
|
|
|
|
func Test_Parent(t *testing.T) {
|
|
|
|
p := testGetProcess()
|
|
|
|
|
|
|
|
c, err := p.Parent()
|
|
|
|
if err != nil {
|
2015-09-16 16:12:41 +09:00
|
|
|
t.Fatalf("error %v", err)
|
2015-09-16 13:06:07 +09:00
|
|
|
}
|
|
|
|
if c == nil {
|
2015-09-16 16:12:41 +09:00
|
|
|
t.Fatalf("could not get parent")
|
2015-09-16 13:06:07 +09:00
|
|
|
}
|
|
|
|
if c.Pid == 0 {
|
2015-09-16 16:12:41 +09:00
|
|
|
t.Fatalf("wrong parent pid")
|
2015-09-16 13:06:07 +09:00
|
|
|
}
|
|
|
|
}
|