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 }