Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(123)

Side by Side Diff: infra/tools/send_monitoring_event/test/send_event_test.py

Issue 1427903002: send_monitoring_event: support for default event and gomastats (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@event-mon-no-default-kind
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698