blob: 8cb999cba886c27a14592a4b1fb079f5e3bbc227 [file] [log] [blame]
from autotest_lib.client.common_lib.cros import system_metrics_collector
import unittest
_FATRACE_OUTPUT_1 = (
'metrics_daemon(2276): W /var/log/vmlog/vmlog.20190221-005447\n'
'powerd(612): CW /var/lib/metrics/uma-events\n'
'powerd(612): CWO /var/lib/metrics/uma-events\n')
_FATRACE_OUTPUT_2 = (
'chrome(13096): CWO /home/chronos/.com.google.Chrome.PMfcCO\n'
'chrome(13096): W /home/chronos/.com.google.Chrome.PMfcCO\n'
'chrome(13096): CW /home/chronos/Local State\n'
'metrics_daemon(2276): W /var/log/vmlog/vmlog.20190221-005447\n')
# pylint: disable=missing-docstring
class TestSystemMetricsCollector(unittest.TestCase):
"""
Tests for the system_metrics_collector module.
"""
def test_mem_usage_metric(self):
metric = system_metrics_collector.MemUsageMetric(FakeSystemFacade())
metric.collect_metric()
self.assertAlmostEqual(60, metric.values[0])
def test_file_handles_metric(self):
metric = system_metrics_collector.AllocatedFileHandlesMetric(
FakeSystemFacade())
metric.collect_metric()
self.assertEqual(11, metric.values[0])
def test_cpu_usage_metric(self):
system_facade = FakeSystemFacade()
metric = system_metrics_collector.CpuUsageMetric(system_facade)
metric.pre_collect()
system_facade.active_cpu_time += 0.1
metric.collect_metric()
self.assertAlmostEqual(50, metric.values[0])
def test_tempature_metric(self):
metric = system_metrics_collector.TemperatureMetric(FakeSystemFacade())
metric.collect_metric()
self.assertAlmostEqual(43, metric.values[0])
def test_storage_written_amount_metric(self):
system_facade = FakeSystemFacade()
metric = system_metrics_collector.StorageWrittenAmountMetric(
system_facade)
metric.pre_collect()
system_facade.storage_statistics['written_kb'] += 1337
metric.collect_metric()
self.assertEqual(1337, metric.values[0])
def test_storage_written_count_metric(self):
system_facade = FakeSystemFacade()
metric = system_metrics_collector.StorageWrittenCountMetric(
system_facade)
metric.pre_collect()
system_facade.bg_worker_output = _FATRACE_OUTPUT_1
metric.collect_metric()
system_facade.bg_worker_output = _FATRACE_OUTPUT_2
metric.collect_metric()
metric.post_collect()
self.assertEqual(3, metric.values[0])
self.assertEqual(4, metric.values[1])
def test_collector(self):
collector = system_metrics_collector.SystemMetricsCollector(
FakeSystemFacade(), [TestMetric()])
collector.collect_snapshot()
d = {}
def _write_func(**kwargs):
d.update(kwargs)
collector.write_metrics(_write_func)
self.assertEquals('test_description', d['description'])
self.assertEquals([1], d['value'])
self.assertEquals(False, d['higher_is_better'])
self.assertEquals('test_unit', d['units'])
def test_collector_default_set_of_metrics_no_error(self):
# Only verify no errors are thrown when collecting using
# the default metric set.
collector = system_metrics_collector.SystemMetricsCollector(
FakeSystemFacade())
collector.pre_collect()
collector.collect_snapshot()
collector.collect_snapshot()
collector.post_collect()
collector.write_metrics(lambda **kwargs: None)
def test_aggregate_metric_zero_samples(self):
metric = TestAggregateMetric()
self.assertEqual(metric.values, [])
def test_aggregate_metric_one_sample(self):
metric = TestAggregateMetric()
metric.collect_metric()
self.assertEqual(metric.values, 1)
def test_aggregate_metric_many_samples(self):
metric = TestAggregateMetric()
metric.collect_metric()
metric.value = 2
metric.collect_metric()
metric.value = 3
metric.collect_metric()
self.assertEqual(metric.values, 3)
def test_aggregate_metric_from_metric_one_sample(self):
test_metric = TestMetric()
aggregate_metric = LastElementMetric.from_metric(test_metric)
test_metric.collect_metric()
aggregate_metric.collect_metric()
self.assertEqual(test_metric.values, [1])
self.assertEqual(aggregate_metric.values, 1)
def test_aggregate_metric_from_metric_many_samples(self):
test_metric = TestMetric()
aggregate_metric = LastElementMetric.from_metric(test_metric)
test_metric.collect_metric()
aggregate_metric.collect_metric()
test_metric.value = 2
test_metric.collect_metric()
aggregate_metric.collect_metric()
test_metric.value = 3
test_metric.collect_metric()
aggregate_metric.collect_metric()
self.assertEqual(test_metric.values, [1, 2, 3])
self.assertEqual(aggregate_metric.values, 3)
def test_peak_metric_description(self):
metric = system_metrics_collector.PeakMetric('foo')
self.assertEqual(metric.description, 'peak_foo')
def test_peak_metric_many_samples(self):
metric = TestPeakMetric()
metric.collect_metric()
metric.value = 2
metric.collect_metric()
metric.value = 0
metric.collect_metric()
self.assertEqual(metric.values, 2)
def test_peak_metric_from_metric_many_samples(self):
test_metric = TestMetric()
peak_metric = system_metrics_collector.PeakMetric.from_metric(
test_metric)
test_metric.collect_metric()
peak_metric.collect_metric()
test_metric.value = 2
test_metric.collect_metric()
peak_metric.collect_metric()
test_metric.value = 0
test_metric.collect_metric()
peak_metric.collect_metric()
self.assertEqual(peak_metric.values, 2)
def test_sum_metric_description(self):
metric = system_metrics_collector.SumMetric('foo')
self.assertEqual(metric.description, 'sum_foo')
def test_sum_metric_many_samples(self):
metric = TestSumMetric()
metric.collect_metric()
metric.value = 2
metric.collect_metric()
metric.value = 3
metric.collect_metric()
self.assertEqual(metric.values, 6)
def test_sum_metric_from_metric_many_samples(self):
test_metric = TestMetric()
sum_metric = system_metrics_collector.SumMetric.from_metric(
test_metric)
test_metric.collect_metric()
sum_metric.collect_metric()
test_metric.value = 40
test_metric.collect_metric()
sum_metric.collect_metric()
test_metric.value = 1
test_metric.collect_metric()
sum_metric.collect_metric()
self.assertEqual(sum_metric.values, 42)
class FakeSystemFacade(object):
def __init__(self):
self.mem_total_mb = 1000.0
self.mem_free_mb = 400.0
self.file_handles = 11
self.active_cpu_time = 0.4
self.current_temperature_max = 43
self.storage_statistics = {
'transfers_per_s': 4.45,
'read_kb_per_s': 10.33,
'written_kb_per_s': 292.40,
'read_kb': 665582,
'written_kb': 188458,
}
self.bg_worker_output = ''
def get_mem_total(self):
return self.mem_total_mb
def get_mem_free_plus_buffers_and_cached(self):
return self.mem_free_mb
def get_num_allocated_file_handles(self):
return self.file_handles
def get_cpu_usage(self):
return {}
def compute_active_cpu_time(self, last_usage, current_usage):
return self.active_cpu_time
def get_current_temperature_max(self):
return self.current_temperature_max
def get_storage_statistics(self, device=None):
return self.storage_statistics
def start_bg_worker(self, command):
pass
def get_and_discard_bg_worker_output(self):
return self.bg_worker_output
def stop_bg_worker(self):
pass
class TestMetric(system_metrics_collector.Metric):
def __init__(self):
super(TestMetric, self).__init__(
'test_description', units='test_unit')
self.value = 1
def collect_metric(self):
self._store_sample(self.value)
class LastElementMetric(system_metrics_collector.Metric):
def _aggregate(self, x):
return x[-1]
class TestAggregateMetric(TestMetric, LastElementMetric):
pass
class TestPeakMetric(TestMetric, system_metrics_collector.PeakMetric):
pass
class TestSumMetric(TestMetric, system_metrics_collector.SumMetric):
pass