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_collector(self): 68 collector = system_metrics_collector.SystemMetricsCollector( 69 FakeSystemFacade(), [TestMetric()]) 70 collector.collect_snapshot() 71 d = {} 72 def _write_func(**kwargs): 73 d.update(kwargs) 74 collector.write_metrics(_write_func) 75 self.assertEquals('test_description', d['description']) 76 self.assertEquals([1], d['value']) 77 self.assertEquals(False, d['higher_is_better']) 78 self.assertEquals('test_unit', d['units']) 79 80 def test_collector_default_set_of_metrics_no_error(self): 81 # Only verify no errors are thrown when collecting using 82 # the default metric set. 83 collector = system_metrics_collector.SystemMetricsCollector( 84 FakeSystemFacade()) 85 collector.pre_collect() 86 collector.collect_snapshot() 87 collector.collect_snapshot() 88 collector.post_collect() 89 collector.write_metrics(lambda **kwargs: None) 90 91 def test_aggregate_metric_zero_samples(self): 92 metric = TestAggregateMetric() 93 self.assertEqual(metric.values, []) 94 95 def test_aggregate_metric_one_sample(self): 96 metric = TestAggregateMetric() 97 metric.collect_metric() 98 self.assertEqual(metric.values, 1) 99 100 def test_aggregate_metric_many_samples(self): 101 metric = TestAggregateMetric() 102 metric.collect_metric() 103 metric.value = 2 104 metric.collect_metric() 105 metric.value = 3 106 metric.collect_metric() 107 self.assertEqual(metric.values, 3) 108 109 def test_aggregate_metric_from_metric_one_sample(self): 110 test_metric = TestMetric() 111 aggregate_metric = LastElementMetric.from_metric(test_metric) 112 test_metric.collect_metric() 113 aggregate_metric.collect_metric() 114 self.assertEqual(test_metric.values, [1]) 115 self.assertEqual(aggregate_metric.values, 1) 116 117 def test_aggregate_metric_from_metric_many_samples(self): 118 test_metric = TestMetric() 119 aggregate_metric = LastElementMetric.from_metric(test_metric) 120 test_metric.collect_metric() 121 aggregate_metric.collect_metric() 122 test_metric.value = 2 123 test_metric.collect_metric() 124 aggregate_metric.collect_metric() 125 test_metric.value = 3 126 test_metric.collect_metric() 127 aggregate_metric.collect_metric() 128 self.assertEqual(test_metric.values, [1, 2, 3]) 129 self.assertEqual(aggregate_metric.values, 3) 130 131 def test_peak_metric_description(self): 132 metric = system_metrics_collector.PeakMetric('foo') 133 self.assertEqual(metric.description, 'peak_foo') 134 135 def test_peak_metric_many_samples(self): 136 metric = TestPeakMetric() 137 metric.collect_metric() 138 metric.value = 2 139 metric.collect_metric() 140 metric.value = 0 141 metric.collect_metric() 142 self.assertEqual(metric.values, 2) 143 144 def test_peak_metric_from_metric_many_samples(self): 145 test_metric = TestMetric() 146 peak_metric = system_metrics_collector.PeakMetric.from_metric( 147 test_metric) 148 test_metric.collect_metric() 149 peak_metric.collect_metric() 150 test_metric.value = 2 151 test_metric.collect_metric() 152 peak_metric.collect_metric() 153 test_metric.value = 0 154 test_metric.collect_metric() 155 peak_metric.collect_metric() 156 self.assertEqual(peak_metric.values, 2) 157 158 def test_sum_metric_description(self): 159 metric = system_metrics_collector.SumMetric('foo') 160 self.assertEqual(metric.description, 'sum_foo') 161 162 def test_sum_metric_many_samples(self): 163 metric = TestSumMetric() 164 metric.collect_metric() 165 metric.value = 2 166 metric.collect_metric() 167 metric.value = 3 168 metric.collect_metric() 169 self.assertEqual(metric.values, 6) 170 171 def test_sum_metric_from_metric_many_samples(self): 172 test_metric = TestMetric() 173 sum_metric = system_metrics_collector.SumMetric.from_metric( 174 test_metric) 175 test_metric.collect_metric() 176 sum_metric.collect_metric() 177 test_metric.value = 40 178 test_metric.collect_metric() 179 sum_metric.collect_metric() 180 test_metric.value = 1 181 test_metric.collect_metric() 182 sum_metric.collect_metric() 183 self.assertEqual(sum_metric.values, 42) 184 185class FakeSystemFacade(object): 186 def __init__(self): 187 self.mem_total_mb = 1000.0 188 self.mem_free_mb = 400.0 189 self.file_handles = 11 190 self.active_cpu_time = 0.4 191 self.current_temperature_max = 43 192 self.storage_statistics = { 193 'transfers_per_s': 4.45, 194 'read_kb_per_s': 10.33, 195 'written_kb_per_s': 292.40, 196 'read_kb': 665582, 197 'written_kb': 188458, 198 } 199 self.bg_worker_output = '' 200 201 def get_mem_total(self): 202 return self.mem_total_mb 203 204 def get_mem_free_plus_buffers_and_cached(self): 205 return self.mem_free_mb 206 207 def get_num_allocated_file_handles(self): 208 return self.file_handles 209 210 def get_cpu_usage(self): 211 return {} 212 213 def compute_active_cpu_time(self, last_usage, current_usage): 214 return self.active_cpu_time 215 216 def get_current_temperature_max(self): 217 return self.current_temperature_max 218 219 def get_storage_statistics(self, device=None): 220 return self.storage_statistics 221 222 def start_bg_worker(self, command): 223 pass 224 225 def get_and_discard_bg_worker_output(self): 226 return self.bg_worker_output 227 228 def stop_bg_worker(self): 229 pass 230 231class TestMetric(system_metrics_collector.Metric): 232 def __init__(self): 233 super(TestMetric, self).__init__( 234 'test_description', units='test_unit') 235 self.value = 1 236 237 def collect_metric(self): 238 self._store_sample(self.value) 239 240class LastElementMetric(system_metrics_collector.Metric): 241 def _aggregate(self, x): 242 return x[-1] 243 244class TestAggregateMetric(TestMetric, LastElementMetric): 245 pass 246 247class TestPeakMetric(TestMetric, system_metrics_collector.PeakMetric): 248 pass 249 250class TestSumMetric(TestMetric, system_metrics_collector.SumMetric): 251 pass 252