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  }