1427c7b23118bf30175ef14327459a4db0adc381cGwendal Grignou#!/usr/bin/python
2427c7b23118bf30175ef14327459a4db0adc381cGwendal Grignou
31ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson__author__ = "kerl@google.com, gwendal@google.com (Gwendal Grignou)"
4427c7b23118bf30175ef14327459a4db0adc381cGwendal Grignou
51ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandssonimport io
6427c7b23118bf30175ef14327459a4db0adc381cGwendal Grignouimport unittest
7427c7b23118bf30175ef14327459a4db0adc381cGwendal Grignou
8427c7b23118bf30175ef14327459a4db0adc381cGwendal Grignoufrom autotest_lib.client.bin import utils
9427c7b23118bf30175ef14327459a4db0adc381cGwendal Grignou
10427c7b23118bf30175ef14327459a4db0adc381cGwendal Grignouclass TestUtils(unittest.TestCase):
11427c7b23118bf30175ef14327459a4db0adc381cGwendal Grignou    """Test utils functions."""
12427c7b23118bf30175ef14327459a4db0adc381cGwendal Grignou
131ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson    # Test methods, disable missing-docstring
141ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson    # pylint: disable=missing-docstring
151ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson    def setUp(self):
161ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson        utils._open_file = self.fake_open
171ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson        # Files opened with utils._open_file will contain this string.
181ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson        self.fake_file_text = ''
191ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson
201ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson    def fake_open(self, path):
211ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson        # Use BytesIO instead of StringIO to support with statements.
221ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson        return io.BytesIO(bytes(self.fake_file_text))
23427c7b23118bf30175ef14327459a4db0adc381cGwendal Grignou
24427c7b23118bf30175ef14327459a4db0adc381cGwendal Grignou    def test_concat_partition(self):
25427c7b23118bf30175ef14327459a4db0adc381cGwendal Grignou        self.assertEquals("nvme0n1p3", utils.concat_partition("nvme0n1", 3))
26427c7b23118bf30175ef14327459a4db0adc381cGwendal Grignou        self.assertEquals("mmcblk1p3", utils.concat_partition("mmcblk1", 3))
27427c7b23118bf30175ef14327459a4db0adc381cGwendal Grignou        self.assertEquals("sda3", utils.concat_partition("sda", 3))
28427c7b23118bf30175ef14327459a4db0adc381cGwendal Grignou
291ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson    # The columns in /proc/stat are:
301ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson    # user nice system idle iowait irq softirq steal guest guest_nice
311ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson    #
321ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson    # Although older kernel versions might not contain all of them.
331ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson    # Unit is 1/100ths of a second.
341ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson    def test_get_cpu_usage(self):
3582b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson        self.fake_file_text = 'cpu 254544 9 254768 2859878 1 2 3 4 5 6\n'
3682b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson        usage = utils.get_cpu_usage()
3782b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson        self.assertEquals({
3882b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'user': 254544,
3982b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'nice': 9,
4082b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'system': 254768,
4182b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'idle': 2859878,
4282b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'iowait': 1,
4382b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'irq': 2,
4482b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'softirq': 3,
4582b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'steal': 4,
4682b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'guest': 5,
4782b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'guest_nice': 6
4882b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson        }, usage)
4982b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson
5082b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson    def test_get_cpu_missing_columns(self):
511ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson        self.fake_file_text = 'cpu 254544 9 254768 2859878\n'
521ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson        usage = utils.get_cpu_usage()
531ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson        self.assertEquals({
541ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson            'user': 254544,
551ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson            'nice': 9,
561ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson            'system': 254768,
571ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson            'idle': 2859878,
5882b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'iowait': 0,
5982b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'irq': 0,
6082b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'softirq': 0,
6182b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'steal': 0,
6282b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'guest': 0,
6382b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'guest_nice': 0
641ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson        }, usage)
651ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson
661ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson    def test_compute_active_cpu_time(self):
671ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson        start_usage = {
681ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson            'user': 900,
691ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson            'nice': 10,
701ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson            'system': 90,
711ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson            'idle': 10000,
7282b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'iowait': 500,
7382b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'irq': 100,
7482b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'softirq': 50,
7582b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'steal': 150,
7682b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'guest': 170,
7782b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'guest_nice': 30
781ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson        }
791ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson        end_usage = {
801ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson            'user': 1800,
811ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson            'nice': 20,
821ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson            'system': 180,
8382b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'idle': 13000,
8482b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'iowait': 2000,
8582b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'irq': 200,
8682b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'softirq': 100,
8782b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'steal': 300,
8882b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'guest': 340,
8982b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'guest_nice': 60
901ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson        }
911ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson        usage = utils.compute_active_cpu_time(start_usage, end_usage)
92a69288546513f3166bd22d7aacebea410e44501aKristoffer Erlandsson        self.assertAlmostEqual(usage, 0.25)
931ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson
941ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson    def test_compute_active_cpu_time_idle(self):
951ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson        start_usage = {
961ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson            'user': 900,
971ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson            'nice': 10,
981ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson            'system': 90,
991ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson            'idle': 10000,
10082b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'iowait': 500,
10182b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'irq': 100,
10282b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'softirq': 50,
10382b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'steal': 150,
10482b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'guest': 170,
10582b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'guest_nice':30
1061ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson        }
1071ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson        end_usage = {
1081ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson            'user': 900,
1091ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson            'nice': 10,
1101ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson            'system': 90,
1111ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson            'idle': 11000,
11282b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'iowait': 1000,
11382b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'irq': 100,
11482b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'softirq': 50,
11582b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'steal': 150,
11682b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'guest': 170,
11782b9f3251c8e01084de4cb1ed563603e6910e63dKristoffer Erlandsson            'guest_nice':30
1181ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson        }
1191ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson        usage = utils.compute_active_cpu_time(start_usage, end_usage)
120a69288546513f3166bd22d7aacebea410e44501aKristoffer Erlandsson        self.assertAlmostEqual(usage, 0)
1211ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson
1221ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson    def test_get_mem_total(self):
123b84da2b8acfecce1baf44ab18b6bb2a2bf75bdb2Kristoffer Erlandsson        self.fake_file_text = ('MemTotal:  2048000 kB\n'
124b84da2b8acfecce1baf44ab18b6bb2a2bf75bdb2Kristoffer Erlandsson                               'MemFree:  307200 kB\n'
125b84da2b8acfecce1baf44ab18b6bb2a2bf75bdb2Kristoffer Erlandsson                               'Buffers:  102400 kB\n'
126b84da2b8acfecce1baf44ab18b6bb2a2bf75bdb2Kristoffer Erlandsson                               'Cached:   204800 kB\n')
127a69288546513f3166bd22d7aacebea410e44501aKristoffer Erlandsson        self.assertAlmostEqual(utils.get_mem_total(), 2000)
1281ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson
1291ad7db01ec8c8a9de1e0aecd792320ecce289d3bKristoffer Erlandsson    def test_get_mem_free(self):
130b84da2b8acfecce1baf44ab18b6bb2a2bf75bdb2Kristoffer Erlandsson        self.fake_file_text = ('MemTotal:  2048000 kB\n'
131b84da2b8acfecce1baf44ab18b6bb2a2bf75bdb2Kristoffer Erlandsson                               'MemFree:  307200 kB\n'
132b84da2b8acfecce1baf44ab18b6bb2a2bf75bdb2Kristoffer Erlandsson                               'Buffers:  102400 kB\n'
133b84da2b8acfecce1baf44ab18b6bb2a2bf75bdb2Kristoffer Erlandsson                               'Cached:   204800 kB\n')
134a69288546513f3166bd22d7aacebea410e44501aKristoffer Erlandsson        self.assertAlmostEqual(utils.get_mem_free(), 300)
135b84da2b8acfecce1baf44ab18b6bb2a2bf75bdb2Kristoffer Erlandsson
136b84da2b8acfecce1baf44ab18b6bb2a2bf75bdb2Kristoffer Erlandsson    def test_get_mem_free_plus_buffers_and_cached(self):
137b84da2b8acfecce1baf44ab18b6bb2a2bf75bdb2Kristoffer Erlandsson        self.fake_file_text = ('MemTotal:  2048000 kB\n'
138b84da2b8acfecce1baf44ab18b6bb2a2bf75bdb2Kristoffer Erlandsson                               'MemFree:  307200 kB\n'
139b84da2b8acfecce1baf44ab18b6bb2a2bf75bdb2Kristoffer Erlandsson                               'Buffers:  102400 kB\n'
140b84da2b8acfecce1baf44ab18b6bb2a2bf75bdb2Kristoffer Erlandsson                               'Cached:   204800 kB\n')
141a69288546513f3166bd22d7aacebea410e44501aKristoffer Erlandsson        self.assertAlmostEqual(utils.get_mem_free_plus_buffers_and_cached(),
142a69288546513f3166bd22d7aacebea410e44501aKristoffer Erlandsson                               600)
143427c7b23118bf30175ef14327459a4db0adc381cGwendal Grignou
14458776682f8d5bf8d0cf0a87d18b70fb09a43e8b7Kristoffer Erlandsson    def test_get_num_allocated_file_handles(self):
14558776682f8d5bf8d0cf0a87d18b70fb09a43e8b7Kristoffer Erlandsson        self.fake_file_text = '123 0 456\n'
14658776682f8d5bf8d0cf0a87d18b70fb09a43e8b7Kristoffer Erlandsson        self.assertEqual(utils.get_num_allocated_file_handles(), 123)
14758776682f8d5bf8d0cf0a87d18b70fb09a43e8b7Kristoffer Erlandsson
148