github.com/opencontainers/runc@v1.2.0-rc.1.0.20240520010911-492dc558cdd6/libcontainer/cgroups/file_test.go (about)

     1  package cgroups
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"os"
     7  	"path/filepath"
     8  	"strconv"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/opencontainers/runc/internal/testutil"
    13  )
    14  
    15  func TestWriteCgroupFileHandlesInterrupt(t *testing.T) {
    16  	testutil.SkipOnCentOS(t, "Flaky (see #3418)", 7)
    17  
    18  	const (
    19  		memoryCgroupMount = "/sys/fs/cgroup/memory"
    20  		memoryLimit       = "memory.limit_in_bytes"
    21  	)
    22  	if _, err := os.Stat(memoryCgroupMount); err != nil {
    23  		// most probably cgroupv2
    24  		t.Skip(err)
    25  	}
    26  
    27  	cgroupName := fmt.Sprintf("test-eint-%d", time.Now().Nanosecond())
    28  	cgroupPath := filepath.Join(memoryCgroupMount, cgroupName)
    29  	if err := os.MkdirAll(cgroupPath, 0o755); err != nil {
    30  		t.Fatal(err)
    31  	}
    32  	defer os.RemoveAll(cgroupPath)
    33  
    34  	if _, err := os.Stat(filepath.Join(cgroupPath, memoryLimit)); err != nil {
    35  		// either cgroupv2, or memory controller is not available
    36  		t.Skip(err)
    37  	}
    38  
    39  	for i := 0; i < 100000; i++ {
    40  		limit := 1024*1024 + i
    41  		if err := WriteFile(cgroupPath, memoryLimit, strconv.Itoa(limit)); err != nil {
    42  			t.Fatalf("Failed to write %d on attempt %d: %+v", limit, i, err)
    43  		}
    44  	}
    45  }
    46  
    47  func TestOpenat2(t *testing.T) {
    48  	if !IsCgroup2UnifiedMode() {
    49  		// The reason is many test cases below test opening files from
    50  		// the top-level directory, where cgroup v1 has no files.
    51  		t.Skip("test requires cgroup v2")
    52  	}
    53  
    54  	// Make sure we test openat2, not its fallback.
    55  	openFallback = func(_ string, _ int, _ os.FileMode) (*os.File, error) {
    56  		return nil, errors.New("fallback")
    57  	}
    58  	defer func() { openFallback = openAndCheck }()
    59  
    60  	for _, tc := range []struct{ dir, file string }{
    61  		{"/sys/fs/cgroup", "cgroup.controllers"},
    62  		{"/sys/fs/cgroup", "/cgroup.controllers"},
    63  		{"/sys/fs/cgroup/", "cgroup.controllers"},
    64  		{"/sys/fs/cgroup/", "/cgroup.controllers"},
    65  		{"/", "/sys/fs/cgroup/cgroup.controllers"},
    66  		{"/", "sys/fs/cgroup/cgroup.controllers"},
    67  		{"/sys/fs/cgroup/cgroup.controllers", ""},
    68  	} {
    69  		fd, err := OpenFile(tc.dir, tc.file, os.O_RDONLY)
    70  		if err != nil {
    71  			t.Errorf("case %+v: %v", tc, err)
    72  		}
    73  		fd.Close()
    74  	}
    75  }