/* Utility for testing cgroup operations. Creates a mock of the cgroup filesystem for the duration of the test. */ package fs import ( "fmt" "io/ioutil" "log" "os" "testing" ) type cgroupTestUtil struct { // data to use in tests. CgroupData *data // Path to the mock cgroup directory. CgroupPath string // Temporary directory to store mock cgroup filesystem. tempDir string t *testing.T } // Creates a new test util for the specified subsystem func NewCgroupTestUtil(subsystem string, t *testing.T) *cgroupTestUtil { d := &data{} tempDir, err := ioutil.TempDir("", fmt.Sprintf("%s_cgroup_test", subsystem)) if err != nil { t.Fatal(err) } d.root = tempDir testCgroupPath, err := d.path(subsystem) if err != nil { t.Fatal(err) } // Ensure the full mock cgroup path exists. err = os.MkdirAll(testCgroupPath, 0755) if err != nil { t.Fatal(err) } return &cgroupTestUtil{CgroupData: d, CgroupPath: testCgroupPath, tempDir: tempDir, t: t} } func (c *cgroupTestUtil) cleanup() { os.RemoveAll(c.tempDir) } // Write the specified contents on the mock of the specified cgroup files. func (c *cgroupTestUtil) writeFileContents(fileContents map[string]string) { for file, contents := range fileContents { err := writeFile(c.CgroupPath, file, contents) if err != nil { c.t.Fatal(err) } } } // Expect the specified stats. func expectStats(t *testing.T, expected, actual map[string]float64) { for stat, expectedValue := range expected { actualValue, ok := actual[stat] if !ok { log.Printf("Expected stat %s to exist: %s", stat, actual) t.Fail() } else if actualValue != expectedValue { log.Printf("Expected stats %s to have value %f but had %f instead", stat, expectedValue, actualValue) t.Fail() } } }