1 package fs2
2
3 import (
4 "os"
5 "path/filepath"
6 "reflect"
7 "sort"
8 "testing"
9
10 "github.com/opencontainers/runc/libcontainer/cgroups"
11 )
12
13 const exampleIoStatData = `254:1 rbytes=6901432320 wbytes=14245535744 rios=263278 wios=248603 dbytes=0 dios=0
14 254:0 rbytes=2702336 wbytes=0 rios=97 wios=0 dbytes=0 dios=0
15 259:0 rbytes=6911345664 wbytes=14245536256 rios=264538 wios=244914 dbytes=530485248 dios=2`
16
17 var exampleIoStatsParsed = cgroups.BlkioStats{
18 IoServiceBytesRecursive: []cgroups.BlkioStatEntry{
19 {Major: 254, Minor: 1, Value: 6901432320, Op: "Read"},
20 {Major: 254, Minor: 1, Value: 14245535744, Op: "Write"},
21 {Major: 254, Minor: 0, Value: 2702336, Op: "Read"},
22 {Major: 254, Minor: 0, Value: 0, Op: "Write"},
23 {Major: 259, Minor: 0, Value: 6911345664, Op: "Read"},
24 {Major: 259, Minor: 0, Value: 14245536256, Op: "Write"},
25 },
26 IoServicedRecursive: []cgroups.BlkioStatEntry{
27 {Major: 254, Minor: 1, Value: 263278, Op: "Read"},
28 {Major: 254, Minor: 1, Value: 248603, Op: "Write"},
29 {Major: 254, Minor: 0, Value: 97, Op: "Read"},
30 {Major: 254, Minor: 0, Value: 0, Op: "Write"},
31 {Major: 259, Minor: 0, Value: 264538, Op: "Read"},
32 {Major: 259, Minor: 0, Value: 244914, Op: "Write"},
33 },
34 }
35
36 func lessBlkioStatEntry(a, b cgroups.BlkioStatEntry) bool {
37 if a.Major != b.Major {
38 return a.Major < b.Major
39 }
40 if a.Minor != b.Minor {
41 return a.Minor < b.Minor
42 }
43 if a.Op != b.Op {
44 return a.Op < b.Op
45 }
46 return a.Value < b.Value
47 }
48
49 func sortBlkioStats(stats *cgroups.BlkioStats) {
50 for _, table := range []*[]cgroups.BlkioStatEntry{
51 &stats.IoServicedRecursive,
52 &stats.IoServiceBytesRecursive,
53 } {
54 sort.SliceStable(*table, func(i, j int) bool { return lessBlkioStatEntry((*table)[i], (*table)[j]) })
55 }
56 }
57
58 func TestStatIo(t *testing.T) {
59
60 cgroups.TestMode = true
61
62 fakeCgroupDir := t.TempDir()
63 statPath := filepath.Join(fakeCgroupDir, "io.stat")
64
65 if err := os.WriteFile(statPath, []byte(exampleIoStatData), 0o644); err != nil {
66 t.Fatal(err)
67 }
68
69 var gotStats cgroups.Stats
70 if err := statIo(fakeCgroupDir, &gotStats); err != nil {
71 t.Error(err)
72 }
73
74
75 sortBlkioStats(&gotStats.BlkioStats)
76 sortBlkioStats(&exampleIoStatsParsed)
77
78 if !reflect.DeepEqual(gotStats.BlkioStats, exampleIoStatsParsed) {
79 t.Errorf("parsed cgroupv2 io.stat doesn't match expected result: \ngot %#v\nexpected %#v\n", gotStats.BlkioStats, exampleIoStatsParsed)
80 }
81 }
82
View as plain text