• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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