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 orig_event = config._cache['default_event'] |
| 116 |
| 117 # bad type |
| 118 event_mon.set_default_event({'hostname': 'foo'}) |
| 119 |
| 120 # no error should happen, and the default event should be unchanged. |
| 121 self.assertIs(orig_event, config._cache['default_event']) |
OLD | NEW |