talos/internal/pkg/miniprocfs/processes_test.go
Andrey Smirnov 96aa9638f7
chore: rename talos-systems/talos to siderolabs/talos
There's a cyclic dependency on siderolink library which imports talos
machinery back. We will fix that after we get talos pushed under a new
name.

Signed-off-by: Andrey Smirnov <andrey.smirnov@talos-systems.com>
2022-11-03 16:50:32 +04:00

160 lines
3.2 KiB
Go

// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
package miniprocfs_test
import (
"strings"
"testing"
"github.com/prometheus/procfs"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/siderolabs/talos/internal/pkg/miniprocfs"
"github.com/siderolabs/talos/pkg/machinery/api/machine"
)
func TestLive(t *testing.T) {
processes, err := miniprocfs.NewProcesses()
require.NoError(t, err)
count := 0
for {
proc, err := processes.Next()
require.NoError(t, err)
if proc == nil {
break
}
count++
}
assert.Greater(t, count, 0)
assert.NoError(t, processes.Close())
}
func TestMock(t *testing.T) {
processes, err := miniprocfs.NewProcessesWithPath("testdata/")
require.NoError(t, err)
gold, err := procfs.NewFS("testdata/")
require.NoError(t, err)
for {
proc, err := processes.Next()
require.NoError(t, err)
if proc == nil {
break
}
goldInfo, err := gold.Proc(int(proc.Pid))
require.NoError(t, err)
goldExecutable, err := goldInfo.Executable()
require.NoError(t, err)
assert.Equal(t, goldExecutable, proc.Executable)
goldCommand, err := goldInfo.Comm()
require.NoError(t, err)
assert.Equal(t, goldCommand, proc.Command)
goldCmdline, err := goldInfo.CmdLine()
require.NoError(t, err)
assert.Equal(t, strings.Join(goldCmdline, " "), proc.Args)
goldStat, err := goldInfo.Stat()
require.NoError(t, err)
assert.EqualValues(t, goldStat.PPID, proc.Ppid)
assert.EqualValues(t, goldStat.NumThreads, proc.Threads)
assert.EqualValues(t, goldStat.CPUTime(), proc.CpuTime)
assert.EqualValues(t, goldStat.VirtualMemory(), proc.VirtualMemory)
assert.EqualValues(t, goldStat.ResidentMemory(), proc.ResidentMemory)
}
assert.NoError(t, processes.Close())
}
func BenchmarkPrometheusProcfs(b *testing.B) {
b.ReportAllocs()
for i := 0; i < b.N; i++ {
resp := []*machine.ProcessInfo{}
procs, err := procfs.AllProcs()
require.NoError(b, err)
for _, proc := range procs {
executable, err := proc.Executable()
if err != nil {
continue
}
command, err := proc.Comm()
if err != nil {
continue
}
args, err := proc.CmdLine()
if err != nil {
continue
}
stats, err := proc.Stat()
if err != nil {
continue
}
resp = append(resp, &machine.ProcessInfo{
Pid: int32(proc.PID),
Ppid: int32(stats.PPID),
State: stats.State,
Threads: int32(stats.NumThreads),
CpuTime: stats.CPUTime(),
VirtualMemory: uint64(stats.VirtualMemory()),
ResidentMemory: uint64(stats.ResidentMemory()),
Command: command,
Executable: executable,
Args: strings.Join(args, " "),
})
}
_ = resp
}
}
func BenchmarkProcesses(b *testing.B) {
b.ReportAllocs()
for i := 0; i < b.N; i++ {
resp := []*machine.ProcessInfo{}
processes, err := miniprocfs.NewProcesses()
require.NoError(b, err)
for {
proc, err := processes.Next()
require.NoError(b, err)
if proc == nil {
break
}
resp = append(resp, proc)
}
_ = resp
assert.NoError(b, processes.Close())
}
}