pkg.re/essentialkaos/ek@v12.36.0+incompatible/system/info_test.go (about)

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