#!/usr/bin/python __author__ = "kerl@google.com, gwendal@google.com (Gwendal Grignou)" import io import mock import unittest from autotest_lib.client.bin import utils _IOSTAT_OUTPUT = ( 'Linux 3.8.11 (localhost) 02/19/19 _x86_64_ (4 CPU)\n' '\n' 'Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn\n' 'ALL 4.45 10.33 292.40 665582 188458\n' '\n') class TestUtils(unittest.TestCase): """Test utils functions.""" # Test methods, disable missing-docstring # pylint: disable=missing-docstring def setUp(self): utils._open_file = self.fake_open # Files opened with utils._open_file will contain this string. self.fake_file_text = '' def fake_open(self, path): # Use BytesIO instead of StringIO to support with statements. return io.BytesIO(bytes(self.fake_file_text)) def test_concat_partition(self): self.assertEquals("nvme0n1p3", utils.concat_partition("nvme0n1", 3)) self.assertEquals("mmcblk1p3", utils.concat_partition("mmcblk1", 3)) self.assertEquals("sda3", utils.concat_partition("sda", 3)) # The columns in /proc/stat are: # user nice system idle iowait irq softirq steal guest guest_nice # # Although older kernel versions might not contain all of them. # Unit is 1/100ths of a second. def test_get_cpu_usage(self): self.fake_file_text = 'cpu 254544 9 254768 2859878 1 2 3 4 5 6\n' usage = utils.get_cpu_usage() self.assertEquals({ 'user': 254544, 'nice': 9, 'system': 254768, 'idle': 2859878, 'iowait': 1, 'irq': 2, 'softirq': 3, 'steal': 4, 'guest': 5, 'guest_nice': 6 }, usage) def test_get_cpu_missing_columns(self): self.fake_file_text = 'cpu 254544 9 254768 2859878\n' usage = utils.get_cpu_usage() self.assertEquals({ 'user': 254544, 'nice': 9, 'system': 254768, 'idle': 2859878, 'iowait': 0, 'irq': 0, 'softirq': 0, 'steal': 0, 'guest': 0, 'guest_nice': 0 }, usage) def test_compute_active_cpu_time(self): start_usage = { 'user': 900, 'nice': 10, 'system': 90, 'idle': 10000, 'iowait': 500, 'irq': 100, 'softirq': 50, 'steal': 150, 'guest': 170, 'guest_nice': 30 } end_usage = { 'user': 1800, 'nice': 20, 'system': 180, 'idle': 13000, 'iowait': 2000, 'irq': 200, 'softirq': 100, 'steal': 300, 'guest': 340, 'guest_nice': 60 } usage = utils.compute_active_cpu_time(start_usage, end_usage) self.assertAlmostEqual(usage, 0.25) def test_compute_active_cpu_time_idle(self): start_usage = { 'user': 900, 'nice': 10, 'system': 90, 'idle': 10000, 'iowait': 500, 'irq': 100, 'softirq': 50, 'steal': 150, 'guest': 170, 'guest_nice':30 } end_usage = { 'user': 900, 'nice': 10, 'system': 90, 'idle': 11000, 'iowait': 1000, 'irq': 100, 'softirq': 50, 'steal': 150, 'guest': 170, 'guest_nice':30 } usage = utils.compute_active_cpu_time(start_usage, end_usage) self.assertAlmostEqual(usage, 0) def test_get_mem_total(self): self.fake_file_text = ('MemTotal: 2048000 kB\n' 'MemFree: 307200 kB\n' 'Buffers: 102400 kB\n' 'Cached: 204800 kB\n') self.assertAlmostEqual(utils.get_mem_total(), 2000) def test_get_mem_free(self): self.fake_file_text = ('MemTotal: 2048000 kB\n' 'MemFree: 307200 kB\n' 'Buffers: 102400 kB\n' 'Cached: 204800 kB\n') self.assertAlmostEqual(utils.get_mem_free(), 300) def test_get_mem_free_plus_buffers_and_cached(self): self.fake_file_text = ('MemTotal: 2048000 kB\n' 'MemFree: 307200 kB\n' 'Buffers: 102400 kB\n' 'Cached: 204800 kB\n') self.assertAlmostEqual(utils.get_mem_free_plus_buffers_and_cached(), 600) def test_get_meminfo(self): self.fake_file_text = ('MemTotal: 2048000 kB\n' 'MemFree: 307200 kB\n' 'Buffers: 102400 kB\n' 'Cached: 204800 kB\n' 'Active(anon): 409600 kB') meminfo = utils.get_meminfo() self.assertEqual(meminfo.MemTotal, 2048000) self.assertEqual(meminfo.Active_anon, 409600) def test_get_num_allocated_file_handles(self): self.fake_file_text = '123 0 456\n' self.assertEqual(utils.get_num_allocated_file_handles(), 123) @mock.patch('autotest_lib.client.common_lib.utils.system_output') def test_get_storage_statistics(self, system_output_mock): system_output_mock.return_value = _IOSTAT_OUTPUT statistics = utils.get_storage_statistics() self.assertEqual({ 'read_kb': 665582.0, 'written_kb_per_s': 292.4, 'read_kb_per_s': 10.33, 'transfers_per_s': 4.45, 'written_kb': 188458.0, }, statistics)