Path: blob/main/components/common-go/cgroups/cgroups_test.go
2498 views
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.1// Licensed under the GNU Affero General Public License (AGPL).2// See License.AGPL.txt in the project root for license information.34package cgroups56import (7"math"8"os"9"path/filepath"10"testing"1112"github.com/stretchr/testify/assert"13)1415var cgroupPath = []string{"/kubepods", "burstable", "pods234sdf", "234as8df34"}1617func createHierarchy(t *testing.T, cpuEnabled bool) (string, string) {18testRoot := t.TempDir()19if err := os.WriteFile(filepath.Join(testRoot, "cgroup.controllers"), []byte(""), 0755); err != nil {20t.Fatal(err)21}2223if err := os.WriteFile(filepath.Join(testRoot, "cgroup.subtree_control"), []byte(""), 0755); err != nil {24t.Fatal(err)25}2627testCgroup := ""28for i, level := range cgroupPath {29testCgroup = filepath.Join(testCgroup, level)30fullPath := filepath.Join(testRoot, testCgroup)31if err := os.Mkdir(fullPath, 0o755); err != nil {32t.Fatal(err)33}3435ctrlFile, err := os.Create(filepath.Join(fullPath, "cgroup.controllers"))36if err != nil {37t.Fatal(err)38}39defer ctrlFile.Close()4041if cpuEnabled {42if _, err := ctrlFile.WriteString("cpu"); err != nil {43t.Fatal(err)44}45}4647subTreeFile, err := os.Create(filepath.Join(fullPath, "cgroup.subtree_control"))48if err != nil {49t.Fatal(err)50}51defer subTreeFile.Close()5253if cpuEnabled && i < len(cgroupPath)-1 {54if _, err := subTreeFile.WriteString("cpu"); err != nil {55t.Fatal(err)56}57}58}5960return testRoot, testCgroup61}6263func TestEnableController(t *testing.T) {64root, cgroup := createHierarchy(t, false)65if err := EnsureCpuControllerEnabled(root, cgroup); err != nil {66t.Fatal(err)67}6869levelPath := root70for _, level := range cgroupPath {71verifyCpuControllerToggled(t, levelPath, true)72levelPath = filepath.Join(levelPath, level)73}7475verifyCpuControllerToggled(t, levelPath, false)76}7778func verifyCpuControllerToggled(t *testing.T, path string, enabled bool) {79t.Helper()8081content, err := os.ReadFile(filepath.Join(path, "cgroup.subtree_control"))82if err != nil {83t.Fatal(err)84}8586if enabled && string(content) != "+cpu" {87t.Fatalf("%s should have enabled cpu controller", path)88} else if !enabled && string(content) == "+cpu" {89t.Fatalf("%s should not have enabled cpu controller", path)90}91}9293func TestReadSingleValue(t *testing.T) {94scenarios := []struct {95name string96content string97expected uint6498}{99{100name: "cgroup2 max value",101content: "max",102expected: math.MaxUint64,103},104{105name: "cgroup1 max value",106content: "-1",107expected: math.MaxUint64,108},109{110name: "valid value",111content: "100000",112expected: 100_000,113},114}115116for _, s := range scenarios {117t.Run(s.name, func(t *testing.T) {118f, err := os.CreateTemp("", "cgroup_test*")119if err != nil {120t.Fatal(err)121}122123if _, err := f.Write([]byte(s.content)); err != nil {124t.Fatal(err)125}126127v, err := ReadSingleValue(f.Name())128if err != nil {129t.Fatal(err)130}131132assert.Equal(t, s.expected, v)133})134}135}136137func TestReadPSI(t *testing.T) {138scenarios := []struct {139name string140content string141expected PSI142}{143{144name: "psi some",145content: "some avg10=61.00 avg60=64.28 avg300=29.94 total=149969752",146expected: PSI{147Some: 149969752,148Full: 0,149},150},151{152name: "psi full",153content: "full avg10=36.27 avg60=37.15 avg300=17.59 total=93027571",154expected: PSI{155Some: 0,156Full: 93027571,157},158},159{160name: "psi some and full",161content: "some avg10=61.00 avg60=64.28 avg300=29.94 total=149969752\nfull avg10=36.27 avg60=37.15 avg300=17.59 total=93027571",162expected: PSI{163Some: 149969752,164Full: 93027571,165},166},167}168169for _, s := range scenarios {170t.Run(s.name, func(t *testing.T) {171f, err := os.CreateTemp("", "cgroup_test*")172if err != nil {173t.Fatal(err)174}175defer os.Remove(f.Name())176177if _, err := f.Write([]byte(s.content)); err != nil {178t.Fatal(err)179}180181v, err := ReadPSIValue(f.Name())182if err != nil {183t.Fatal(err)184}185186assert.Equal(t, s.expected, v)187})188}189}190191192