...

Source file src/github.com/opencontainers/runc/libcontainer/cgroups/fs2/io_test.go

Documentation: github.com/opencontainers/runc/libcontainer/cgroups/fs2

     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  }
    82  

View as plain text