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