| OLD | NEW |
| 1 # Copyright 2015 The Chromium Authors. All rights reserved. | 1 # Copyright 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 argparse | 5 import argparse |
| 6 import os | 6 import os |
| 7 import traceback | 7 import traceback |
| 8 import unittest | 8 import unittest |
| 9 | 9 |
| 10 import infra_libs | 10 import infra_libs |
| 11 from infra_libs import event_mon | 11 from infra_libs import event_mon |
| 12 from infra_libs.event_mon import config, router | 12 from infra_libs.event_mon import config, router |
| 13 from infra_libs.event_mon.protos import chrome_infra_log_pb2 |
| 13 | 14 |
| 14 | 15 |
| 15 class ConfigTest(unittest.TestCase): | 16 class ConfigTest(unittest.TestCase): |
| 17 def tearDown(self): |
| 18 self._close() |
| 19 |
| 16 def _set_up_args(self, args=None): # pragma: no cover | 20 def _set_up_args(self, args=None): # pragma: no cover |
| 17 parser = argparse.ArgumentParser() | 21 parser = argparse.ArgumentParser() |
| 18 event_mon.add_argparse_options(parser) | 22 event_mon.add_argparse_options(parser) |
| 19 args = parser.parse_args((args or [])) | 23 args = parser.parse_args((args or [])) |
| 20 # Safety net. We really don't want to send something to a real endpoint. | 24 # Safety net. We really don't want to send something to a real endpoint. |
| 21 self.assertTrue((args.event_mon_run_type not in ('test', 'prod')) | 25 self.assertTrue((args.event_mon_run_type not in ('test', 'prod')) |
| 22 or args.dry_run) | 26 or args.dry_run) |
| 23 event_mon.process_argparse_options(args) | 27 event_mon.process_argparse_options(args) |
| 24 r = config._router | 28 r = config._router |
| 25 self.assertIsInstance(r, router._Router) | 29 self.assertIsInstance(r, router._Router) |
| 26 # Check that process_argparse_options is idempotent | 30 # Check that process_argparse_options is idempotent |
| 27 event_mon.process_argparse_options(args) | 31 event_mon.process_argparse_options(args) |
| 28 self.assertIs(config._router, r) | 32 self.assertIs(config._router, r) |
| 29 | 33 |
| 30 def _close(self): | 34 def _close(self): |
| 31 self.assertTrue(config._router) | |
| 32 self.assertTrue(event_mon.close()) | 35 self.assertTrue(event_mon.close()) |
| 33 self.assertFalse(config._cache) | 36 self.assertFalse(config._cache) |
| 34 # Test that calling it twice does not raise an exception. | 37 # Test that calling it twice does not raise an exception. |
| 35 self.assertTrue(event_mon.close()) | 38 self.assertTrue(event_mon.close()) |
| 36 | 39 |
| 37 def test_no_args_smoke(self): # pragma: no cover | 40 def test_no_args_smoke(self): # pragma: no cover |
| 38 self._set_up_args() | 41 self._set_up_args() |
| 39 self._close() | |
| 40 | 42 |
| 41 def test_args_and_default_event(self): # pragma: no cover | 43 def test_args_and_default_event(self): # pragma: no cover |
| 42 # The protobuf structure is actually an API not an implementation detail | 44 # The protobuf structure is actually an API not an implementation detail |
| 43 # so it's sane to test for changes. | 45 # so it's sane to test for changes. |
| 44 hostname = 'a' | 46 hostname = 'a' |
| 45 service_name = 'b' | 47 service_name = 'b' |
| 46 appengine_name = 'c' | 48 appengine_name = 'c' |
| 47 | 49 |
| 48 args = ['--event-mon-run-type', 'dry', | 50 args = ['--event-mon-run-type', 'dry', |
| 49 '--event-mon-hostname', hostname, | 51 '--event-mon-hostname', hostname, |
| 50 '--event-mon-service-name', service_name, | 52 '--event-mon-service-name', service_name, |
| 51 '--event-mon-appengine-name', appengine_name] | 53 '--event-mon-appengine-name', appengine_name] |
| 52 try: | 54 self._set_up_args(args=args) |
| 53 self._set_up_args(args=args) | 55 event = config._cache['default_event'] |
| 54 event = config._cache['default_event'] | 56 self.assertEquals(event.event_source.host_name, hostname) |
| 55 self.assertEquals(event.event_source.host_name, hostname) | 57 self.assertEquals(event.event_source.service_name, service_name) |
| 56 self.assertEquals(event.event_source.service_name, service_name) | 58 self.assertEquals(event.event_source.appengine_name, appengine_name) |
| 57 self.assertEquals(event.event_source.appengine_name, appengine_name) | |
| 58 finally: | |
| 59 self._close() | |
| 60 | 59 |
| 61 def test_run_type_file_good(self): | 60 def test_run_type_file_good(self): |
| 62 try: | 61 try: |
| 63 with infra_libs.temporary_directory(prefix='config_test-') as tempdir: | 62 with infra_libs.temporary_directory(prefix='config_test-') as tempdir: |
| 64 filename = os.path.join(tempdir, 'output.db') | 63 filename = os.path.join(tempdir, 'output.db') |
| 65 self._set_up_args(args=['--event-mon-run-type', 'file', | 64 self._set_up_args(args=['--event-mon-run-type', 'file', |
| 66 '--event-mon-output-file', filename]) | 65 '--event-mon-output-file', filename]) |
| 67 self.assertEqual(config._router.output_file, filename) | 66 self.assertEqual(config._router.output_file, filename) |
| 68 except Exception: # pragma: no cover | 67 except Exception: # pragma: no cover |
| 69 # help for debugging | 68 # help for debugging |
| 70 traceback.print_exc() | 69 traceback.print_exc() |
| 71 raise | 70 raise |
| 72 finally: | |
| 73 self._close() | |
| 74 | 71 |
| 75 # Direct setup_monitoring testing below this line. | 72 # Direct setup_monitoring testing below this line. |
| 76 def test_default_event(self): | 73 def test_default_event(self): |
| 77 # The protobuf structure is actually an API not an implementation detail | 74 # The protobuf structure is actually an API not an implementation detail |
| 78 # so it's sane to test for changes. | 75 # so it's sane to test for changes. |
| 79 event_mon.setup_monitoring() | 76 event_mon.setup_monitoring() |
| 80 event = config._cache['default_event'] | 77 event = config._cache['default_event'] |
| 81 self.assertTrue(event.event_source.HasField('host_name')) | 78 self.assertTrue(event.event_source.HasField('host_name')) |
| 82 self.assertFalse(event.event_source.HasField('service_name')) | 79 self.assertFalse(event.event_source.HasField('service_name')) |
| 83 self.assertFalse(event.event_source.HasField('appengine_name')) | 80 self.assertFalse(event.event_source.HasField('appengine_name')) |
| 84 | 81 |
| 85 self._close() | |
| 86 | |
| 87 def test_default_event_with_values(self): | 82 def test_default_event_with_values(self): |
| 88 # The protobuf structure is actually an API not an implementation detail | 83 # The protobuf structure is actually an API not an implementation detail |
| 89 # so it's sane to test for changes. | 84 # so it's sane to test for changes. |
| 90 hostname = 'a' | 85 hostname = 'a' |
| 91 service_name = 'b' | 86 service_name = 'b' |
| 92 appengine_name = 'c' | 87 appengine_name = 'c' |
| 93 | 88 |
| 94 event_mon.setup_monitoring( | 89 event_mon.setup_monitoring( |
| 95 hostname=hostname, | 90 hostname=hostname, |
| 96 service_name=service_name, | 91 service_name=service_name, |
| 97 appengine_name=appengine_name | 92 appengine_name=appengine_name |
| 98 ) | 93 ) |
| 99 event = config._cache['default_event'] | 94 event = config._cache['default_event'] |
| 100 self.assertEquals(event.event_source.host_name, hostname) | 95 self.assertEquals(event.event_source.host_name, hostname) |
| 101 self.assertEquals(event.event_source.service_name, service_name) | 96 self.assertEquals(event.event_source.service_name, service_name) |
| 102 self.assertEquals(event.event_source.appengine_name, appengine_name) | 97 self.assertEquals(event.event_source.appengine_name, appengine_name) |
| 103 | 98 |
| 104 self._close() | 99 def test_set_default_event(self): |
| 100 event_mon.setup_monitoring() |
| 101 orig_event = config._cache['default_event'] |
| 102 |
| 103 # Set the new default event to something different from orig_event |
| 104 # to make sure it has changed. |
| 105 event = chrome_infra_log_pb2.ChromeInfraEvent() |
| 106 new_hostname = orig_event.event_source.host_name + '.foo' |
| 107 event.event_source.host_name = new_hostname |
| 108 event_mon.set_default_event(event) |
| 109 |
| 110 new_event = config._cache['default_event'] |
| 111 self.assertEquals(new_event.event_source.host_name, new_hostname) |
| 112 |
| 113 def test_set_default_event_bad_type(self): |
| 114 event_mon.setup_monitoring() |
| 115 |
| 116 # bad type |
| 117 with self.assertRaises(TypeError): |
| 118 event_mon.set_default_event({'hostname': 'foo'}) |
| OLD | NEW |