github.com/mackerelio/mackerel-agent-plugins@v0.89.3/mackerel-plugin-linux/lib/linux_test.go (about) 1 package mplinux 2 3 import ( 4 "bytes" 5 "fmt" 6 "os" 7 "reflect" 8 "testing" 9 10 "github.com/stretchr/testify/assert" 11 ) 12 13 func TestCollectWho(t *testing.T) { 14 _, err := os.Stat("/usr/bin/who") 15 if err != nil { 16 return 17 } 18 p := make(map[string]interface{}) 19 20 assert.Nil(t, collectWho(&p)) 21 } 22 23 func TestParseWho(t *testing.T) { 24 stub := `test0 pts/48 2014-09-30 08:00 (192.168.24.123) 25 test1 pts/48 2014-09-30 08:59 (192.168.24.123) 26 test2 pts/48 2014-09-30 09:00 (192.168.24.123)` 27 stat := make(map[string]interface{}) 28 29 err := parseWho(stub, &stat) 30 assert.Nil(t, err) 31 assert.EqualValues(t, stat["users"], 3) 32 } 33 34 func TestParseWho2(t *testing.T) { 35 stub := "" 36 stat := make(map[string]interface{}) 37 38 err := parseWho(stub, &stat) 39 assert.Nil(t, err) 40 assert.EqualValues(t, stat["users"], 0) 41 } 42 43 func TestGetWho(t *testing.T) { 44 _, err := os.Stat("/usr/sbin/who") 45 if err != nil { 46 return 47 } 48 49 ret, err := getWho() 50 assert.Nil(t, err) 51 assert.NotNil(t, ret) 52 } 53 54 func TestCollectStat(t *testing.T) { 55 path := "/proc/stat" 56 _, err := os.Stat(path) 57 if err != nil { 58 return 59 } 60 p := make(map[string]interface{}) 61 62 assert.Nil(t, collectProcStat(path, &p)) 63 } 64 65 func TestParseProcStat(t *testing.T) { 66 stub := `intr 614818624 122 8 0 0 1 0 0 0 1 0 0 0 123 0 0 0 0 0 0 0 0 0 0 0 4846888 0 44650320 253 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 67 ctxt 879305394 68 btime 1409212617 69 processes 1959410` 70 stat := make(map[string]interface{}) 71 72 err := parseProcStat(bytes.NewBufferString(stub), &stat) 73 assert.Nil(t, err) 74 assert.EqualValues(t, stat["interrupts"], 614818624) 75 assert.EqualValues(t, stat["context_switches"], 879305394) 76 assert.EqualValues(t, stat["forks"], 1959410) 77 } 78 79 func TestCollectNetworkStat(t *testing.T) { 80 _, err := os.Stat("/usr/sbin/ss") 81 if err != nil { 82 return 83 } 84 p := make(map[string]interface{}) 85 86 assert.Nil(t, collectNetworkStat(&p)) 87 } 88 89 func TestParseSs(t *testing.T) { 90 testCases := []struct { 91 name string 92 input string 93 expect map[string]interface{} 94 }{ 95 { 96 name: "Cent6", 97 input: `State Recv-Q Send-Q Local Address:Port Peer Address:Port 98 LISTEN 0 128 :::45103 :::* 99 LISTEN 0 128 :::111 :::* 100 TIME-WAIT 0 0 ::ffff:127.0.0.1:80 ::ffff:127.0.0.1:50082 101 ESTAB 0 0 10.0.25.101:60826 10.0.25.104:5672 `, 102 expect: map[string]interface{}{ 103 "LISTEN": 2.0, 104 "TIME-WAIT": 1.0, 105 "ESTAB": 1.0, 106 }, 107 }, 108 { 109 name: "Cent7", 110 input: `Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port 111 nl UNCONN 0 0 18:0 * 112 p_raw UNCONN 0 0 *:em2 * 113 u_dgr UNCONN 0 0 /dev/log 10549 * 0 114 u_dgr LISTEN 0 0 /run/udev/control 8552 * 0 115 u_str LISTEN 0 10 /var/run/acpid.socket 9649 * 0 116 u_str ESTAB 0 0 @/com/ubuntu/upstart 10582 * 1887`, 117 118 expect: map[string]interface{}{ 119 "LISTEN": 2.0, 120 "UNCONN": 3.0, 121 "ESTAB": 1.0, 122 }, 123 }, 124 { 125 name: "Cent7 overstuffed", 126 input: `NetidState Recv-Q Send-Q Local Address:Port Peer Address:Port 127 nl UNCONN 0 0 18:0 * 128 p_rawUNCONN 0 0 *:em2 * 129 u_dgrUNCONN 0 0 /dev/log 10549 * 0 130 u_dgrLISTEN 0 0 /run/udev/control 8552 * 0 131 u_strLISTEN 0 10 /var/run/acpid.socket 9649 * 0 132 u_strESTAB 0 0 @/com/ubuntu/upstart 10582 * 1887`, 133 expect: map[string]interface{}{ 134 "LISTEN": 2.0, 135 "UNCONN": 3.0, 136 "ESTAB": 1.0, 137 }, 138 }, 139 } 140 141 for _, tc := range testCases { 142 t.Run(tc.name, func(t *testing.T) { 143 out := make(map[string]interface{}) 144 err := parseSs(bytes.NewBufferString(tc.input), &out) 145 if err != nil { 146 t.Errorf("error should be nil but: %s", err) 147 } 148 if !reflect.DeepEqual(out, tc.expect) { 149 t.Errorf("something went wrong:\n out: %v\nexpect: %v", out, tc.expect) 150 } 151 }) 152 } 153 } 154 func TestCollectProcVmstat(t *testing.T) { 155 path := "/proc/vmstat" 156 _, err := os.Stat(path) 157 if err != nil { 158 return 159 } 160 p := make(map[string]interface{}) 161 162 assert.Nil(t, collectProcVmstat(path, &p)) 163 } 164 165 func TestParseProcVmstat(t *testing.T) { 166 stub := `pgpgin 770294 167 pgpgout 31351354 168 pswpin 0 169 pswpout 113` 170 stat := make(map[string]interface{}) 171 172 err := parseProcVmstat(bytes.NewBufferString(stub), &stat) 173 assert.Nil(t, err) 174 assert.EqualValues(t, stat["pgpgin"], 770294) 175 assert.EqualValues(t, stat["pgpgout"], 31351354) 176 assert.EqualValues(t, stat["pswpin"], 0) 177 assert.EqualValues(t, stat["pswpout"], 113) 178 } 179 180 func TestCollectDiskStats(t *testing.T) { 181 path := "/sys" 182 183 _, err := os.Stat(path) 184 if err != nil { 185 return 186 } 187 p := make(map[string]interface{}) 188 189 assert.Nil(t, collectDiskStats(path, &p)) 190 } 191 192 func TestParseDiskStat(t *testing.T) { 193 name := "testdevice" 194 stub := ` 36049 277 3702446 36470 1165021 131631 15197712 1648460 0 771090 1684180` 195 stat := make(map[string]interface{}) 196 197 err := parseDiskStat(name, stub, &stat) 198 assert.Nil(t, err) 199 assert.EqualValues(t, stat[fmt.Sprintf("iotime_%s", name)], 771090) 200 assert.EqualValues(t, stat[fmt.Sprintf("iotime_weighted_%s", name)], 1684180) 201 assert.EqualValues(t, stat[fmt.Sprintf("tsreading_%s", name)], 36470) 202 assert.EqualValues(t, stat[fmt.Sprintf("tswriting_%s", name)], 1648460) 203 } 204 205 func TestParseDiskStat_Kernel4_18(t *testing.T) { 206 name := "testdevice" 207 stub := ` 28994 0 304494 16115 10063 42070 1546600 41730 0 3434 55235 0 0 0 0` 208 stat := make(map[string]interface{}) 209 210 err := parseDiskStat(name, stub, &stat) 211 assert.Nil(t, err) 212 assert.EqualValues(t, stat[fmt.Sprintf("iotime_%s", name)], 3434) 213 assert.EqualValues(t, stat[fmt.Sprintf("iotime_weighted_%s", name)], 55235) 214 assert.EqualValues(t, stat[fmt.Sprintf("tsreading_%s", name)], 16115) 215 assert.EqualValues(t, stat[fmt.Sprintf("tswriting_%s", name)], 41730) 216 } 217 218 func TestCollectVirtualDevice(t *testing.T) { 219 cases := []struct { 220 name string 221 expected bool 222 }{ 223 { 224 name: "loop0", 225 expected: false, 226 }, 227 { 228 name: "dm-3", 229 expected: false, 230 }, 231 { 232 name: "fioa", // ioDrive(FusionIO) #1 233 expected: true, 234 }, 235 { 236 name: "fioz", // ioDrive(FusionIO) #26 237 expected: true, 238 }, 239 { 240 name: "fioaa", // ioDrive(FusionIO) #27 241 expected: true, 242 }, 243 } 244 245 for _, c := range cases { 246 assert.EqualValues(t, c.expected, collectVirtualDevice.Match([]byte(c.name))) 247 } 248 }