@@ -4,6 +4,8 @@ package cgroups
44
55import (
66 "bytes"
7+ "fmt"
8+ "reflect"
79 "strings"
810 "testing"
911)
@@ -190,3 +192,56 @@ func BenchmarkGetCgroupMounts(b *testing.B) {
190192 }
191193 }
192194}
195+
196+ func TestParseCgroupString (t * testing.T ) {
197+ testCases := []struct {
198+ input string
199+ expectedError error
200+ expectedOutput map [string ]string
201+ }{
202+ {
203+ // Taken from a CoreOS instance running systemd 225 with CPU/Mem
204+ // accounting enabled in systemd
205+ input : `9:blkio:/
206+ 8:freezer:/
207+ 7:perf_event:/
208+ 6:devices:/system.slice/system-sshd.slice
209+ 5:cpuset:/
210+ 4:cpu,cpuacct:/system.slice/system-sshd.slice/[email protected] :22-xxx.yyy.zzz.aaa:33678.service 211+ 3:net_cls,net_prio:/
212+ 2:memory:/system.slice/system-sshd.slice/[email protected] :22-xxx.yyy.zzz.aaa:33678.service 213+ 1:name=systemd:/system.slice/system-sshd.slice/[email protected] :22-xxx.yyy.zzz.aaa:33678.service` ,
214+ expectedOutput : map [string ]string {
215+ "name=systemd" :
"/system.slice/system-sshd.slice/[email protected] :22-xxx.yyy.zzz.aaa:33678.service" ,
216+ "blkio" : "/" ,
217+ "freezer" : "/" ,
218+ "perf_event" : "/" ,
219+ "devices" : "/system.slice/system-sshd.slice" ,
220+ "cpuset" : "/" ,
221+ "cpu" :
"/system.slice/system-sshd.slice/[email protected] :22-xxx.yyy.zzz.aaa:33678.service" ,
222+ "cpuacct" :
"/system.slice/system-sshd.slice/[email protected] :22-xxx.yyy.zzz.aaa:33678.service" ,
223+ "net_cls" : "/" ,
224+ "net_prio" : "/" ,
225+ "memory" :
"/system.slice/system-sshd.slice/[email protected] :22-xxx.yyy.zzz.aaa:33678.service" ,
226+ },
227+ },
228+ {
229+ input : `malformed input` ,
230+ expectedError : fmt .Errorf (`invalid cgroup entry: must contain at least two colons: malformed input` ),
231+ },
232+ }
233+
234+ for ndx , testCase := range testCases {
235+ out , err := parseCgroupFromReader (strings .NewReader (testCase .input ))
236+ if err != nil {
237+ if testCase .expectedError == nil || testCase .expectedError .Error () != err .Error () {
238+ t .Errorf ("%v: expected error %v, got error %v" , ndx , testCase .expectedError , err )
239+ }
240+ } else {
241+ if ! reflect .DeepEqual (testCase .expectedOutput , out ) {
242+ t .Errorf ("%v: expected output %v, got error %v" , ndx , testCase .expectedOutput , out )
243+ }
244+ }
245+ }
246+
247+ }
0 commit comments