github.com/opencontainers/runc@v1.2.0-rc.1.0.20240520010911-492dc558cdd6/libcontainer/cgroups/fs2/io_test.go (about) 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 // We're using a fake cgroupfs. 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 // Sort the output since statIo uses a map internally. 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 }