1from autotest_lib.client.common_lib.cros import system_metrics_collector 2 3import unittest 4 5_FATRACE_OUTPUT_1 = ( 6 'metrics_daemon(2276): W /var/log/vmlog/vmlog.20190221-005447\n' 7 'powerd(612): CW /var/lib/metrics/uma-events\n' 8 'powerd(612): CWO /var/lib/metrics/uma-events\n') 9 10_FATRACE_OUTPUT_2 = ( 11 'chrome(13096): CWO /home/chronos/.com.google.Chrome.PMfcCO\n' 12 'chrome(13096): W /home/chronos/.com.google.Chrome.PMfcCO\n' 13 'chrome(13096): CW /home/chronos/Local State\n' 14 'metrics_daemon(2276): W /var/log/vmlog/vmlog.20190221-005447\n') 15 16# pylint: disable=missing-docstring 17class TestSystemMetricsCollector(unittest.TestCase): 18 """ 19 Tests for the system_metrics_collector module. 20 """ 21 def test_mem_usage_metric(self): 22 metric = system_metrics_collector.MemUsageMetric(FakeSystemFacade()) 23 metric.collect_metric() 24 self.assertAlmostEqual(60, metric.values[0]) 25 26 def test_file_handles_metric(self): 27 metric = system_metrics_collector.AllocatedFileHandlesMetric( 28 FakeSystemFacade()) 29 metric.collect_metric() 30 self.assertEqual(11, metric.values[0]) 31 32 def test_cpu_usage_metric(self): 33 system_facade = FakeSystemFacade() 34 metric = system_metrics_collector.CpuUsageMetric(system_facade) 35 metric.pre_collect() 36 system_facade.active_cpu_time += 0.1 37 metric.collect_metric() 38 self.assertAlmostEqual(50, metric.values[0]) 39 40 def test_tempature_metric(self): 41 metric = system_metrics_collector.TemperatureMetric(FakeSystemFacade()) 42 metric.collect_metric() 43 self.assertAlmostEqual(43, metric.values[0]) 44 45 def test_storage_written_amount_metric(self): 46 system_facade = FakeSystemFacade() 47 metric = system_metrics_collector.StorageWrittenAmountMetric( 48 system_facade) 49 metric.pre_collect() 50 system_facade.storage_statistics['written_kb'] += 1337 51 metric.collect_metric() 52 self.assertEqual(1337, metric.values[0]) 53 54 def test_storage_written_count_metric(self): 55 system_facade = FakeSystemFacade() 56 metric = system_metrics_collector.StorageWrittenCountMetric( 57 system_facade) 58 metric.pre_collect() 59 system_facade.bg_worker_output = _FATRACE_OUTPUT_1 60 metric.collect_metric() 61 system_facade.bg_worker_output = _FATRACE_OUTPUT_2 62 metric.collect_metric() 63 metric.post_collect() 64 self.assertEqual(3, metric.values[0]) 65 self.assertEqual(4, metric.values[1]) 66 67 def test_energy_usage_metric(self): 68 metric = system_metrics_collector.EnergyUsageMetric(FakeSystemFacade()) 69 metric.collect_metric() 70 self.assertEqual(1, metric.values) 71 metric.collect_metric() 72 self.assertEqual(2, metric.values) 73 metric.collect_metric() 74 self.assertEqual(3, metric.values) 75 76 def test_collector(self): 77 collector = system_metrics_collector.SystemMetricsCollector( 78 FakeSystemFacade(), [TestMetric()]) 79 collector.collect_snapshot() 80 d = {} 81 def _write_func(**kwargs): 82 d.update(kwargs) 83 collector.write_metrics(_write_func) 84 self.assertEquals('test_description', d['description']) 85 self.assertEquals([1], d['value']) 86 self.assertEquals(False, d['higher_is_better']) 87 self.assertEquals('test_unit', d['units']) 88 89 def test_collector_default_set_of_metrics_no_error(self): 90 # Only verify no errors are thrown when collecting using 91 # the default metric set. 92 collector = system_metrics_collector.SystemMetricsCollector( 93 FakeSystemFacade()) 94 collector.pre_collect() 95 collector.collect_snapshot() 96 collector.collect_snapshot() 97 collector.post_collect() 98 collector.write_metrics(lambda **kwargs: None) 99 100 def test_aggregate_metric_zero_samples(self): 101 metric = TestAggregateMetric() 102 self.assertEqual(metric.values, []) 103 104 def test_aggregate_metric_one_sample(self): 105 metric = TestAggregateMetric() 106 metric.collect_metric() 107 self.assertEqual(metric.values, 1) 108 109 def test_aggregate_metric_many_samples(self): 110 metric = TestAggregateMetric() 111 metric.collect_metric() 112 metric.value = 2 113 metric.collect_metric() 114 metric.value = 3 115 metric.collect_metric() 116 self.assertEqual(metric.values, 3) 117 118 def test_aggregate_metric_from_metric_one_sample(self): 119 test_metric = TestMetric() 120 aggregate_metric = LastElementMetric.from_metric(test_metric) 121 test_metric.collect_metric() 122 aggregate_metric.collect_metric() 123 self.assertEqual(test_metric.values, [1]) 124 self.assertEqual(aggregate_metric.values, 1) 125 126 def test_aggregate_metric_from_metric_many_samples(self): 127 test_metric = TestMetric() 128 aggregate_metric = LastElementMetric.from_metric(test_metric) 129 test_metric.collect_metric() 130 aggregate_metric.collect_metric() 131 test_metric.value = 2 132 test_metric.collect_metric() 133 aggregate_metric.collect_metric() 134 test_metric.value = 3 135 test_metric.collect_metric() 136 aggregate_metric.collect_metric() 137 self.assertEqual(test_metric.values, [1, 2, 3]) 138 self.assertEqual(aggregate_metric.values, 3) 139 140 def test_peak_metric_description(self): 141 metric = system_metrics_collector.PeakMetric('foo') 142 self.assertEqual(metric.description, 'peak_foo') 143 144 def test_peak_metric_many_samples(self): 145 metric = TestPeakMetric() 146 metric.collect_metric() 147 metric.value = 2 148 metric.collect_metric() 149 metric.value = 0 150 metric.collect_metric() 151 self.assertEqual(metric.values, 2) 152 153 def test_peak_metric_from_metric_many_samples(self): 154 test_metric = TestMetric() 155 peak_metric = system_metrics_collector.PeakMetric.from_metric( 156 test_metric) 157 test_metric.collect_metric() 158 peak_metric.collect_metric() 159 test_metric.value = 2 160 test_metric.collect_metric() 161 peak_metric.collect_metric() 162 test_metric.value = 0 163 test_metric.collect_metric() 164 peak_metric.collect_metric() 165 self.assertEqual(peak_metric.values, 2) 166 167 def test_sum_metric_description(self): 168 metric = system_metrics_collector.SumMetric('foo') 169 self.assertEqual(metric.description, 'sum_foo') 170 171 def test_sum_metric_many_samples(self): 172 metric = TestSumMetric() 173 metric.collect_metric() 174 metric.value = 2 175 metric.collect_metric() 176 metric.value = 3 177 metric.collect_metric() 178 self.assertEqual(metric.values, 6) 179 180 def test_sum_metric_from_metric_many_samples(self): 181 test_metric = TestMetric() 182 sum_metric = system_metrics_collector.SumMetric.from_metric( 183 test_metric) 184 test_metric.collect_metric() 185 sum_metric.collect_metric() 186 test_metric.value = 40 187 test_metric.collect_metric() 188 sum_metric.collect_metric() 189 test_metric.value = 1 190 test_metric.collect_metric() 191 sum_metric.collect_metric() 192 self.assertEqual(sum_metric.values, 42) 193 194class FakeSystemFacade(object): 195 def __init__(self): 196 self.mem_total_mb = 1000.0 197 self.mem_free_mb = 400.0 198 self.file_handles = 11 199 self.active_cpu_time = 0.4 200 self.current_temperature_max = 43 201 self.storage_statistics = { 202 'transfers_per_s': 4.45, 203 'read_kb_per_s': 10.33, 204 'written_kb_per_s': 292.40, 205 'read_kb': 665582, 206 'written_kb': 188458, 207 } 208 self.bg_worker_output = '' 209 self.energy_usage = 0 210 211 def get_mem_total(self): 212 return self.mem_total_mb 213 214 def get_mem_free_plus_buffers_and_cached(self): 215 return self.mem_free_mb 216 217 def get_num_allocated_file_handles(self): 218 return self.file_handles 219 220 def get_cpu_usage(self): 221 return {} 222 223 def compute_active_cpu_time(self, last_usage, current_usage): 224 return self.active_cpu_time 225 226 def get_current_temperature_max(self): 227 return self.current_temperature_max 228 229 def get_storage_statistics(self, device=None): 230 return self.storage_statistics 231 232 def start_bg_worker(self, command): 233 pass 234 235 def get_and_discard_bg_worker_output(self): 236 return self.bg_worker_output 237 238 def stop_bg_worker(self): 239 pass 240 241 def get_energy_usage(self): 242 self.energy_usage += 1 243 return str(self.energy_usage) 244 245 246class TestMetric(system_metrics_collector.Metric): 247 def __init__(self): 248 super(TestMetric, self).__init__( 249 'test_description', units='test_unit') 250 self.value = 1 251 252 def collect_metric(self): 253 self._store_sample(self.value) 254 255class LastElementMetric(system_metrics_collector.Metric): 256 def _aggregate(self, x): 257 return x[-1] 258 259class TestAggregateMetric(TestMetric, LastElementMetric): 260 pass 261 262class TestPeakMetric(TestMetric, system_metrics_collector.PeakMetric): 263 pass 264 265class TestSumMetric(TestMetric, system_metrics_collector.SumMetric): 266 pass 267