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