pkg.re/essentialkaos/ek.10@v12.41.0+incompatible/system/info_linux_test.go (about) 1 package system 2 3 // ////////////////////////////////////////////////////////////////////////////////// // 4 // // 5 // Copyright (c) 2022 ESSENTIAL KAOS // 6 // Apache License, Version 2.0 <https://www.apache.org/licenses/LICENSE-2.0> // 7 // // 8 // ////////////////////////////////////////////////////////////////////////////////// // 9 10 import ( 11 "io/ioutil" 12 "os" 13 "strconv" 14 "strings" 15 "testing" 16 "time" 17 18 . "pkg.re/essentialkaos/check.v1" 19 ) 20 21 // ////////////////////////////////////////////////////////////////////////////////// // 22 23 func Test(t *testing.T) { TestingT(t) } 24 25 type SystemSuite struct{} 26 27 // ////////////////////////////////////////////////////////////////////////////////// // 28 29 var _ = Suite(&SystemSuite{}) 30 31 // ////////////////////////////////////////////////////////////////////////////////// // 32 33 func (s *SystemSuite) TestUptime(c *C) { 34 uptime, err := GetUptime() 35 36 c.Assert(err, IsNil) 37 c.Assert(uptime, Not(Equals), 0) 38 } 39 40 func (s *SystemSuite) TestLoadAvg(c *C) { 41 origProcLoadAvgFile := procLoadAvgFile 42 43 la, err := GetLA() 44 45 c.Assert(err, IsNil) 46 c.Assert(la, NotNil) 47 48 procLoadAvgFile = s.CreateTestFile(c, "1.15 2.25 3.35 5/234 16354") 49 50 la, err = GetLA() 51 52 c.Assert(err, IsNil) 53 c.Assert(la, NotNil) 54 55 c.Assert(la.Min1, Equals, 1.15) 56 c.Assert(la.Min5, Equals, 2.25) 57 c.Assert(la.Min15, Equals, 3.35) 58 c.Assert(la.RProc, Equals, 5) 59 c.Assert(la.TProc, Equals, 234) 60 61 procLoadAvgFile = "" 62 63 la, err = GetLA() 64 65 c.Assert(err, NotNil) 66 c.Assert(la, IsNil) 67 68 procLoadAvgFile = s.CreateTestFile(c, "CORRUPTED") 69 70 la, err = GetLA() 71 72 c.Assert(err, NotNil) 73 c.Assert(la, IsNil) 74 75 procLoadAvgFile = s.CreateTestFile(c, "1.15 2.25 3.35 5+234 16354") 76 77 la, err = GetLA() 78 79 c.Assert(err, NotNil) 80 c.Assert(la, IsNil) 81 82 procLoadAvgFile = origProcLoadAvgFile 83 } 84 85 func (s *SystemSuite) TestCPUUsage(c *C) { 86 origProcStatFile := procStatFile 87 88 cpu, err := GetCPUStats() 89 90 c.Assert(err, IsNil) 91 c.Assert(cpu, NotNil) 92 93 procStatFile = s.CreateTestFile(c, "cpu 10 11 12 13 14 15 16 17 0\ncpu0 0 0 0 0 0 0 0 0 0\ncpu1 0 0 0 0 0 0 0 0 0\n") 94 95 cpu, err = GetCPUStats() 96 97 c.Assert(err, IsNil) 98 c.Assert(cpu, NotNil) 99 c.Assert(cpu.Count, Equals, 2) 100 c.Assert(cpu.User, Equals, uint64(10)) 101 c.Assert(cpu.Nice, Equals, uint64(11)) 102 c.Assert(cpu.System, Equals, uint64(12)) 103 c.Assert(cpu.Idle, Equals, uint64(13)) 104 c.Assert(cpu.Wait, Equals, uint64(14)) 105 c.Assert(cpu.IRQ, Equals, uint64(15)) 106 c.Assert(cpu.SRQ, Equals, uint64(16)) 107 c.Assert(cpu.Steal, Equals, uint64(17)) 108 109 usage, err := GetCPUUsage(time.Millisecond) 110 111 c.Assert(err, IsNil) 112 c.Assert(usage, NotNil) 113 114 c1 := &CPUStats{10, 10, 10, 2, 2, 2, 2, 0, 34, 32} 115 c2 := &CPUStats{12, 12, 12, 3, 3, 3, 3, 0, 48, 32} 116 117 cpuInfo := CalculateCPUUsage(c1, c2) 118 119 c.Assert(cpuInfo, NotNil) 120 c.Assert(cpuInfo.System, Equals, 14.285714285714285) 121 c.Assert(cpuInfo.User, Equals, 14.285714285714285) 122 c.Assert(cpuInfo.Nice, Equals, 14.285714285714285) 123 c.Assert(cpuInfo.Wait, Equals, 7.142857142857142) 124 c.Assert(cpuInfo.Idle, Equals, 7.142857142857142) 125 c.Assert(cpuInfo.Average, Equals, 80.0) 126 c.Assert(cpuInfo.Count, Equals, 32) 127 128 procStatFile = "" 129 130 cpu, err = GetCPUStats() 131 132 c.Assert(err, NotNil) 133 c.Assert(cpu, IsNil) 134 135 procStatFile = s.CreateTestFile(c, "CORRUPTED") 136 137 cpu, err = GetCPUStats() 138 139 c.Assert(err, NotNil) 140 c.Assert(cpu, IsNil) 141 142 procStatFile = origProcStatFile 143 } 144 145 func (s *SystemSuite) TestCPUInfoErrors(c *C) { 146 origProcStatFile := procStatFile 147 148 for i := 1; i <= 8; i++ { 149 data := strings.Replace("cpu 1 2 3 4 5 6 7 8 0", strconv.Itoa(i), "AB", -1) 150 151 procStatFile = s.CreateTestFile(c, data) 152 153 cpu, err := GetCPUStats() 154 155 c.Assert(err, NotNil) 156 c.Assert(cpu, IsNil) 157 } 158 159 procStatFile = origProcStatFile 160 } 161 162 func (s *SystemSuite) TestCPUInfo(c *C) { 163 origCpuInfoFile := cpuInfoFile 164 165 cpuInfoFile = s.CreateTestFile(c, "vendor_id : GenuineIntel\nmodel name : Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz\ncpu MHz : 1204.199\ncache size : 15360 KB\nphysical id : 0\nsiblings : 12\ncpu cores : 6\nflags : mmx\n\nvendor_id : GenuineIntel\nmodel name : Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz\ncpu MHz : 1199.908\ncache size : 15360 KB\nphysical id : 0\nsiblings : 12\ncpu cores : 6\nflags : mmx\n\nvendor_id : GenuineIntel\nmodel name : Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz\ncpu MHz : 1199.908\ncache size : 15360 KB\nphysical id : 0\nsiblings : 12\ncpu cores : 6\nflags : mmx\n\nvendor_id : GenuineIntel\nmodel name : Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz\ncpu MHz : 1199.908\ncache size : 15360 KB\nphysical id : 0\nsiblings : 12\ncpu cores : 6\nflags : mmx\n\nvendor_id : GenuineIntel\nmodel name : Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz\ncpu MHz : 1199.908\ncache size : 15360 KB\nphysical id : 0\nsiblings : 12\ncpu cores : 6\nflags : mmx\n\nvendor_id : GenuineIntel\nmodel name : Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz\ncpu MHz : 1199.792\ncache size : 15360 KB\nphysical id : 0\nsiblings : 12\ncpu cores : 6\nflags : mmx\n\nvendor_id : GenuineIntel\nmodel name : Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz\ncpu MHz : 1206.634\ncache size : 15360 KB\nphysical id : 1\nsiblings : 12\ncpu cores : 6\nflags : mmx\n\nvendor_id : GenuineIntel\nmodel name : Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz\ncpu MHz : 1281.085\ncache size : 15360 KB\nphysical id : 1\nsiblings : 12\ncpu cores : 6\nflags : mmx\n\nvendor_id : GenuineIntel\nmodel name : Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz\ncpu MHz : 1273.431\ncache size : 15360 KB\nphysical id : 1\nsiblings : 12\ncpu cores : 6\nflags : mmx\n\nvendor_id : GenuineIntel\nmodel name : Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz\ncpu MHz : 1199.908\ncache size : 15360 KB\nphysical id : 1\nsiblings : 12\ncpu cores : 6\nflags : mmx\n\nvendor_id : GenuineIntel\nmodel name : Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz\ncpu MHz : 1273.199\ncache size : 15360 KB\nphysical id : 1\nsiblings : 12\ncpu cores : 6\nflags : mmx\n\nvendor_id : GenuineIntel\nmodel name : Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz\ncpu MHz : 1200.024\ncache size : 15360 KB\nphysical id : 1\nsiblings : 12\ncpu cores : 6\nflags : mmx\n\nvendor_id : GenuineIntel\nmodel name : Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz\ncpu MHz : 1260.443\ncache size : 15360 KB\nphysical id : 0\nsiblings : 12\ncpu cores : 6\nflags : mmx\n\nvendor_id : GenuineIntel\nmodel name : Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz\ncpu MHz : 1195.385\ncache size : 15360 KB\nphysical id : 0\nsiblings : 12\ncpu cores : 6\nflags : mmx\n\nvendor_id : GenuineIntel\nmodel name : Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz\ncpu MHz : 1259.283\ncache size : 15360 KB\nphysical id : 0\nsiblings : 12\ncpu cores : 6\nflags : mmx\n\nvendor_id : GenuineIntel\nmodel name : Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz\ncpu MHz : 1199.908\ncache size : 15360 KB\nphysical id : 0\nsiblings : 12\ncpu cores : 6\nflags : mmx\n\nvendor_id : GenuineIntel\nmodel name : Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz\ncpu MHz : 1199.908\ncache size : 15360 KB\nphysical id : 0\nsiblings : 12\ncpu cores : 6\nflags : mmx\n\nvendor_id : GenuineIntel\nmodel name : Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz\ncpu MHz : 1203.387\ncache size : 15360 KB\nphysical id : 0\nsiblings : 12\ncpu cores : 6\nflags : mmx\n\nvendor_id : GenuineIntel\nmodel name : Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz\ncpu MHz : 1276.330\ncache size : 15360 KB\nphysical id : 1\nsiblings : 12\ncpu cores : 6\nflags : mmx\n\nvendor_id : GenuineIntel\nmodel name : Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz\ncpu MHz : 1305.670\ncache size : 15360 KB\nphysical id : 1\nsiblings : 12\ncpu cores : 6\nflags : mmx\n\nvendor_id : GenuineIntel\nmodel name : Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz\ncpu MHz : 1275.750\ncache size : 15360 KB\nphysical id : 1\nsiblings : 12\ncpu cores : 6\nflags : mmx\n\nvendor_id : GenuineIntel\nmodel name : Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz\ncpu MHz : 1253.253\ncache size : 15360 KB\nphysical id : 1\nsiblings : 12\ncpu cores : 6\nflags : mmx\n\nvendor_id : GenuineIntel\nmodel name : Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz\ncpu MHz : 1337.677\ncache size : 15360 KB\nphysical id : 1\nsiblings : 12\ncpu cores : 6\nflags : mmx\n\nvendor_id : GenuineIntel\nmodel name : Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz\ncpu MHz : 1327.008\ncache size : 15360 KB\nphysical id : 1\nsiblings : 12\ncpu cores : 6\nflags : mmx\n\n") 166 167 info, err := GetCPUInfo() 168 169 c.Assert(err, IsNil) 170 c.Assert(info, NotNil) 171 c.Assert(info, HasLen, 2) 172 c.Assert(info[0].Vendor, Equals, "GenuineIntel") 173 c.Assert(info[0].Model, Equals, "Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz") 174 c.Assert(info[0].Cores, Equals, 6) 175 c.Assert(info[0].Siblings, Equals, 12) 176 c.Assert(info[0].CacheSize, Equals, uint64(15360*1024)) 177 c.Assert(info[0].Speed, DeepEquals, []float64{1204.199, 1199.908, 1199.908, 1199.908, 1199.908, 1199.792, 1260.443, 1195.385, 1259.283, 1199.908, 1199.908, 1203.387}) 178 c.Assert(info[1].Vendor, Equals, "GenuineIntel") 179 c.Assert(info[1].Model, Equals, "Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz") 180 c.Assert(info[1].Cores, Equals, 6) 181 c.Assert(info[1].Siblings, Equals, 12) 182 c.Assert(info[1].CacheSize, Equals, uint64(15360*1024)) 183 c.Assert(info[1].Speed, DeepEquals, []float64{1206.634, 1281.085, 1273.431, 1199.908, 1273.199, 1200.024, 1276.33, 1305.67, 1275.75, 1253.253, 1337.677, 1327.008}) 184 185 cpuInfoFile = s.CreateTestFile(c, "CORRUPTED") 186 187 info, err = GetCPUInfo() 188 189 c.Assert(err, NotNil) 190 c.Assert(info, IsNil) 191 192 cpuInfoFile = s.CreateTestFile(c, "cpu cores : ABCD") 193 194 info, err = GetCPUInfo() 195 196 c.Assert(err, NotNil) 197 c.Assert(info, IsNil) 198 199 cpuInfoFile = "" 200 201 info, err = GetCPUInfo() 202 203 c.Assert(err, NotNil) 204 c.Assert(info, IsNil) 205 206 cpuInfoFile = origCpuInfoFile 207 } 208 209 func (s *SystemSuite) TestCPUCount(c *C) { 210 origCpuPossibleFile := cpuPossibleFile 211 origCpuPresentFile := cpuPresentFile 212 origCpuOnlineFile := cpuOnlineFile 213 origCpuOfflineFile := cpuOfflineFile 214 215 cpuPossibleFile = s.CreateTestFile(c, "0-127\n") 216 cpuPresentFile = s.CreateTestFile(c, "0-3\n") 217 cpuOnlineFile = s.CreateTestFile(c, "0-3\n") 218 cpuOfflineFile = s.CreateTestFile(c, "4-127\n") 219 220 info, err := GetCPUCount() 221 222 c.Assert(err, IsNil) 223 224 c.Assert(info.Possible, Equals, uint32(128)) 225 c.Assert(info.Present, Equals, uint32(4)) 226 c.Assert(info.Online, Equals, uint32(4)) 227 c.Assert(info.Offline, Equals, uint32(124)) 228 229 cpuOfflineFile = "/_UNKNOWN_" 230 _, err = GetCPUCount() 231 c.Assert(err, NotNil) 232 233 cpuOnlineFile = "/_UNKNOWN_" 234 _, err = GetCPUCount() 235 c.Assert(err, NotNil) 236 237 cpuPresentFile = "/_UNKNOWN_" 238 _, err = GetCPUCount() 239 c.Assert(err, NotNil) 240 241 cpuPossibleFile = "/_UNKNOWN_" 242 _, err = GetCPUCount() 243 c.Assert(err, NotNil) 244 245 cpuPossibleFile = origCpuPossibleFile 246 cpuPresentFile = origCpuPresentFile 247 cpuOnlineFile = origCpuOnlineFile 248 cpuOfflineFile = origCpuOfflineFile 249 } 250 251 func (s *SystemSuite) TestMemUsage(c *C) { 252 origProcMemInfoFile := procMemInfoFile 253 254 procMemInfoFile = s.CreateTestFile(c, "MemTotal: 32653288 kB\nMemFree: 531664 kB\nMemAvailable: 31243272 kB\nBuffers: 7912 kB\nCached: 28485940 kB\nSwapCached: 889 kB\nActive: 15379084 kB\nInactive: 13340308 kB\nActive(anon): 143408 kB\nInactive(anon): 247048 kB\nActive(file): 15235676 kB\nInactive(file): 13093260 kB\nUnevictable: 16 kB\nMlocked: 16 kB\nSwapTotal: 4194300 kB\nSwapFree: 2739454 kB\nDirty: 6744 kB\nWriteback: 0 kB\nAnonPages: 225604 kB\nMapped: 46404 kB\nShmem: 164916 kB\nSlab: 3021828 kB\nSReclaimable: 2789624 kB\nSUnreclaim: 232204 kB\nKernelStack: 3696 kB\n") 255 256 mem, err := GetMemUsage() 257 258 c.Assert(err, IsNil) 259 c.Assert(mem, NotNil) 260 c.Assert(mem.MemTotal, Equals, uint64(1024*32653288)) 261 c.Assert(mem.MemFree, Equals, uint64(1024*31650224)) 262 c.Assert(mem.MemUsed, Equals, uint64(1024*1003064)) 263 c.Assert(mem.Buffers, Equals, uint64(1024*7912)) 264 c.Assert(mem.Cached, Equals, uint64(1024*28485940)) 265 c.Assert(mem.Active, Equals, uint64(1024*15379084)) 266 c.Assert(mem.Inactive, Equals, uint64(1024*13340308)) 267 c.Assert(mem.SwapTotal, Equals, uint64(1024*4194300)) 268 c.Assert(mem.SwapFree, Equals, uint64(1024*2739454)) 269 c.Assert(mem.SwapUsed, Equals, uint64(1024*1454846)) 270 c.Assert(mem.SwapCached, Equals, uint64(1024*889)) 271 c.Assert(mem.Dirty, Equals, uint64(1024*6744)) 272 c.Assert(mem.Shmem, Equals, uint64(1024*164916)) 273 c.Assert(mem.Slab, Equals, uint64(1024*3021828)) 274 c.Assert(mem.SReclaimable, Equals, uint64(1024*2789624)) 275 276 procMemInfoFile = "" 277 278 mem, err = GetMemUsage() 279 280 c.Assert(err, NotNil) 281 c.Assert(mem, IsNil) 282 283 procMemInfoFile = s.CreateTestFile(c, "") 284 285 mem, err = GetMemUsage() 286 287 c.Assert(err, NotNil) 288 c.Assert(mem, IsNil) 289 290 procMemInfoFile = s.CreateTestFile(c, "MemTotal: ABC! kB") 291 292 mem, err = GetMemUsage() 293 294 c.Assert(err, NotNil) 295 c.Assert(mem, IsNil) 296 297 procMemInfoFile = origProcMemInfoFile 298 } 299 300 func (s *SystemSuite) TestNet(c *C) { 301 origProcNetFile := procNetFile 302 303 net, err := GetInterfacesStats() 304 305 c.Assert(err, IsNil) 306 c.Assert(net, NotNil) 307 308 procNetFile = s.CreateTestFile(c, "Inter-| Receive | Transmit\n face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed\neth0: 144612532790 216320765 0 0 0 0 0 0 366397171405 154518846 0 0 0 0 0 0\n") 309 310 net, err = GetInterfacesStats() 311 312 c.Assert(err, IsNil) 313 c.Assert(net, NotNil) 314 c.Assert(net["eth0"], NotNil) 315 c.Assert(net["eth0"].ReceivedBytes, Equals, uint64(144612532790)) 316 c.Assert(net["eth0"].ReceivedPackets, Equals, uint64(216320765)) 317 c.Assert(net["eth0"].TransmittedBytes, Equals, uint64(366397171405)) 318 c.Assert(net["eth0"].TransmittedPackets, Equals, uint64(154518846)) 319 320 _, _, err = GetNetworkSpeed(time.Second) 321 322 c.Assert(err, IsNil) 323 324 in, out := CalculateNetworkSpeed( 325 map[string]*InterfaceStats{"eth0": {0, 0, 0, 0}}, 326 map[string]*InterfaceStats{"eth0": {0, 0, 0, 0}}, 327 time.Second, 328 ) 329 330 c.Assert(in, Equals, uint64(0)) 331 c.Assert(out, Equals, uint64(0)) 332 333 procNetFile = "" 334 335 net, err = GetInterfacesStats() 336 337 c.Assert(err, NotNil) 338 c.Assert(net, IsNil) 339 340 procNetFile = s.CreateTestFile(c, "CORRUPTED") 341 342 net, err = GetInterfacesStats() 343 344 c.Assert(err, NotNil) 345 c.Assert(net, IsNil) 346 347 _, _, err = GetNetworkSpeed(time.Second) 348 349 c.Assert(err, NotNil) 350 351 procNetFile = origProcNetFile 352 } 353 354 func (s *SystemSuite) TestFSUsage(c *C) { 355 origMtabFile := mtabFile 356 origProcStatFile := procStatFile 357 origProcDiskStatsFile := procDiskStatsFile 358 359 fs, err := GetFSUsage() 360 361 c.Assert(err, IsNil) 362 c.Assert(fs, NotNil) 363 364 util, err := GetIOUtil(time.Second) 365 366 c.Assert(err, IsNil) 367 c.Assert(util, NotNil) 368 369 mtabFile = "" 370 371 fs, err = GetFSUsage() 372 373 c.Assert(err, NotNil) 374 c.Assert(fs, IsNil) 375 376 mtabFile = s.CreateTestFile(c, "/CORRUPTED") 377 378 fs, err = GetFSUsage() 379 380 c.Assert(err, NotNil) 381 c.Assert(fs, IsNil) 382 383 mtabFile = s.CreateTestFile(c, "/CORRUPTED 0 0 0") 384 385 fs, err = GetFSUsage() 386 387 c.Assert(err, NotNil) 388 c.Assert(fs, IsNil) 389 390 procDiskStatsFile = "" 391 392 stats, err := GetIOStats() 393 394 c.Assert(err, NotNil) 395 c.Assert(stats, IsNil) 396 397 procDiskStatsFile = s.CreateTestFile(c, "CORRUPTED") 398 399 stats, err = GetIOStats() 400 401 c.Assert(err, NotNil) 402 c.Assert(stats, IsNil) 403 404 fs, err = GetFSUsage() 405 406 c.Assert(err, NotNil) 407 c.Assert(fs, IsNil) 408 409 util, err = GetIOUtil(time.Millisecond) 410 411 c.Assert(err, NotNil) 412 c.Assert(util, IsNil) 413 414 procStatFile = "" 415 mtabFile = "/etc/mtab" 416 procDiskStatsFile = "/proc/diskstats" 417 418 mtabFile = s.CreateTestFile(c, "/dev/abc1 / ext4 rw 0 0") 419 420 fs, err = GetFSUsage() 421 422 c.Assert(err, IsNil) 423 c.Assert(fs, NotNil) 424 425 util = CalculateIOUtil( 426 map[string]*IOStats{"abc": {IOMs: 10}}, 427 map[string]*IOStats{"abc": {IOMs: 1840}}, 428 time.Minute, 429 ) 430 431 c.Assert(util, NotNil) 432 c.Assert(util["abc"], Equals, 3.05) 433 434 procDiskStatsFile = origProcDiskStatsFile 435 procStatFile = origProcStatFile 436 mtabFile = origMtabFile 437 } 438 439 func (s *SystemSuite) TestDiskStatsParsingErrors(c *C) { 440 origProcDiskStatsFile := procDiskStatsFile 441 442 for i := 0; i < 11; i++ { 443 data := " 8 0 sda X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 X10" 444 data = strings.Replace(data, "X"+strconv.Itoa(i), "A", -1) 445 data = strings.Replace(data, "X", "", -1) 446 447 procDiskStatsFile = s.CreateTestFile(c, data) 448 449 stats, err := GetIOStats() 450 451 c.Assert(err, NotNil) 452 c.Assert(stats, IsNil) 453 } 454 455 procDiskStatsFile = origProcDiskStatsFile 456 } 457 458 func (s *SystemSuite) TestUser(c *C) { 459 user, err := CurrentUser() 460 461 c.Assert(err, IsNil) 462 c.Assert(user, NotNil) 463 464 appendRealUserInfo(user) 465 466 c.Assert(user.IsRoot(), Equals, false) 467 c.Assert(user.IsSudo(), Equals, false) 468 c.Assert(user.GroupList(), NotNil) 469 470 user, err = CurrentUser() 471 472 c.Assert(err, IsNil) 473 c.Assert(user, NotNil) 474 475 // This test can fail on CI because workers 476 // doesn't have any active sessions 477 if os.Getenv("CI") == "" { 478 sess, err := Who() 479 480 c.Assert(err, IsNil) 481 c.Assert(sess, NotNil) 482 } 483 484 user, err = LookupUser("") 485 486 c.Assert(err, NotNil) 487 c.Assert(user, IsNil) 488 489 group, err := LookupGroup("root") 490 491 c.Assert(err, IsNil) 492 c.Assert(group, NotNil) 493 494 group, err = LookupGroup("") 495 496 c.Assert(err, NotNil) 497 c.Assert(group, IsNil) 498 499 c.Assert(IsUserExist("root"), Equals, true) 500 c.Assert(IsUserExist("_UNKNOWN_"), Equals, false) 501 c.Assert(IsGroupExist("root"), Equals, true) 502 c.Assert(IsGroupExist("_UNKNOWN_"), Equals, false) 503 504 c.Assert(CurrentTTY(), Not(Equals), "") 505 506 uid, ok := getTDOwnerID() 507 508 c.Assert(uid, Not(Equals), -1) 509 c.Assert(ok, Equals, true) 510 511 os.Setenv("SUDO_USER", "testuser") 512 os.Setenv("SUDO_UID", "1234") 513 os.Setenv("SUDO_GID", "1234") 514 515 username, uid, gid := getRealUserFromEnv() 516 517 c.Assert(username, Equals, "testuser") 518 c.Assert(uid, Equals, 1234) 519 c.Assert(gid, Equals, 1234) 520 521 groups := extractGroupsInfo("uid=10123(john) gid=10123(john) groups=10123(john),10200(admins),10201(developers)") 522 523 c.Assert(groups[0].Name, Equals, "john") 524 c.Assert(groups[0].GID, Equals, 10123) 525 c.Assert(groups[2].Name, Equals, "developers") 526 c.Assert(groups[2].GID, Equals, 10201) 527 528 groups = extractGroupsInfo("uid=66(someone) gid=66(someone) groups=66(someone)\n\n") 529 530 c.Assert(groups[0].Name, Equals, "someone") 531 c.Assert(groups[0].GID, Equals, 66) 532 533 group, err = parseGetentGroupOutput("developers:*:10201:bob,john") 534 535 c.Assert(err, IsNil) 536 c.Assert(group, NotNil) 537 c.Assert(group.Name, Equals, "developers") 538 c.Assert(group.GID, Equals, 10201) 539 540 user, err = parseGetentPasswdOutput("bob:*:10567:10567::/home/bob:/bin/zsh") 541 542 c.Assert(err, IsNil) 543 c.Assert(user, NotNil) 544 c.Assert(user.Name, Equals, "bob") 545 c.Assert(user.UID, Equals, 10567) 546 c.Assert(user.GID, Equals, 10567) 547 c.Assert(user.Comment, Equals, "") 548 c.Assert(user.HomeDir, Equals, "/home/bob") 549 c.Assert(user.Shell, Equals, "/bin/zsh") 550 551 _, err = getOwner("") 552 553 c.Assert(err, NotNil) 554 555 _, err = getSessionInfo("ABC") 556 557 c.Assert(err, NotNil) 558 559 n, _ := fixCount(-100, nil) 560 561 c.Assert(n, Equals, 0) 562 563 ptsDir = "/not_exist" 564 565 sess, err := Who() 566 567 c.Assert(err, IsNil) 568 c.Assert(sess, HasLen, 0) 569 570 } 571 572 func (s *SystemSuite) TestGetInfo(c *C) { 573 origOsReleaseFile := osReleaseFile 574 575 osReleaseFile = "/_UNKNOWN_" 576 577 sysInfo, err := GetSystemInfo() 578 579 c.Assert(sysInfo, IsNil) 580 c.Assert(err, NotNil) 581 582 osReleaseFile = s.CreateTestFile(c, `NAME="Ubuntu" 583 VERSION="20.10 (Groovy Gorilla)" 584 ID=ubuntu 585 ID_LIKE=debian 586 PRETTY_NAME="Ubuntu 20.10" 587 VERSION_ID="20.10" 588 HOME_URL="https://www.ubuntu.com/" 589 SUPPORT_URL="https://help.ubuntu.com/" 590 BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" 591 VERSION_CODENAME=groovy`) 592 593 sysInfo, err = GetSystemInfo() 594 595 c.Assert(sysInfo, NotNil) 596 c.Assert(err, IsNil) 597 598 osInfo, err := GetOSInfo() 599 600 c.Assert(osInfo.Name, Equals, LINUX_UBUNTU) 601 c.Assert(osInfo.PrettyName, Equals, "Ubuntu 20.10") 602 c.Assert(osInfo.Version, Equals, "20.10 (Groovy Gorilla)") 603 c.Assert(osInfo.VersionID, Equals, "20.10") 604 c.Assert(osInfo.VersionCodename, Equals, "groovy") 605 c.Assert(osInfo.ID, Equals, "ubuntu") 606 c.Assert(osInfo.IDLike, Equals, "debian") 607 c.Assert(osInfo.HomeURL, Equals, "https://www.ubuntu.com/") 608 c.Assert(osInfo.BugReportURL, Equals, "https://bugs.launchpad.net/ubuntu/") 609 c.Assert(osInfo.SupportURL, Equals, "https://help.ubuntu.com/") 610 611 c.Assert(formatDistName("arch"), Equals, LINUX_ARCH) 612 c.Assert(formatDistName("centos"), Equals, LINUX_CENTOS) 613 c.Assert(formatDistName("debian"), Equals, LINUX_DEBIAN) 614 c.Assert(formatDistName("fedora"), Equals, LINUX_FEDORA) 615 c.Assert(formatDistName("gentoo"), Equals, LINUX_GENTOO) 616 c.Assert(formatDistName("rhel"), Equals, LINUX_RHEL) 617 c.Assert(formatDistName("suse"), Equals, LINUX_SUSE) 618 c.Assert(formatDistName("opensuse"), Equals, LINUX_OPEN_SUSE) 619 c.Assert(formatDistName("ubuntu"), Equals, LINUX_UBUNTU) 620 c.Assert(formatDistName("SuppaLinux"), Equals, "SuppaLinux") 621 622 osReleaseFile = origOsReleaseFile 623 } 624 625 func (s *SystemSuite) TestGetCPUArchBits(c *C) { 626 origCpuInfoFile := cpuInfoFile 627 628 cpuInfoFile = "/_UNKNOWN_" 629 630 c.Assert(getCPUArchBits(), Equals, 0) 631 632 cpuInfoFile = s.CreateTestFile(c, "processor : 1\nflags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64") 633 634 c.Assert(getCPUArchBits(), Equals, 64) 635 636 cpuInfoFile = s.CreateTestFile(c, "processor : 1\nflags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64") 637 638 c.Assert(getCPUArchBits(), Equals, 32) 639 640 cpuInfoFile = origCpuInfoFile 641 } 642 643 // ////////////////////////////////////////////////////////////////////////////////// // 644 645 func (s *SystemSuite) CreateTestFile(c *C, data string) string { 646 tmpDir := c.MkDir() 647 tmpFile := tmpDir + "/test.file" 648 649 if ioutil.WriteFile(tmpFile, []byte(data), 0644) != nil { 650 c.Fatal("Can't create temporary file") 651 } 652 653 return tmpFile 654 }