Home | History | Annotate | Download | only in bin
      1 #!/usr/bin/python
      2 
      3 __author__ = "kerl (at] google.com, gwendal (at] google.com (Gwendal Grignou)"
      4 
      5 import io
      6 import mock
      7 import unittest
      8 
      9 from autotest_lib.client.bin import utils
     10 
     11 _IOSTAT_OUTPUT = (
     12     'Linux 3.8.11 (localhost)   02/19/19        _x86_64_        (4 CPU)\n'
     13     '\n'
     14     'Device            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn\n'
     15     'ALL              4.45        10.33       292.40     665582     188458\n'
     16     '\n')
     17 
     18 class TestUtils(unittest.TestCase):
     19     """Test utils functions."""
     20 
     21     # Test methods, disable missing-docstring
     22     # pylint: disable=missing-docstring
     23     def setUp(self):
     24         utils._open_file = self.fake_open
     25         # Files opened with utils._open_file will contain this string.
     26         self.fake_file_text = ''
     27 
     28     def fake_open(self, path):
     29         # Use BytesIO instead of StringIO to support with statements.
     30         return io.BytesIO(bytes(self.fake_file_text))
     31 
     32     def test_concat_partition(self):
     33         self.assertEquals("nvme0n1p3", utils.concat_partition("nvme0n1", 3))
     34         self.assertEquals("mmcblk1p3", utils.concat_partition("mmcblk1", 3))
     35         self.assertEquals("sda3", utils.concat_partition("sda", 3))
     36 
     37     # The columns in /proc/stat are:
     38     # user nice system idle iowait irq softirq steal guest guest_nice
     39     #
     40     # Although older kernel versions might not contain all of them.
     41     # Unit is 1/100ths of a second.
     42     def test_get_cpu_usage(self):
     43         self.fake_file_text = 'cpu 254544 9 254768 2859878 1 2 3 4 5 6\n'
     44         usage = utils.get_cpu_usage()
     45         self.assertEquals({
     46             'user': 254544,
     47             'nice': 9,
     48             'system': 254768,
     49             'idle': 2859878,
     50             'iowait': 1,
     51             'irq': 2,
     52             'softirq': 3,
     53             'steal': 4,
     54             'guest': 5,
     55             'guest_nice': 6
     56         }, usage)
     57 
     58     def test_get_cpu_missing_columns(self):
     59         self.fake_file_text = 'cpu 254544 9 254768 2859878\n'
     60         usage = utils.get_cpu_usage()
     61         self.assertEquals({
     62             'user': 254544,
     63             'nice': 9,
     64             'system': 254768,
     65             'idle': 2859878,
     66             'iowait': 0,
     67             'irq': 0,
     68             'softirq': 0,
     69             'steal': 0,
     70             'guest': 0,
     71             'guest_nice': 0
     72         }, usage)
     73 
     74     def test_compute_active_cpu_time(self):
     75         start_usage = {
     76             'user': 900,
     77             'nice': 10,
     78             'system': 90,
     79             'idle': 10000,
     80             'iowait': 500,
     81             'irq': 100,
     82             'softirq': 50,
     83             'steal': 150,
     84             'guest': 170,
     85             'guest_nice': 30
     86         }
     87         end_usage = {
     88             'user': 1800,
     89             'nice': 20,
     90             'system': 180,
     91             'idle': 13000,
     92             'iowait': 2000,
     93             'irq': 200,
     94             'softirq': 100,
     95             'steal': 300,
     96             'guest': 340,
     97             'guest_nice': 60
     98         }
     99         usage = utils.compute_active_cpu_time(start_usage, end_usage)
    100         self.assertAlmostEqual(usage, 0.25)
    101 
    102     def test_compute_active_cpu_time_idle(self):
    103         start_usage = {
    104             'user': 900,
    105             'nice': 10,
    106             'system': 90,
    107             'idle': 10000,
    108             'iowait': 500,
    109             'irq': 100,
    110             'softirq': 50,
    111             'steal': 150,
    112             'guest': 170,
    113             'guest_nice':30
    114         }
    115         end_usage = {
    116             'user': 900,
    117             'nice': 10,
    118             'system': 90,
    119             'idle': 11000,
    120             'iowait': 1000,
    121             'irq': 100,
    122             'softirq': 50,
    123             'steal': 150,
    124             'guest': 170,
    125             'guest_nice':30
    126         }
    127         usage = utils.compute_active_cpu_time(start_usage, end_usage)
    128         self.assertAlmostEqual(usage, 0)
    129 
    130     def test_get_mem_total(self):
    131         self.fake_file_text = ('MemTotal:  2048000 kB\n'
    132                                'MemFree:  307200 kB\n'
    133                                'Buffers:  102400 kB\n'
    134                                'Cached:   204800 kB\n')
    135         self.assertAlmostEqual(utils.get_mem_total(), 2000)
    136 
    137     def test_get_mem_free(self):
    138         self.fake_file_text = ('MemTotal:  2048000 kB\n'
    139                                'MemFree:  307200 kB\n'
    140                                'Buffers:  102400 kB\n'
    141                                'Cached:   204800 kB\n')
    142         self.assertAlmostEqual(utils.get_mem_free(), 300)
    143 
    144     def test_get_mem_free_plus_buffers_and_cached(self):
    145         self.fake_file_text = ('MemTotal:  2048000 kB\n'
    146                                'MemFree:  307200 kB\n'
    147                                'Buffers:  102400 kB\n'
    148                                'Cached:   204800 kB\n')
    149         self.assertAlmostEqual(utils.get_mem_free_plus_buffers_and_cached(),
    150                                600)
    151 
    152     def test_get_meminfo(self):
    153         self.fake_file_text = ('MemTotal:      2048000 kB\n'
    154                                'MemFree:        307200 kB\n'
    155                                'Buffers:        102400 kB\n'
    156                                'Cached:         204800 kB\n'
    157                                'Active(anon):   409600 kB')
    158         meminfo = utils.get_meminfo()
    159         self.assertEqual(meminfo.MemTotal, 2048000)
    160         self.assertEqual(meminfo.Active_anon, 409600)
    161 
    162     def test_get_num_allocated_file_handles(self):
    163         self.fake_file_text = '123 0 456\n'
    164         self.assertEqual(utils.get_num_allocated_file_handles(), 123)
    165 
    166     @mock.patch('autotest_lib.client.common_lib.utils.system_output')
    167     def test_get_storage_statistics(self, system_output_mock):
    168         system_output_mock.return_value = _IOSTAT_OUTPUT
    169         statistics = utils.get_storage_statistics()
    170         self.assertEqual({
    171             'read_kb': 665582.0,
    172             'written_kb_per_s': 292.4,
    173             'read_kb_per_s': 10.33,
    174             'transfers_per_s': 4.45,
    175             'written_kb': 188458.0,
    176         }, statistics)
    177