File: cgroupcontrol_test.go

package info (click to toggle)
golang-github-intel-goresctrl 0.3.0-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 2,064 kB
  • sloc: makefile: 19; sh: 15
file content (104 lines) | stat: -rw-r--r-- 2,963 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package cgroups

import (
	"io"
	"syscall"
	"testing"

	"github.com/intel/goresctrl/pkg/testutils"
)

var cpuacctMyGroupTasks string = ""
var testfiles fsiIface = NewFsiMock(map[string]mockFile{
	"/sys/fs/cgroup/blkio/kubepods/tasks": {
		data: []byte("1\n23\n4567890\n"),
	},
	"/sys/fs/cgroup/cpu/open/permission/denied/cgroup.procs": {
		// simulate open permission denied
		open: func(string) (fileIface, error) {
			return nil, syscall.EACCES
		},
	},
	"/sys/fs/cgroup/cpuacct/store/all/writes/tasks": {
		// everything that is written can be read
		// (no overwrite / truncate)
		write: func(b []byte) (int, error) {
			cpuacctMyGroupTasks = cpuacctMyGroupTasks + string(b) + "\n"
			return len(b), nil
		},
		read: func(b []byte) (int, error) {
			if len(cpuacctMyGroupTasks) == 0 {
				return 0, io.EOF
			}
			bytes := len(cpuacctMyGroupTasks)
			copy(b, []byte(cpuacctMyGroupTasks))
			cpuacctMyGroupTasks = ""
			return bytes, nil
		},
	},
	"/sys/fs/cgroup/cpuset/read/io/error/tasks": {
		// every read causes I/O error
		read: func(b []byte) (int, error) {
			return 0, syscall.EIO
		},
	},
	"/sys/fs/cgroup/devices/write/io/error/cgroup.procs": {
		// every write causes I/O error
		write: func(b []byte) (int, error) {
			return 0, syscall.EIO
		},
	},
})

func TestGetTasks(t *testing.T) {
	fsi = testfiles
	tasks, err := Blkio.Group("kubepods").GetTasks()
	testutils.VerifyNoError(t, err)
	testutils.VerifyStringSlices(t, []string{"1", "23", "4567890"}, tasks)
}

func TestGetProcesses(t *testing.T) {
	fsi = testfiles
	_, err := Cpu.Group("open/permission/denied").GetProcesses()
	testutils.VerifyError(t, err, 1, []string{"permission denied"})
}

func TestAddTasks(t *testing.T) {
	fsi = testfiles
	if err := Cpuacct.Group("store/all/writes").AddTasks("0", "987654321"); !testutils.VerifyNoError(t, err) {
		return
	}
	if err := Cpuacct.Group("store/all/writes").AddTasks(); !testutils.VerifyNoError(t, err) {
		return
	}
	if err := Cpuacct.Group("store/all/writes").AddTasks("12"); !testutils.VerifyNoError(t, err) {
		return
	}
	tasks, err := Cpuacct.Group("store/all/writes").GetTasks()
	testutils.VerifyNoError(t, err)
	testutils.VerifyStringSlices(t, []string{"0", "987654321", "12"}, tasks)
}

func TestAddProcesses(t *testing.T) {
	fsi = testfiles
	err := Devices.Group("write/io/error").AddProcesses("1")
	testutils.VerifyError(t, err, 1, []string{"input/output error"})
	err = Freezer.Group("file/not/found").AddProcesses("1")
	testutils.VerifyError(t, err, 1, []string{"file not found"})
}

func TestAsGroup(t *testing.T) {
	memGroupIn := Memory.Group("my/memory")
	memGroupOut := AsGroup(string(memGroupIn))
	testutils.VerifyStrings(t, string(memGroupIn), string(memGroupOut))
}

func TestGroupToController(t *testing.T) {
	c := Hugetlb.Group("my/group").Controller()
	testutils.VerifyStrings(t, "hugetlb", c.String())
}

func TestRelPath(t *testing.T) {
	relPath := NetCls.RelPath()
	testutils.VerifyStrings(t, "net_cls", relPath)
}