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 unittest | 7 import unittest |
8 | 8 |
9 import google.protobuf | |
10 | |
9 import infra_libs | 11 import infra_libs |
10 from infra_libs import event_mon | 12 from infra_libs import event_mon |
13 | |
11 from infra.tools.send_monitoring_event import send_event | 14 from infra.tools.send_monitoring_event import send_event |
12 | 15 |
16 from infra_libs.event_mon import BuildEvent, ChromeInfraEvent, LogRequestLite | |
13 | 17 |
14 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'data') | 18 DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'data') |
15 | 19 |
16 | 20 |
17 class SendingEventBaseTest(unittest.TestCase): | 21 class SendingEventBaseTest(unittest.TestCase): |
18 """Base class for all tests that send events.""" | 22 """Base class for all tests that send events.""" |
19 def setUp(self): | 23 def setUp(self): |
20 # Use the dry run mode instead of a mock. | 24 # Use the dry run mode instead of a mock. |
21 event_mon.setup_monitoring(run_type='dry') | 25 event_mon.setup_monitoring(run_type='dry') |
22 | 26 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
81 send_event.send_service_event(args) | 85 send_event.send_service_event(args) |
82 | 86 |
83 | 87 |
84 class TestBuildEvent(SendingEventBaseTest): | 88 class TestBuildEvent(SendingEventBaseTest): |
85 def test_send_build_event_smoke(self): | 89 def test_send_build_event_smoke(self): |
86 args = send_event.get_arguments( | 90 args = send_event.get_arguments( |
87 ['--event-mon-service-name', 'thing', | 91 ['--event-mon-service-name', 'thing', |
88 '--build-event-type', 'SCHEDULER', | 92 '--build-event-type', 'SCHEDULER', |
89 '--build-event-hostname', 'foo.bar.dns', | 93 '--build-event-hostname', 'foo.bar.dns', |
90 '--build-event-build-name', 'whatever']) | 94 '--build-event-build-name', 'whatever']) |
91 self.assertEquals(args.event_mon_run_type, 'dry') | 95 self.assertTrue(send_event.send_build_event(args)) |
92 send_event.send_build_event(args) | 96 |
97 def test_send_build_event_smoke_missing_goma_file(self): | |
98 args = send_event.get_arguments( | |
99 ['--event-mon-service-name', 'thing', | |
100 '--build-event-type', 'BUILD', | |
101 '--build-event-hostname', 'foo.bar.dns', | |
102 '--build-event-build-name', 'whatever', | |
103 '--build-event-goma-stats-path', | |
104 os.path.join(DATA_DIR, 'this-file-does-not-exist')]) | |
105 with self.assertRaises(IOError): | |
106 send_event.send_build_event(args) | |
93 | 107 |
94 | 108 |
95 class TestEventsFromFile(SendingEventBaseTest): | 109 class TestInputModesFile(unittest.TestCase): |
110 # Test the various ways to pass information to send_monitoring_event | |
111 # TODO(pgervais): test precedence order. | |
112 def tearDown(self): | |
113 event_mon.close() | |
114 | |
115 def test_send_build_event_with_goma_stats(self): | |
116 # Write a file to avoid mocks | |
117 with infra_libs.temporary_directory(prefix='send_event_test-') as tmpdir: | |
118 outfile = os.path.join(tmpdir, 'out.bin') | |
119 args = send_event.get_arguments( | |
120 ['--event-mon-run-type', 'file', | |
121 '--event-mon-output-file', outfile, | |
122 '--event-mon-service-name', 'thing', | |
123 '--build-event-type', 'BUILD', | |
124 '--build-event-hostname', 'foo.bar.dns', | |
125 '--build-event-build-name', 'whatever', | |
126 '--build-event-goma-stats-path', | |
127 os.path.join(DATA_DIR, 'goma_stats.bin')]) | |
128 self.assertEquals(args.event_mon_run_type, 'file') | |
129 event_mon.process_argparse_options(args) | |
130 self.assertTrue(send_event.send_build_event(args)) | |
131 | |
132 # Now open the resulting file and check what was written | |
133 with open(outfile, 'rb') as f: | |
134 request = LogRequestLite.FromString(f.read()) | |
135 | |
136 self.assertEqual(len(request.log_event), 1) | |
137 event = ChromeInfraEvent.FromString(request.log_event[0].source_extension) | |
138 self.assertEqual(event.build_event.goma_stats.request_stats.total, 10) | |
139 self.assertEqual(event.build_event.goma_stats.request_stats.success, 9) | |
140 self.assertEqual(event.build_event.goma_stats.request_stats.failure, 1) | |
141 self.assertEqual(event.build_event.host_name, 'foo.bar.dns') | |
142 | |
143 def test_send_build_event_with_invalid_goma_stats(self): | |
144 # Write a file to avoid mocks | |
145 with infra_libs.temporary_directory(prefix='send_event_test-') as tmpdir: | |
146 outfile = os.path.join(tmpdir, 'out.bin') | |
147 args = send_event.get_arguments( | |
148 ['--event-mon-run-type', 'file', | |
149 '--event-mon-output-file', outfile, | |
150 '--event-mon-service-name', 'thing', | |
151 '--build-event-type', 'BUILD', | |
152 '--build-event-hostname', 'foo.bar.dns', | |
153 '--build-event-build-name', 'whatever', | |
154 '--build-event-goma-stats-path', | |
155 os.path.join(DATA_DIR, 'garbage')]) | |
156 self.assertEquals(args.event_mon_run_type, 'file') | |
157 event_mon.process_argparse_options(args) | |
158 with self.assertRaises(google.protobuf.message.DecodeError): | |
159 send_event.send_build_event(args) | |
160 | |
161 # The default event used below (build-foo-builder.bin) has been generated by: | |
162 # ./run.py infra.tools.send_monitoring_event \ | |
163 # --event-mon-run-type=file \ | |
164 # --event-mon-output-file=./build-foo-builder.bin \ | |
165 # --build-event-hostname=myhostname \ | |
166 # --event-mon-timestamp-kind=BEGIN \ | |
167 # --event-mon-event-timestamp=123 \ | |
168 # --build-event-type=BUILD \ | |
169 # --build-event-build-name=foo" | |
170 def test_logrequest_path_valid(self): | |
171 with infra_libs.temporary_directory(prefix='send_event_test-') as tmpdir: | |
172 outfile = os.path.join(tmpdir, 'out.bin') | |
173 args = send_event.get_arguments( | |
174 ['--event-mon-run-type', 'file', | |
175 '--event-mon-output-file', outfile, | |
176 '--event-mon-service-name', 'thing', | |
177 '--event-logrequest-path', | |
178 os.path.join(DATA_DIR, 'build-foo-builder.bin'), | |
179 '--build-event-build-number', '3' | |
180 ]) | |
181 self.assertEquals(args.event_mon_run_type, 'file') | |
182 event_mon.process_argparse_options(args) | |
183 send_event._process_logrequest_path(args) | |
184 self.assertTrue(send_event.send_build_event(args)) | |
185 | |
186 # Now open the resulting file and check what was written | |
187 with open(outfile, 'rb') as f: | |
188 request = LogRequestLite.FromString(f.read()) | |
189 | |
190 self.assertEqual(len(request.log_event), 1) | |
191 event = ChromeInfraEvent.FromString(request.log_event[0].source_extension) | |
192 self.assertEqual(event.build_event.host_name, 'myhostname') | |
193 self.assertEqual(event.build_event.build_number, 3) | |
194 self.assertEqual(event.timestamp_kind, ChromeInfraEvent.BEGIN) | |
195 | |
196 def test_logrequest_path_build_type_override(self): | |
197 # logrequest contains build event, overrid the type with an arg. | |
198 with infra_libs.temporary_directory(prefix='send_event_test-') as tmpdir: | |
199 outfile = os.path.join(tmpdir, 'out.bin') | |
200 args = send_event.get_arguments( | |
201 ['--event-mon-run-type', 'file', | |
202 '--event-mon-output-file', outfile, | |
203 '--event-mon-service-name', 'thing', | |
204 '--event-logrequest-path', | |
205 os.path.join(DATA_DIR, 'build-foo-builder.bin'), | |
206 '--build-event-build-number', '3', | |
207 '--build-event-type', 'STEP', | |
208 ]) | |
209 self.assertEquals(args.event_mon_run_type, 'file') | |
210 event_mon.process_argparse_options(args) | |
211 send_event._process_logrequest_path(args) | |
212 self.assertTrue(send_event.send_build_event(args)) | |
213 | |
214 # Now open the resulting file and check what was written | |
215 with open(outfile, 'rb') as f: | |
216 request = LogRequestLite.FromString(f.read()) | |
217 | |
218 self.assertEqual(len(request.log_event), 1) | |
219 event = ChromeInfraEvent.FromString(request.log_event[0].source_extension) | |
220 self.assertEqual(event.build_event.host_name, 'myhostname') | |
221 self.assertEqual(event.build_event.type, BuildEvent.STEP) | |
222 self.assertEqual(event.build_event.build_number, 3) | |
223 self.assertEqual(event.timestamp_kind, ChromeInfraEvent.BEGIN) | |
224 | |
225 def test_logrequest_path_build_service_conflicts(self): | |
226 # logrequest contains build event, provides service event as arg | |
227 with infra_libs.temporary_directory(prefix='send_event_test-') as tmpdir: | |
228 outfile = os.path.join(tmpdir, 'out.bin') | |
229 args = send_event.get_arguments( | |
230 ['--event-mon-run-type', 'file', | |
231 '--event-mon-output-file', outfile, | |
232 '--event-mon-service-name', 'thing', | |
233 '--event-logrequest-path', | |
234 os.path.join(DATA_DIR, 'build-foo-builder.bin'), | |
235 '--build-event-build-number', '3', | |
236 '--service-event-type', 'START', | |
237 ]) | |
238 self.assertEquals(args.event_mon_run_type, 'file') | |
239 event_mon.process_argparse_options(args) | |
240 with self.assertRaises(ValueError): | |
241 send_event._process_logrequest_path(args) | |
242 | |
243 # TODO(pgervais): tests to add: | |
Sergey Berezin
2015/10/29 23:32:54
Is this planned for this CL, or later?
pgervais
2015/11/02 19:38:58
This CL. I'll add them today.
| |
244 # conflict with build type (requires another protos) | |
245 # service type provided | |
246 # service type not provided | |
247 # both service type and build type provided (yet another one) | |
248 | |
249 class TestEventsFromTextFile(SendingEventBaseTest): | |
96 def test_send_events_from_file_smoke(self): | 250 def test_send_events_from_file_smoke(self): |
97 # Create a temporary file because we don't want to risk deleting a | 251 # Create a temporary file because we don't want to risk deleting a |
98 # checked-in file. | 252 # checked-in file. |
99 with infra_libs.temporary_directory(prefix='send-events-test') as tempdir: | 253 with infra_libs.temporary_directory(prefix='send-events-test') as tempdir: |
100 event_file = os.path.join(tempdir, 'events.log') | 254 event_file = os.path.join(tempdir, 'events.log') |
101 with open(event_file, 'w') as f: | 255 with open(event_file, 'w') as f: |
102 f.write('{"build-event-type": "STEP", ' | 256 f.write('{"build-event-type": "STEP", ' |
103 '"build-event-build-name": "infra-continuous-precise-64", ' | 257 '"build-event-build-name": "infra-continuous-precise-64", ' |
104 '"event-mon-service-name": "buildbot/master/chromium.infra", ' | 258 '"event-mon-service-name": "buildbot/master/chromium.infra", ' |
105 '"build-event-step-number": 9, ' | 259 '"build-event-step-number": 9, ' |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
199 self.assertTrue(any(fname.endswith(filename) for filename in filenames)) | 353 self.assertTrue(any(fname.endswith(filename) for filename in filenames)) |
200 | 354 |
201 def test_one_wildcard_one_file(self): | 355 def test_one_wildcard_one_file(self): |
202 filenames = ('events.log', 'events-1.log', 'events-2.log') | 356 filenames = ('events.log', 'events-1.log', 'events-2.log') |
203 file_list = send_event.get_event_file_list( | 357 file_list = send_event.get_event_file_list( |
204 [os.path.join(self.FILES_DIR, 'events-?.log'), | 358 [os.path.join(self.FILES_DIR, 'events-?.log'), |
205 os.path.join(self.FILES_DIR, 'events.log')]) | 359 os.path.join(self.FILES_DIR, 'events.log')]) |
206 self.assertTrue(len(file_list) == 3) | 360 self.assertTrue(len(file_list) == 3) |
207 for fname in file_list: | 361 for fname in file_list: |
208 self.assertTrue(any(fname.endswith(filename) for filename in filenames)) | 362 self.assertTrue(any(fname.endswith(filename) for filename in filenames)) |
363 | |
364 | |
365 class TestProcessRequestPath(SendingEventBaseTest): | |
366 def test_logrequest_missing_args(self): | |
367 orig_event = event_mon.get_default_event() | |
368 self.assertIsNot(orig_event, None) | |
369 | |
370 args = argparse.Namespace() | |
371 args.event_logrequest_path = None | |
372 send_event._process_logrequest_path(args) | |
373 | |
374 self.assertEqual(orig_event, event_mon.get_default_event()) | |
375 | |
376 def test_logrequest_with_valid_file(self): | |
377 orig_event = event_mon.get_default_event() | |
378 self.assertIsNot(orig_event, None) | |
379 | |
380 args = argparse.Namespace() | |
381 args.event_logrequest_path = os.path.join(DATA_DIR, 'logrequest-build.bin') | |
382 args.service_event_type = None | |
383 args.build_event_type = None | |
384 send_event._process_logrequest_path(args) | |
385 | |
386 new_event = event_mon.get_default_event() | |
387 self.assertNotEqual(orig_event, new_event) | |
388 self.assertEqual(new_event.build_event.type, BuildEvent.BUILD) | |
389 | |
390 def test_logrequest_with_no_log_event(self): | |
391 orig_event = event_mon.get_default_event() | |
392 self.assertIsNot(orig_event, None) | |
393 | |
394 args = argparse.Namespace() | |
395 args.event_logrequest_path = os.path.join(DATA_DIR, 'logrequest-empty.bin') | |
396 with self.assertRaises(ValueError): | |
397 send_event._process_logrequest_path(args) | |
398 | |
399 def test_logrequest_with_bad_content(self): | |
400 orig_event = event_mon.get_default_event() | |
401 self.assertIsNot(orig_event, None) | |
402 | |
403 args = argparse.Namespace() | |
404 args.event_logrequest_path = os.path.join(DATA_DIR, 'garbage') | |
405 with self.assertRaises(google.protobuf.message.DecodeError): | |
406 send_event._process_logrequest_path(args) | |
407 | |
408 def test_logrequest_with_missing_file(self): | |
409 args = argparse.Namespace() | |
410 args.event_logrequest_path = os.path.join(DATA_DIR, 'non-existent-file.bin') | |
411 with self.assertRaises(IOError): | |
412 send_event._process_logrequest_path(args) | |
OLD | NEW |