...
1 package cgroups
2
3 import (
4 "errors"
5 "fmt"
6 "os"
7 "path/filepath"
8 "strconv"
9 "testing"
10 "time"
11 )
12
13 func TestWriteCgroupFileHandlesInterrupt(t *testing.T) {
14 const (
15 memoryCgroupMount = "/sys/fs/cgroup/memory"
16 memoryLimit = "memory.limit_in_bytes"
17 )
18 if _, err := os.Stat(memoryCgroupMount); err != nil {
19
20 t.Skip(err)
21 }
22
23 cgroupName := fmt.Sprintf("test-eint-%d", time.Now().Nanosecond())
24 cgroupPath := filepath.Join(memoryCgroupMount, cgroupName)
25 if err := os.MkdirAll(cgroupPath, 0o755); err != nil {
26 t.Fatal(err)
27 }
28 defer os.RemoveAll(cgroupPath)
29
30 if _, err := os.Stat(filepath.Join(cgroupPath, memoryLimit)); err != nil {
31
32 t.Skip(err)
33 }
34
35 for i := 0; i < 100000; i++ {
36 limit := 1024*1024 + i
37 if err := WriteFile(cgroupPath, memoryLimit, strconv.Itoa(limit)); err != nil {
38 t.Fatalf("Failed to write %d on attempt %d: %+v", limit, i, err)
39 }
40 }
41 }
42
43 func TestOpenat2(t *testing.T) {
44 if !IsCgroup2UnifiedMode() {
45
46
47 t.Skip("test requires cgroup v2")
48 }
49
50
51 openFallback = func(_ string, _ int, _ os.FileMode) (*os.File, error) {
52 return nil, errors.New("fallback")
53 }
54 defer func() { openFallback = openAndCheck }()
55
56 for _, tc := range []struct{ dir, file string }{
57 {"/sys/fs/cgroup", "cgroup.controllers"},
58 {"/sys/fs/cgroup", "/cgroup.controllers"},
59 {"/sys/fs/cgroup/", "cgroup.controllers"},
60 {"/sys/fs/cgroup/", "/cgroup.controllers"},
61 {"/", "/sys/fs/cgroup/cgroup.controllers"},
62 {"/", "sys/fs/cgroup/cgroup.controllers"},
63 {"/sys/fs/cgroup/cgroup.controllers", ""},
64 } {
65 fd, err := OpenFile(tc.dir, tc.file, os.O_RDONLY)
66 if err != nil {
67 t.Errorf("case %+v: %v", tc, err)
68 }
69 fd.Close()
70 }
71 }
72
View as plain text