github.com/elastic/gosigar@v0.14.3/sigar_darwin_test.go (about)

     1  package gosigar_test
     2  
     3  import (
     4  	"bufio"
     5  	"bytes"
     6  	"fmt"
     7  	"os/exec"
     8  	"os/user"
     9  	"strconv"
    10  	"strings"
    11  	"testing"
    12  
    13  	sigar "github.com/elastic/gosigar"
    14  	"github.com/stretchr/testify/assert"
    15  )
    16  
    17  var procinfo map[string]string
    18  
    19  func setUp(t testing.TB) {
    20  	out, err := exec.Command("/bin/ps", "-p1", "-c", "-opid,comm,stat,ppid,pgid,tty,pri,ni").Output()
    21  	if err != nil {
    22  		t.Fatal(err)
    23  	}
    24  	rdr := bufio.NewReader(bytes.NewReader(out))
    25  	_, err = rdr.ReadString('\n') // skip header
    26  	if err != nil {
    27  		t.Fatal(err)
    28  	}
    29  	data, err := rdr.ReadString('\n')
    30  	if err != nil {
    31  		t.Fatal(err)
    32  	}
    33  	procinfo = make(map[string]string, 8)
    34  	fields := strings.Fields(data)
    35  	procinfo["pid"] = fields[0]
    36  	procinfo["name"] = fields[1]
    37  	procinfo["stat"] = fields[2]
    38  	procinfo["ppid"] = fields[3]
    39  	procinfo["pgid"] = fields[4]
    40  	procinfo["tty"] = fields[5]
    41  	procinfo["prio"] = fields[6]
    42  	procinfo["nice"] = fields[7]
    43  
    44  }
    45  
    46  func tearDown(t testing.TB) {
    47  }
    48  
    49  /* ProcState.Get() call task_info, which on Mac OS X requires root
    50     or a signed executable. Skip the test if not running as root
    51     to accommodate automated tests, but let users test locally using
    52     `sudo -E go test`
    53  */
    54  
    55  func TestDarwinProcState(t *testing.T) {
    56  	setUp(t)
    57  	defer tearDown(t)
    58  
    59  	state := sigar.ProcState{}
    60  	usr, err := user.Current()
    61  	if err == nil && usr.Username == "root" {
    62  		if assert.NoError(t, state.Get(1)) {
    63  
    64  			ppid, _ := strconv.Atoi(procinfo["ppid"])
    65  			pgid, _ := strconv.Atoi(procinfo["pgid"])
    66  
    67  			assert.Equal(t, procinfo["name"], state.Name)
    68  			assert.Equal(t, ppid, state.Ppid)
    69  			assert.Equal(t, pgid, state.Pgid)
    70  			assert.Equal(t, 1, state.Pgid)
    71  			assert.Equal(t, 0, state.Ppid)
    72  		}
    73  	} else {
    74  		fmt.Println("Skipping ProcState test; run as root to test")
    75  	}
    76  }