OLD | NEW |
1 # Copyright (c) 2015 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2015 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 import json | 5 import json |
6 import os | 6 import os |
7 import tempfile | |
8 import time | 7 import time |
9 import unittest | 8 import unittest |
10 | 9 |
11 import mock | 10 import mock |
12 import requests | 11 import requests |
13 | 12 |
14 from infra_libs import temporary_directory | 13 from infra_libs import temporary_directory |
15 from infra_libs import ts_mon | 14 from infra_libs import ts_mon |
16 from infra.services.mastermon import pollers | 15 from infra.services.mastermon import pollers |
17 | 16 |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 f.write('%s\n' % json.dumps(data)) | 203 f.write('%s\n' % json.dumps(data)) |
205 return f.name | 204 return f.name |
206 | 205 |
207 def test_no_file(self): | 206 def test_no_file(self): |
208 with temporary_directory(prefix='poller-test-') as tempdir: | 207 with temporary_directory(prefix='poller-test-') as tempdir: |
209 filename = os.path.join(tempdir, 'no-such-file') | 208 filename = os.path.join(tempdir, 'no-such-file') |
210 p = pollers.FilePoller(filename, {}) | 209 p = pollers.FilePoller(filename, {}) |
211 self.assertTrue(p.poll()) | 210 self.assertTrue(p.poll()) |
212 self.assertFalse(os.path.isfile(pollers.rotated_filename(filename))) | 211 self.assertFalse(os.path.isfile(pollers.rotated_filename(filename))) |
213 | 212 |
214 @mock.patch('infra_libs.ts_mon.CounterMetric.increment') | 213 def test_file_has_data(self): |
215 @mock.patch('infra_libs.ts_mon.CumulativeDistributionMetric.add') | |
216 def test_file_has_data(self, fake_add, fake_increment): | |
217 result1 = {'builder': 'b1', 'slave': 's1', | 214 result1 = {'builder': 'b1', 'slave': 's1', |
218 'result': 'r1', 'project_id': 'chromium', | 215 'result': 'r1', 'project_id': 'chromium', |
219 'subproject_tag': 'unknown'} | 216 'subproject_tag': 'unknown'} |
220 result2 = {'builder': 'b1', 'slave': 's1', | 217 result2 = {'builder': 'b1', 'slave': 's1', |
221 'result': 'r1', 'project_id': 'unknown', | 218 'result': 'r1', 'project_id': 'unknown', |
222 'subproject_tag': 'unknown'} | 219 'subproject_tag': 'unknown'} |
| 220 result3 = {'builder': 'b1', 'slave': 's1', |
| 221 'step_result': 'r1', 'project_id': 'chromium', |
| 222 'subproject_tag': 'unknown'} |
223 # Check that we've listed all the required metric fields. | 223 # Check that we've listed all the required metric fields. |
224 self.assertEqual(set(result1), set(pollers.FilePoller.field_keys)) | 224 self.assertEqual(set(result1), set(pollers.FilePoller.build_field_keys)) |
225 self.assertEqual(set(result2), set(pollers.FilePoller.field_keys)) | 225 self.assertEqual(set(result2), set(pollers.FilePoller.build_field_keys)) |
| 226 self.assertEqual(set(result3), set(pollers.FilePoller.step_field_keys)) |
226 | 227 |
227 data1 = result1.copy() | 228 data = [r.copy() for r in (result1, result2, result3)] |
228 data2 = result2.copy() | 229 data[0]['random'] = 'value' # Extra field, should be ignored. |
229 data1['random'] = 'value' # Extra field, should be ignored. | 230 del data[1]['project_id'] # Missing field, should become 'unknown'. |
230 del data2['project_id'] # Missing field, should become 'unknown'. | 231 data[1]['duration_s'] = 5 |
231 data2['duration_s'] = 5 | 232 data[1]['pending_s'] = 1 |
232 data2['pending_s'] = 1 | 233 data[1]['total_s'] = data[1]['pending_s'] + data[1]['duration_s'] |
233 data2['total_s'] = data2['pending_s'] + data2['duration_s'] | 234 data[1]['pre_test_time_s'] = 2 |
234 data2['pre_test_time_s'] = 2 | |
235 with temporary_directory(prefix='poller-test-') as tempdir: | 235 with temporary_directory(prefix='poller-test-') as tempdir: |
236 filename = self.create_data_file(tempdir, [data1, data2]) | 236 filename = self.create_data_file(tempdir, data) |
237 p = pollers.FilePoller(filename, {}) | 237 p = pollers.FilePoller(filename, {}) |
238 self.assertTrue(p.poll()) | 238 self.assertTrue(p.poll()) |
239 fake_increment.assert_any_call(result1) | 239 |
240 fake_increment.assert_any_call(result2) | 240 self.assertEqual(pollers.FilePoller.result_count.get(result1), 1) |
241 fake_add.assert_any_call(data2['duration_s'], result2) | 241 self.assertEqual(pollers.FilePoller.result_count.get(result2), 1) |
242 fake_add.assert_any_call(data2['pending_s'], result2) | 242 self.assertEqual(pollers.FilePoller.step_results_count.get(result3), 1) |
243 fake_add.assert_any_call(data2['total_s'], result2) | 243 |
244 self.assertFalse(os.path.isfile(filename)) | 244 self.assertFalse(os.path.isfile(filename)) |
245 # Make sure the rotated file is still there - for debugging. | 245 # Make sure the rotated file is still there - for debugging. |
246 self.assertTrue(os.path.isfile(pollers.rotated_filename(filename))) | 246 self.assertTrue(os.path.isfile(pollers.rotated_filename(filename))) |
247 | 247 |
248 def test_file_has_bad_data(self): | 248 def test_file_has_bad_data(self): |
249 """Mostly a smoke test: don't crash on bad data.""" | 249 """Mostly a smoke test: don't crash on bad data.""" |
250 with temporary_directory(prefix='poller-test-') as tempdir: | 250 with temporary_directory(prefix='poller-test-') as tempdir: |
251 filename = self.create_data_file(tempdir, []) | 251 filename = self.create_data_file(tempdir, []) |
252 with open(filename, 'a') as f: | 252 with open(filename, 'a') as f: |
253 f.write('}') | 253 f.write('}') |
254 p = pollers.FilePoller(filename, {}) | 254 p = pollers.FilePoller(filename, {}) |
255 self.assertTrue(p.poll()) | 255 self.assertTrue(p.poll()) |
256 self.assertFalse(os.path.isfile(filename)) | 256 self.assertFalse(os.path.isfile(filename)) |
257 # Make sure the rotated file is still there - for debugging. | 257 # Make sure the rotated file is still there - for debugging. |
258 self.assertTrue(os.path.isfile(pollers.rotated_filename(filename))) | 258 self.assertTrue(os.path.isfile(pollers.rotated_filename(filename))) |
259 | 259 |
260 def test_safe_remove_error(self): | 260 def test_safe_remove_error(self): |
261 """Smoke test: the function should not raise an exception.""" | 261 """Smoke test: the function should not raise an exception.""" |
262 pollers.safe_remove('nonexistent-file') | 262 pollers.safe_remove('nonexistent-file') |
OLD | NEW |