• 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_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