1from autotest_lib.client.common_lib.cros import system_metrics_collector
2
3import unittest
4
5# pylint: disable=missing-docstring
6class TestSystemMetricsCollector(unittest.TestCase):
7    """
8    Tests for the system_metrics_collector module.
9    """
10    def test_mem_usage_metric(self):
11        metric = system_metrics_collector.MemUsageMetric(FakeSystemFacade())
12        metric.collect_metric()
13        self.assertAlmostEqual(60, metric.values[0])
14
15    def test_file_handles_metric(self):
16        metric = system_metrics_collector.AllocatedFileHandlesMetric(
17                FakeSystemFacade())
18        metric.collect_metric()
19        self.assertEqual(11, metric.values[0])
20
21    def test_cpu_usage_metric(self):
22        system_facade = FakeSystemFacade()
23        metric = system_metrics_collector.CpuUsageMetric(system_facade)
24        metric.pre_collect()
25        system_facade.active_cpu_time += 0.1
26        metric.collect_metric()
27        self.assertAlmostEqual(50, metric.values[0])
28
29    def test_tempature_metric(self):
30        metric = system_metrics_collector.TemperatureMetric(FakeSystemFacade())
31        metric.collect_metric()
32        self.assertAlmostEqual(43, metric.values[0])
33
34    def test_storage_written_metric(self):
35        system_facade = FakeSystemFacade()
36        metric = system_metrics_collector.StorageWrittenMetric(system_facade)
37        metric.pre_collect()
38        system_facade.storage_statistics['written_kb'] += 1337
39        metric.collect_metric()
40        self.assertEqual(1337, metric.values[0])
41
42    def test_collector(self):
43        collector = system_metrics_collector.SystemMetricsCollector(
44                FakeSystemFacade(), [TestMetric()])
45        collector.collect_snapshot()
46        d = {}
47        def _write_func(**kwargs):
48            d.update(kwargs)
49        collector.write_metrics(_write_func)
50        self.assertEquals('test_description', d['description'])
51        self.assertEquals([1], d['value'])
52        self.assertEquals(False, d['higher_is_better'])
53        self.assertEquals('test_unit', d['units'])
54
55    def test_collector_default_set_of_metrics_no_error(self):
56        # Only verify no errors are thrown when collecting using
57        # the default metric set.
58        collector = system_metrics_collector.SystemMetricsCollector(
59                FakeSystemFacade())
60        collector.pre_collect()
61        collector.collect_snapshot()
62        collector.collect_snapshot()
63        collector.write_metrics(lambda **kwargs: None)
64
65    def test_aggregate_metric_zero_samples(self):
66        metric = TestAggregateMetric()
67        self.assertEqual(metric.values, [])
68
69    def test_aggregate_metric_one_sample(self):
70        metric = TestAggregateMetric()
71        metric.collect_metric()
72        self.assertEqual(metric.values, 1)
73
74    def test_aggregate_metric_many_samples(self):
75        metric = TestAggregateMetric()
76        metric.collect_metric()
77        metric.value = 2
78        metric.collect_metric()
79        metric.value = 3
80        metric.collect_metric()
81        self.assertEqual(metric.values, 3)
82
83    def test_aggregate_metric_from_metric_one_sample(self):
84        test_metric = TestMetric()
85        aggregate_metric = LastElementMetric.from_metric(test_metric)
86        test_metric.collect_metric()
87        aggregate_metric.collect_metric()
88        self.assertEqual(test_metric.values, [1])
89        self.assertEqual(aggregate_metric.values, 1)
90
91    def test_aggregate_metric_from_metric_many_samples(self):
92        test_metric = TestMetric()
93        aggregate_metric = LastElementMetric.from_metric(test_metric)
94        test_metric.collect_metric()
95        aggregate_metric.collect_metric()
96        test_metric.value = 2
97        test_metric.collect_metric()
98        aggregate_metric.collect_metric()
99        test_metric.value = 3
100        test_metric.collect_metric()
101        aggregate_metric.collect_metric()
102        self.assertEqual(test_metric.values, [1, 2, 3])
103        self.assertEqual(aggregate_metric.values, 3)
104
105    def test_peak_metric_description(self):
106        metric = system_metrics_collector.PeakMetric('foo')
107        self.assertEqual(metric.description, 'peak_foo')
108
109    def test_peak_metric_many_samples(self):
110        metric = TestPeakMetric()
111        metric.collect_metric()
112        metric.value = 2
113        metric.collect_metric()
114        metric.value = 0
115        metric.collect_metric()
116        self.assertEqual(metric.values, 2)
117
118    def test_peak_metric_from_metric_many_samples(self):
119        test_metric = TestMetric()
120        peak_metric = system_metrics_collector.PeakMetric.from_metric(
121                test_metric)
122        test_metric.collect_metric()
123        peak_metric.collect_metric()
124        test_metric.value = 2
125        test_metric.collect_metric()
126        peak_metric.collect_metric()
127        test_metric.value = 0
128        test_metric.collect_metric()
129        peak_metric.collect_metric()
130        self.assertEqual(peak_metric.values, 2)
131
132    def test_sum_metric_description(self):
133        metric = system_metrics_collector.SumMetric('foo')
134        self.assertEqual(metric.description, 'sum_foo')
135
136    def test_sum_metric_many_samples(self):
137        metric = TestSumMetric()
138        metric.collect_metric()
139        metric.value = 2
140        metric.collect_metric()
141        metric.value = 3
142        metric.collect_metric()
143        self.assertEqual(metric.values, 6)
144
145    def test_sum_metric_from_metric_many_samples(self):
146        test_metric = TestMetric()
147        sum_metric = system_metrics_collector.SumMetric.from_metric(
148                test_metric)
149        test_metric.collect_metric()
150        sum_metric.collect_metric()
151        test_metric.value = 40
152        test_metric.collect_metric()
153        sum_metric.collect_metric()
154        test_metric.value = 1
155        test_metric.collect_metric()
156        sum_metric.collect_metric()
157        self.assertEqual(sum_metric.values, 42)
158
159class FakeSystemFacade(object):
160    def __init__(self):
161        self.mem_total_mb = 1000.0
162        self.mem_free_mb = 400.0
163        self.file_handles = 11
164        self.active_cpu_time = 0.4
165        self.current_temperature_max = 43
166        self.storage_statistics = {
167            'transfers_per_s': 4.45,
168            'read_kb_per_s': 10.33,
169            'written_kb_per_s':  292.40,
170            'read_kb': 665582,
171            'written_kb': 188458,
172        }
173
174    def get_mem_total(self):
175        return self.mem_total_mb
176
177    def get_mem_free_plus_buffers_and_cached(self):
178        return self.mem_free_mb
179
180    def get_num_allocated_file_handles(self):
181        return self.file_handles
182
183    def get_cpu_usage(self):
184        return {}
185
186    def compute_active_cpu_time(self, last_usage, current_usage):
187        return self.active_cpu_time
188
189    def get_current_temperature_max(self):
190        return self.current_temperature_max
191
192    def get_storage_statistics(self, device=None):
193        return self.storage_statistics
194
195class TestMetric(system_metrics_collector.Metric):
196    def __init__(self):
197        super(TestMetric, self).__init__(
198                'test_description', units='test_unit')
199        self.value = 1
200
201    def collect_metric(self):
202        self._store_sample(self.value)
203
204class LastElementMetric(system_metrics_collector.Metric):
205    def _aggregate(self, x):
206        return x[-1]
207
208class TestAggregateMetric(TestMetric, LastElementMetric):
209    pass
210
211class TestPeakMetric(TestMetric, system_metrics_collector.PeakMetric):
212    pass
213
214class TestSumMetric(TestMetric, system_metrics_collector.SumMetric):
215    pass
216