| OLD | NEW |
| (Empty) |
| 1 # -*- encoding:utf-8 -*- | |
| 2 # Copyright 2015 The Chromium Authors. All rights reserved. | |
| 3 # Use of this source code is governed by a BSD-style license that can be | |
| 4 # found in the LICENSE file. | |
| 5 | |
| 6 import unittest | |
| 7 | |
| 8 from infra_libs import event_mon | |
| 9 from infra_libs.event_mon import config, router | |
| 10 from infra_libs.event_mon import monitoring | |
| 11 from infra_libs.event_mon.protos.chrome_infra_log_pb2 import ( | |
| 12 ChromeInfraEvent, ServiceEvent, BuildEvent) | |
| 13 from infra_libs.event_mon.protos.log_request_lite_pb2 import LogRequestLite | |
| 14 from infra_libs.event_mon.protos.goma_stats_pb2 import GomaStats | |
| 15 | |
| 16 | |
| 17 class ConstantTest(unittest.TestCase): | |
| 18 def test_constants(self): | |
| 19 # Make sure constants have not been renamed since they're part of the API. | |
| 20 self.assertTrue(event_mon.EVENT_TYPES) | |
| 21 self.assertTrue(event_mon.TIMESTAMP_KINDS) | |
| 22 self.assertTrue(event_mon.BUILD_EVENT_TYPES) | |
| 23 self.assertTrue(event_mon.BUILD_RESULTS) | |
| 24 | |
| 25 | |
| 26 class GetServiceEventTest(unittest.TestCase): | |
| 27 | |
| 28 # We have to setup and tear down event_mon for each test to avoid | |
| 29 # interactions between tests because event_mon stores a global state. | |
| 30 def setUp(self): | |
| 31 event_mon.setup_monitoring(run_type='dry') | |
| 32 | |
| 33 def tearDown(self): | |
| 34 event_mon.close() | |
| 35 | |
| 36 def test_get_service_event_default(self): | |
| 37 self.assertIsInstance(config._router, router._Router) | |
| 38 self.assertIsInstance(config._cache.get('default_event'), ChromeInfraEvent) | |
| 39 | |
| 40 log_event = monitoring._get_service_event('START').log_event() | |
| 41 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 42 self.assertTrue(log_event.HasField('event_time_ms')) | |
| 43 self.assertTrue(log_event.HasField('source_extension')) | |
| 44 | |
| 45 # Check that source_extension deserializes to the correct thing. | |
| 46 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 47 self.assertTrue(event.HasField('service_event')) | |
| 48 self.assertTrue(event.service_event.HasField('type')) | |
| 49 self.assertEquals(event.service_event.type, ServiceEvent.START) | |
| 50 self.assertEquals(event.timestamp_kind, ChromeInfraEvent.BEGIN) | |
| 51 | |
| 52 def test_get_service_event_correct_versions(self): | |
| 53 self.assertIsInstance(config._router, router._Router) | |
| 54 self.assertIsInstance(config._cache.get('default_event'), ChromeInfraEvent) | |
| 55 | |
| 56 code_version = [ | |
| 57 {'source_url': 'https://fake.url/thing', | |
| 58 'revision': '708329c2aeece8aac33af6a5a772ffb14b55903f'}, | |
| 59 {'source_url': 'svn://fake_svn.url/other_thing', | |
| 60 'revision': '123456'}, | |
| 61 {'source_url': 'https://other_fake.url/yet_another_thing', | |
| 62 'version': 'v2.0'}, | |
| 63 {'source_url': 'https://other_fake2.url/yet_another_thing2', | |
| 64 'dirty': True}, | |
| 65 ] | |
| 66 | |
| 67 log_event = monitoring._get_service_event( | |
| 68 'START', code_version=code_version).log_event() | |
| 69 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 70 code_version_p = event.service_event.code_version | |
| 71 self.assertEquals(len(code_version_p), len(code_version)) | |
| 72 | |
| 73 self.assertEqual(code_version_p[0].source_url, | |
| 74 code_version[0]['source_url']) | |
| 75 self.assertEqual(code_version_p[0].git_hash, code_version[0]['revision']) | |
| 76 self.assertFalse(code_version_p[0].HasField('svn_revision')) | |
| 77 | |
| 78 self.assertEqual(code_version_p[1].source_url, | |
| 79 code_version[1]['source_url']) | |
| 80 self.assertEqual(code_version_p[1].svn_revision, | |
| 81 int(code_version[1]['revision'])) | |
| 82 self.assertFalse(code_version_p[1].HasField('git_hash')) | |
| 83 | |
| 84 self.assertEqual(code_version_p[2].source_url, | |
| 85 code_version[2]['source_url']) | |
| 86 self.assertFalse(code_version_p[2].HasField('svn_revision')) | |
| 87 self.assertEqual(code_version_p[2].version, | |
| 88 code_version[2]['version']) | |
| 89 | |
| 90 self.assertEqual(code_version_p[3].source_url, | |
| 91 code_version[3]['source_url']) | |
| 92 self.assertEqual(code_version_p[3].dirty, True) | |
| 93 | |
| 94 def test_get_service_event_stop(self): | |
| 95 self.assertIsInstance(config._router, router._Router) | |
| 96 self.assertIsInstance(config._cache.get('default_event'), ChromeInfraEvent) | |
| 97 | |
| 98 log_event = monitoring._get_service_event('STOP').log_event() | |
| 99 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 100 self.assertEqual(event.service_event.type, ServiceEvent.STOP) | |
| 101 self.assertEquals(event.timestamp_kind, ChromeInfraEvent.END) | |
| 102 | |
| 103 def test_get_service_event_update(self): | |
| 104 self.assertIsInstance(config._router, router._Router) | |
| 105 self.assertIsInstance(config._cache.get('default_event'), ChromeInfraEvent) | |
| 106 | |
| 107 log_event = monitoring._get_service_event('UPDATE').log_event() | |
| 108 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 109 self.assertEqual(event.service_event.type, ServiceEvent.UPDATE) | |
| 110 self.assertEquals(event.timestamp_kind, ChromeInfraEvent.POINT) | |
| 111 | |
| 112 def test_get_service_event_crash_simple(self): | |
| 113 self.assertIsInstance(config._router, router._Router) | |
| 114 self.assertIsInstance(config._cache.get('default_event'), ChromeInfraEvent) | |
| 115 | |
| 116 log_event = monitoring._get_service_event('CRASH').log_event() | |
| 117 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 118 self.assertEqual(event.service_event.type, ServiceEvent.CRASH) | |
| 119 self.assertEquals(event.timestamp_kind, ChromeInfraEvent.END) | |
| 120 | |
| 121 def test_get_service_event_crash_with_ascii_trace(self): | |
| 122 self.assertIsInstance(config._router, router._Router) | |
| 123 self.assertIsInstance(config._cache.get('default_event'), ChromeInfraEvent) | |
| 124 | |
| 125 stack_trace = 'A nice ascii string' | |
| 126 log_event = monitoring._get_service_event( | |
| 127 'CRASH', stack_trace=stack_trace).log_event() | |
| 128 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 129 self.assertEqual(event.service_event.type, ServiceEvent.CRASH) | |
| 130 self.assertEqual(event.service_event.stack_trace, stack_trace) | |
| 131 self.assertEquals(event.timestamp_kind, ChromeInfraEvent.END) | |
| 132 | |
| 133 def test_get_service_event_crash_with_unicode_trace(self): | |
| 134 self.assertIsInstance(config._router, router._Router) | |
| 135 self.assertIsInstance(config._cache.get('default_event'), ChromeInfraEvent) | |
| 136 | |
| 137 stack_trace = u"Soyez prêt à un étrange goût de Noël." | |
| 138 log_event = monitoring._get_service_event( | |
| 139 'CRASH', stack_trace=stack_trace).log_event() | |
| 140 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 141 self.assertEqual(event.service_event.type, ServiceEvent.CRASH) | |
| 142 self.assertEqual(event.service_event.stack_trace, stack_trace) | |
| 143 self.assertEquals(event.timestamp_kind, ChromeInfraEvent.END) | |
| 144 | |
| 145 def test_get_service_event_crash_with_big_trace(self): | |
| 146 self.assertIsInstance(config._router, router._Router) | |
| 147 self.assertIsInstance(config._cache.get('default_event'), ChromeInfraEvent) | |
| 148 | |
| 149 stack_trace = "this is way too long" * 55 | |
| 150 self.assertTrue(len(stack_trace) > monitoring.STACK_TRACE_MAX_SIZE) | |
| 151 log_event = monitoring._get_service_event( | |
| 152 'CRASH', stack_trace=stack_trace).log_event() | |
| 153 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 154 self.assertEqual(event.service_event.type, ServiceEvent.CRASH) | |
| 155 self.assertEqual(len(event.service_event.stack_trace), | |
| 156 monitoring.STACK_TRACE_MAX_SIZE) | |
| 157 self.assertEquals(event.timestamp_kind, ChromeInfraEvent.END) | |
| 158 | |
| 159 def test_get_service_event_crash_invalid_trace(self): | |
| 160 self.assertIsInstance(config._router, router._Router) | |
| 161 self.assertIsInstance(config._cache.get('default_event'), ChromeInfraEvent) | |
| 162 | |
| 163 # This is not a stacktrace | |
| 164 stack_trace = 123456 | |
| 165 # Should not crash | |
| 166 log_event = monitoring._get_service_event( | |
| 167 'CRASH', stack_trace=stack_trace).log_event() | |
| 168 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 169 | |
| 170 # Send only valid data this time | |
| 171 self.assertEqual(event.service_event.type, ServiceEvent.CRASH) | |
| 172 self.assertFalse(event.service_event.HasField('stack_trace')) | |
| 173 | |
| 174 def test_get_service_event_trace_without_crash(self): | |
| 175 self.assertIsInstance(config._router, router._Router) | |
| 176 self.assertIsInstance(config._cache.get('default_event'), ChromeInfraEvent) | |
| 177 | |
| 178 stack_trace = 'A nice ascii string' | |
| 179 log_event = monitoring._get_service_event( | |
| 180 'START', stack_trace=stack_trace).log_event() | |
| 181 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 182 | |
| 183 # Make sure we send even invalid data. | |
| 184 self.assertEqual(event.service_event.type, ServiceEvent.START) | |
| 185 self.assertEqual(event.service_event.stack_trace, stack_trace) | |
| 186 self.assertEquals(event.timestamp_kind, ChromeInfraEvent.BEGIN) | |
| 187 | |
| 188 def test_get_service_event_with_non_default_service_name(self): | |
| 189 self.assertIsInstance(config._router, router._Router) | |
| 190 self.assertIsInstance(config._cache.get('default_event'), ChromeInfraEvent) | |
| 191 | |
| 192 log_event = monitoring._get_service_event( | |
| 193 'START', service_name='my.nice.service.name').log_event() | |
| 194 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 195 self.assertTrue(log_event.HasField('event_time_ms')) | |
| 196 self.assertTrue(log_event.HasField('source_extension')) | |
| 197 | |
| 198 # Check that source_extension deserializes to the right thing. | |
| 199 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 200 self.assertTrue(event.HasField('service_event')) | |
| 201 self.assertTrue(event.service_event.HasField('type')) | |
| 202 self.assertEquals(event.service_event.type, ServiceEvent.START) | |
| 203 self.assertEquals(event.event_source.service_name, 'my.nice.service.name') | |
| 204 | |
| 205 def test_get_service_event_with_unicode_service_name(self): | |
| 206 self.assertIsInstance(config._router, router._Router) | |
| 207 self.assertIsInstance(config._cache.get('default_event'), ChromeInfraEvent) | |
| 208 service_name = u'à_la_française_hé_oui' | |
| 209 log_event = monitoring._get_service_event( | |
| 210 'START', service_name=service_name).log_event() | |
| 211 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 212 self.assertTrue(log_event.HasField('event_time_ms')) | |
| 213 self.assertTrue(log_event.HasField('source_extension')) | |
| 214 | |
| 215 # Check that source_extension deserializes to the right thing. | |
| 216 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 217 self.assertTrue(event.HasField('service_event')) | |
| 218 self.assertTrue(event.service_event.HasField('type')) | |
| 219 self.assertEquals(event.service_event.type, ServiceEvent.START) | |
| 220 self.assertEquals(event.event_source.service_name, service_name) | |
| 221 self.assertEquals(event.timestamp_kind, ChromeInfraEvent.BEGIN) | |
| 222 | |
| 223 class SendServiceEventTest(unittest.TestCase): | |
| 224 def setUp(self): | |
| 225 event_mon.setup_monitoring(run_type='dry') | |
| 226 | |
| 227 def tearDown(self): | |
| 228 event_mon.close() | |
| 229 | |
| 230 def test_send_service_event_bad_versions(self): | |
| 231 # Check that an invalid version does not cause any exception. | |
| 232 self.assertIsInstance(config._router, router._Router) | |
| 233 self.assertIsInstance(config._cache.get('default_event'), ChromeInfraEvent) | |
| 234 | |
| 235 code_version = [{}, {'revision': 'https://fake.url'}] | |
| 236 log_event = monitoring._get_service_event( | |
| 237 'START', code_version=code_version).log_event() | |
| 238 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 239 self.assertTrue(event.HasField('service_event')) | |
| 240 self.assertTrue(event.service_event.HasField('type')) | |
| 241 self.assertEqual(len(event.service_event.code_version), 0) | |
| 242 | |
| 243 def test_send_service_event_bad_type(self): | |
| 244 # Check that an invalid type for code_version does not raise | |
| 245 # any exception. | |
| 246 | |
| 247 code_versions = [None, 123, 'string', | |
| 248 [None], [123], ['string'], [['list']]] | |
| 249 for code_version in code_versions: | |
| 250 log_event = monitoring._get_service_event( | |
| 251 'START', code_version=code_version).log_event() | |
| 252 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 253 self.assertTrue(event.HasField('service_event')) | |
| 254 self.assertTrue(event.service_event.HasField('type')) | |
| 255 self.assertEqual(len(event.service_event.code_version), 0) | |
| 256 | |
| 257 def test_send_service_event_smoke(self): | |
| 258 self.assertIsInstance(config._router, router._Router) | |
| 259 self.assertIsInstance(config._cache.get('default_event'), ChromeInfraEvent) | |
| 260 | |
| 261 self.assertTrue(event_mon.send_service_event('START')) | |
| 262 self.assertTrue(event_mon.send_service_event('START', | |
| 263 timestamp_kind=None)) | |
| 264 self.assertTrue(event_mon.send_service_event('START', | |
| 265 timestamp_kind='BEGIN')) | |
| 266 self.assertTrue(event_mon.send_service_event('STOP', | |
| 267 timestamp_kind='END', | |
| 268 event_timestamp=1234)) | |
| 269 | |
| 270 def test_send_service_errors(self): | |
| 271 self.assertIsInstance(config._router, router._Router) | |
| 272 self.assertIsInstance(config._cache.get('default_event'), ChromeInfraEvent) | |
| 273 | |
| 274 self.assertFalse(event_mon.send_service_event('invalid')) | |
| 275 self.assertFalse(event_mon.send_service_event('START', | |
| 276 timestamp_kind='invalid')) | |
| 277 self.assertFalse(event_mon.send_service_event( | |
| 278 'START', event_timestamp='2015-01-25')) | |
| 279 | |
| 280 | |
| 281 class GetBuildEventTest(unittest.TestCase): | |
| 282 def setUp(self): | |
| 283 event_mon.setup_monitoring(run_type='dry') | |
| 284 | |
| 285 def tearDown(self): | |
| 286 event_mon.close() | |
| 287 | |
| 288 def test_get_build_event_default(self): | |
| 289 hostname = 'bot.host.name' | |
| 290 build_name = 'build_name' | |
| 291 log_event = monitoring.get_build_event( | |
| 292 'BUILD', hostname, build_name).log_event() | |
| 293 | |
| 294 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 295 self.assertTrue(log_event.HasField('event_time_ms')) | |
| 296 self.assertTrue(log_event.HasField('source_extension')) | |
| 297 | |
| 298 # Check that source_extension deserializes to the right thing. | |
| 299 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 300 self.assertTrue(event.HasField('build_event')) | |
| 301 self.assertEquals(event.build_event.type, BuildEvent.BUILD) | |
| 302 self.assertEquals(event.build_event.host_name, hostname) | |
| 303 self.assertEquals(event.build_event.build_name, build_name) | |
| 304 | |
| 305 def test_get_build_event_with_patch_url(self): | |
| 306 patch_url = 'http://foo.bar/123#456' | |
| 307 log_event = monitoring.get_build_event( | |
| 308 'BUILD', 'bot.host.name', 'build_name', patch_url=patch_url).log_event() | |
| 309 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 310 | |
| 311 # Check that source_extension deserializes to the right thing. | |
| 312 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 313 self.assertTrue(event.HasField('build_event')) | |
| 314 self.assertEquals(event.build_event.patch_url, patch_url) | |
| 315 | |
| 316 def test_get_build_event_with_bbucket_id(self): | |
| 317 log_event = monitoring.get_build_event( | |
| 318 'BUILD', 'bot.host.name', 'build_name', bbucket_id=123).log_event() | |
| 319 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 320 | |
| 321 # Check that source_extension deserializes to the right thing. | |
| 322 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 323 self.assertTrue(event.HasField('build_event')) | |
| 324 self.assertEquals(event.build_event.bbucket_id, 123) | |
| 325 | |
| 326 # Try invalid value. This should not throw any exceptions. | |
| 327 log_event = monitoring.get_build_event( | |
| 328 'BUILD', 'bot.host.name', 'build_name', bbucket_id='foo').log_event() | |
| 329 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 330 | |
| 331 def test_get_build_event_with_category(self): | |
| 332 log_event = monitoring.get_build_event( | |
| 333 'BUILD', 'bot.host.name', 'build_name', | |
| 334 category='git_cl_try').log_event() | |
| 335 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 336 | |
| 337 # Check that source_extension deserializes to the right thing. | |
| 338 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 339 self.assertTrue(event.HasField('build_event')) | |
| 340 self.assertEquals( | |
| 341 event.build_event.category, BuildEvent.CATEGORY_GIT_CL_TRY) | |
| 342 | |
| 343 # Try unknown value. Should produce CATEGORY_UNKNOWN. | |
| 344 log_event = monitoring.get_build_event( | |
| 345 'BUILD', 'bot.host.name', 'build_name', category='foobar').log_event() | |
| 346 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 347 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 348 self.assertTrue(event.HasField('build_event')) | |
| 349 self.assertEquals( | |
| 350 event.build_event.category, BuildEvent.CATEGORY_UNKNOWN) | |
| 351 | |
| 352 # Try empty value. Should not set category. | |
| 353 log_event = monitoring.get_build_event( | |
| 354 'BUILD', 'bot.host.name', 'build_name', category='').log_event() | |
| 355 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 356 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 357 self.assertTrue(event.HasField('build_event')) | |
| 358 self.assertFalse(event.build_event.HasField('category')) | |
| 359 | |
| 360 def test_get_build_event_invalid_type(self): | |
| 361 # An invalid type is a critical error. | |
| 362 log_event = monitoring.get_build_event('INVALID_TYPE', | |
| 363 'bot.host.name', | |
| 364 'build_name').log_event() | |
| 365 self.assertIsNone(log_event) | |
| 366 | |
| 367 def test_get_build_event_invalid_build_name(self): | |
| 368 # an invalid builder name is not a critical error. | |
| 369 hostname = 'bot.host.name' | |
| 370 log_event = monitoring.get_build_event('BUILD', hostname, '').log_event() | |
| 371 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 372 | |
| 373 # Check that source_extension deserializes to the right thing. | |
| 374 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 375 self.assertTrue(event.HasField('build_event')) | |
| 376 self.assertEquals(event.build_event.type, BuildEvent.BUILD) | |
| 377 self.assertEquals(event.build_event.host_name, hostname) | |
| 378 | |
| 379 self.assertFalse(event.build_event.HasField('build_name')) | |
| 380 | |
| 381 def test_get_build_event_invalid_hostname(self): | |
| 382 # an invalid hostname is not a critical error. | |
| 383 builder_name = 'builder_name' | |
| 384 log_event = monitoring.get_build_event( | |
| 385 'BUILD', None, builder_name).log_event() | |
| 386 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 387 | |
| 388 # Check that source_extension deserializes to the right thing. | |
| 389 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 390 self.assertTrue(event.HasField('build_event')) | |
| 391 self.assertEquals(event.build_event.type, BuildEvent.BUILD) | |
| 392 self.assertEquals(event.build_event.build_name, builder_name) | |
| 393 | |
| 394 self.assertFalse(event.build_event.HasField('host_name')) | |
| 395 | |
| 396 def test_get_build_event_with_build_zero(self): | |
| 397 # testing 0 is important because bool(0) == False | |
| 398 hostname = 'bot.host.name' | |
| 399 build_name = 'build_name' | |
| 400 build_number = 0 | |
| 401 build_scheduling_time = 123456789 | |
| 402 log_event = monitoring.get_build_event( | |
| 403 'BUILD', | |
| 404 hostname, | |
| 405 build_name, | |
| 406 build_number=build_number, | |
| 407 build_scheduling_time=build_scheduling_time).log_event() | |
| 408 | |
| 409 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 410 | |
| 411 # Check that source_extension deserializes to the right thing. | |
| 412 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 413 self.assertTrue(event.HasField('build_event')) | |
| 414 self.assertEquals(event.build_event.type, BuildEvent.BUILD) | |
| 415 self.assertEquals(event.build_event.host_name, hostname) | |
| 416 self.assertEquals(event.build_event.build_name, build_name) | |
| 417 self.assertEquals(event.build_event.build_number, build_number) | |
| 418 self.assertEquals(event.build_event.build_scheduling_time_ms, | |
| 419 build_scheduling_time) | |
| 420 | |
| 421 def test_get_build_event_with_build_non_zero(self): | |
| 422 hostname = 'bot.host.name' | |
| 423 build_name = 'build_name' | |
| 424 build_number = 314159265 # int32 | |
| 425 build_scheduling_time = 123456789 | |
| 426 log_event = monitoring.get_build_event( | |
| 427 'BUILD', | |
| 428 hostname, | |
| 429 build_name, | |
| 430 build_number=build_number, | |
| 431 build_scheduling_time=build_scheduling_time).log_event() | |
| 432 | |
| 433 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 434 | |
| 435 # Check that source_extension deserializes to the right thing. | |
| 436 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 437 self.assertTrue(event.HasField('build_event')) | |
| 438 self.assertEquals(event.build_event.type, BuildEvent.BUILD) | |
| 439 self.assertEquals(event.build_event.host_name, hostname) | |
| 440 self.assertEquals(event.build_event.build_name, build_name) | |
| 441 self.assertEquals(event.build_event.build_number, build_number) | |
| 442 self.assertEquals(event.build_event.build_scheduling_time_ms, | |
| 443 build_scheduling_time) | |
| 444 | |
| 445 def test_get_build_event_invalid_scheduler(self): | |
| 446 # Providing a build number on a scheduler event is invalid. | |
| 447 hostname = 'bot.host.name' | |
| 448 build_name = 'build_name' | |
| 449 build_number = 314159265 # int32 | |
| 450 log_event = monitoring.get_build_event( | |
| 451 'SCHEDULER', | |
| 452 hostname, | |
| 453 build_name, | |
| 454 build_number=build_number).log_event() | |
| 455 | |
| 456 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 457 | |
| 458 # Check that source_extension deserializes to the right thing. | |
| 459 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 460 self.assertTrue(event.HasField('build_event')) | |
| 461 self.assertEquals(event.build_event.type, BuildEvent.SCHEDULER) | |
| 462 self.assertEquals(event.build_event.host_name, hostname) | |
| 463 self.assertEquals(event.build_event.build_name, build_name) | |
| 464 self.assertEquals(event.build_event.build_number, build_number) | |
| 465 | |
| 466 self.assertFalse(event.build_event.HasField('build_scheduling_time_ms')) | |
| 467 | |
| 468 def test_get_build_event_invalid_buildname(self): | |
| 469 hostname = 'bot.host.name' | |
| 470 build_name = 'build_name' | |
| 471 build_number = 314159265 # int32 | |
| 472 build_scheduling_time = 123456789 | |
| 473 log_event = monitoring.get_build_event( | |
| 474 'BUILD', | |
| 475 hostname, | |
| 476 build_name, | |
| 477 build_number=build_number, | |
| 478 build_scheduling_time=build_scheduling_time).log_event() | |
| 479 | |
| 480 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 481 | |
| 482 # Check that source_extension deserializes to the right thing. | |
| 483 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 484 self.assertTrue(event.HasField('build_event')) | |
| 485 self.assertEquals(event.build_event.type, BuildEvent.BUILD) | |
| 486 self.assertEquals(event.build_event.host_name, hostname) | |
| 487 self.assertEquals(event.build_event.build_name, build_name) | |
| 488 self.assertEquals(event.build_event.build_number, build_number) | |
| 489 self.assertEquals(event.build_event.build_scheduling_time_ms, | |
| 490 build_scheduling_time) | |
| 491 | |
| 492 def test_get_build_event_missing_build_number(self): | |
| 493 hostname = 'bot.host.name' | |
| 494 build_name = 'build_name' | |
| 495 build_scheduling_time = 123456789 | |
| 496 log_event = monitoring.get_build_event( | |
| 497 'BUILD', | |
| 498 hostname, | |
| 499 build_name, | |
| 500 build_scheduling_time=build_scheduling_time).log_event() | |
| 501 | |
| 502 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 503 | |
| 504 # Check that source_extension deserializes to the right thing. | |
| 505 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 506 self.assertTrue(event.HasField('build_event')) | |
| 507 self.assertEquals(event.build_event.type, BuildEvent.BUILD) | |
| 508 self.assertEquals(event.build_event.host_name, hostname) | |
| 509 self.assertEquals(event.build_event.build_name, build_name) | |
| 510 self.assertEquals(event.build_event.build_scheduling_time_ms, | |
| 511 build_scheduling_time) | |
| 512 | |
| 513 self.assertFalse(event.build_event.HasField('build_number')) | |
| 514 | |
| 515 def test_get_build_event_with_default_build_number(self): | |
| 516 event_mon.setup_monitoring() | |
| 517 orig_event = event_mon.get_default_event() | |
| 518 build_number = 123 | |
| 519 orig_event.build_event.build_number = build_number | |
| 520 event_mon.set_default_event(orig_event) | |
| 521 | |
| 522 hostname = 'bot.host.name' | |
| 523 build_name = 'build_name' | |
| 524 build_scheduling_time = 123456789 | |
| 525 log_event = monitoring.get_build_event( | |
| 526 'BUILD', | |
| 527 hostname, | |
| 528 build_name, | |
| 529 build_scheduling_time=build_scheduling_time).log_event() | |
| 530 | |
| 531 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 532 | |
| 533 # Check that source_extension deserializes to the right thing. | |
| 534 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 535 self.assertTrue(event.HasField('build_event')) | |
| 536 self.assertEquals(event.build_event.type, BuildEvent.BUILD) | |
| 537 self.assertEquals(event.build_event.host_name, hostname) | |
| 538 self.assertEquals(event.build_event.build_name, build_name) | |
| 539 self.assertEquals(event.build_event.build_scheduling_time_ms, | |
| 540 build_scheduling_time) | |
| 541 | |
| 542 self.assertEquals(event.build_event.build_number, build_number) | |
| 543 | |
| 544 def test_get_build_event_build_number_overwrites_default(self): | |
| 545 event_mon.setup_monitoring() | |
| 546 orig_event = event_mon.get_default_event() | |
| 547 orig_event.build_event.build_number = 123 | |
| 548 event_mon.set_default_event(orig_event) | |
| 549 | |
| 550 hostname = 'bot.host.name' | |
| 551 build_name = 'build_name' | |
| 552 build_number = 0 # zero should override the default value | |
| 553 build_scheduling_time = 123456789 | |
| 554 log_event = monitoring.get_build_event( | |
| 555 'BUILD', | |
| 556 hostname, | |
| 557 build_name, | |
| 558 build_number=build_number, | |
| 559 build_scheduling_time=build_scheduling_time).log_event() | |
| 560 | |
| 561 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 562 | |
| 563 # Check that source_extension deserializes to the right thing. | |
| 564 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 565 self.assertTrue(event.HasField('build_event')) | |
| 566 self.assertEquals(event.build_event.type, BuildEvent.BUILD) | |
| 567 self.assertEquals(event.build_event.host_name, hostname) | |
| 568 self.assertEquals(event.build_event.build_name, build_name) | |
| 569 self.assertEquals(event.build_event.build_number, build_number) | |
| 570 self.assertEquals(event.build_event.build_scheduling_time_ms, | |
| 571 build_scheduling_time) | |
| 572 | |
| 573 def test_get_build_event_with_step_info_wrong_type(self): | |
| 574 # BUILD event with step info is invalid. | |
| 575 hostname = 'bot.host.name' | |
| 576 build_name = 'build_name' | |
| 577 build_number = 314159265 | |
| 578 build_scheduling_time = 123456789 | |
| 579 step_name = 'step_name' | |
| 580 step_text = 'step_text' | |
| 581 step_number = 0 # valid step number | |
| 582 | |
| 583 log_event = monitoring.get_build_event( | |
| 584 'BUILD', | |
| 585 hostname, | |
| 586 build_name, | |
| 587 build_number=build_number, | |
| 588 build_scheduling_time=build_scheduling_time, | |
| 589 step_name=step_name, | |
| 590 step_text=step_text, | |
| 591 step_number=step_number).log_event() | |
| 592 | |
| 593 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 594 | |
| 595 # Check that source_extension deserializes to the right thing. | |
| 596 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 597 self.assertTrue(event.HasField('build_event')) | |
| 598 self.assertEquals(event.build_event.type, BuildEvent.BUILD) | |
| 599 self.assertEquals(event.build_event.host_name, hostname) | |
| 600 self.assertEquals(event.build_event.build_name, build_name) | |
| 601 self.assertEquals(event.build_event.build_number, build_number) | |
| 602 self.assertEquals(event.build_event.build_scheduling_time_ms, | |
| 603 build_scheduling_time) | |
| 604 self.assertEquals(event.build_event.step_name, step_name) | |
| 605 self.assertEquals(event.build_event.step_text, step_text) | |
| 606 self.assertEquals(event.build_event.step_number, step_number) | |
| 607 | |
| 608 def test_get_build_event_with_step_info(self): | |
| 609 hostname = 'bot.host.name' | |
| 610 build_name = 'build_name' | |
| 611 build_number = 314159265 | |
| 612 build_scheduling_time = 123456789 | |
| 613 step_name = 'step_name' | |
| 614 step_number = 0 # valid step number | |
| 615 | |
| 616 log_event = monitoring.get_build_event( | |
| 617 'STEP', | |
| 618 hostname, | |
| 619 build_name, | |
| 620 build_number=build_number, | |
| 621 build_scheduling_time=build_scheduling_time, | |
| 622 step_name=step_name, | |
| 623 step_number=step_number).log_event() | |
| 624 | |
| 625 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 626 | |
| 627 # Check that source_extension deserializes to the right thing. | |
| 628 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 629 self.assertTrue(event.HasField('build_event')) | |
| 630 self.assertEquals(event.build_event.type, BuildEvent.STEP) | |
| 631 self.assertEquals(event.build_event.host_name, hostname) | |
| 632 self.assertEquals(event.build_event.build_name, build_name) | |
| 633 self.assertEquals(event.build_event.build_number, build_number) | |
| 634 self.assertEquals(event.build_event.build_scheduling_time_ms, | |
| 635 build_scheduling_time) | |
| 636 self.assertEquals(event.build_event.step_name, step_name) | |
| 637 self.assertEquals(event.build_event.step_number, step_number) | |
| 638 | |
| 639 def test_get_build_event_step_name_in_default(self): | |
| 640 hostname = 'bot.host.name' | |
| 641 build_name = 'build_name' | |
| 642 build_number = 314159265 | |
| 643 build_scheduling_time = 123456789 | |
| 644 step_number = 0 # valid step number | |
| 645 step_name = 'step_name' | |
| 646 | |
| 647 event_mon.setup_monitoring() | |
| 648 orig_event = event_mon.get_default_event() | |
| 649 orig_event.build_event.step_name = step_name | |
| 650 event_mon.set_default_event(orig_event) | |
| 651 | |
| 652 log_event = monitoring.get_build_event( | |
| 653 'STEP', | |
| 654 hostname, | |
| 655 build_name, | |
| 656 build_number=build_number, | |
| 657 build_scheduling_time=build_scheduling_time, | |
| 658 step_number=step_number).log_event() | |
| 659 | |
| 660 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 661 | |
| 662 # Check that source_extension deserializes to the right thing. | |
| 663 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 664 self.assertTrue(event.HasField('build_event')) | |
| 665 self.assertEquals(event.build_event.type, BuildEvent.STEP) | |
| 666 self.assertEquals(event.build_event.host_name, hostname) | |
| 667 self.assertEquals(event.build_event.build_name, build_name) | |
| 668 self.assertEquals(event.build_event.build_number, build_number) | |
| 669 self.assertEquals(event.build_event.build_scheduling_time_ms, | |
| 670 build_scheduling_time) | |
| 671 self.assertEquals(event.build_event.step_number, step_number) | |
| 672 | |
| 673 self.assertEquals(event.build_event.step_name, step_name) | |
| 674 | |
| 675 def test_get_build_event_missing_step_name(self): | |
| 676 hostname = 'bot.host.name' | |
| 677 build_name = 'build_name' | |
| 678 build_number = 314159265 | |
| 679 build_scheduling_time = 123456789 | |
| 680 step_number = 0 # valid step number | |
| 681 | |
| 682 log_event = monitoring.get_build_event( | |
| 683 'STEP', | |
| 684 hostname, | |
| 685 build_name, | |
| 686 build_number=build_number, | |
| 687 build_scheduling_time=build_scheduling_time, | |
| 688 step_number=step_number).log_event() | |
| 689 | |
| 690 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 691 | |
| 692 # Check that source_extension deserializes to the right thing. | |
| 693 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 694 self.assertTrue(event.HasField('build_event')) | |
| 695 self.assertEquals(event.build_event.type, BuildEvent.STEP) | |
| 696 self.assertEquals(event.build_event.host_name, hostname) | |
| 697 self.assertEquals(event.build_event.build_name, build_name) | |
| 698 self.assertEquals(event.build_event.build_number, build_number) | |
| 699 self.assertEquals(event.build_event.build_scheduling_time_ms, | |
| 700 build_scheduling_time) | |
| 701 self.assertEquals(event.build_event.step_number, step_number) | |
| 702 | |
| 703 self.assertFalse(event.build_event.HasField('step_name')) | |
| 704 | |
| 705 def test_get_build_event_missing_step_text(self): | |
| 706 hostname = 'bot.host.name' | |
| 707 build_name = 'build_name' | |
| 708 build_number = 314159265 | |
| 709 build_scheduling_time = 123456789 | |
| 710 step_number = 0 # valid step number | |
| 711 | |
| 712 log_event = monitoring.get_build_event( | |
| 713 'STEP', | |
| 714 hostname, | |
| 715 build_name, | |
| 716 build_number=build_number, | |
| 717 build_scheduling_time=build_scheduling_time, | |
| 718 step_number=step_number).log_event() | |
| 719 | |
| 720 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 721 | |
| 722 # Check that source_extension deserializes to the right thing. | |
| 723 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 724 self.assertTrue(event.HasField('build_event')) | |
| 725 self.assertFalse(event.build_event.HasField('step_text')) | |
| 726 | |
| 727 def test_get_build_event_missing_step_number(self): | |
| 728 hostname = 'bot.host.name' | |
| 729 build_name = 'build_name' | |
| 730 build_number = 314159265 | |
| 731 build_scheduling_time = 123456789 | |
| 732 step_name = 'step_name' | |
| 733 | |
| 734 log_event = monitoring.get_build_event( | |
| 735 'STEP', | |
| 736 hostname, | |
| 737 build_name, | |
| 738 build_number=build_number, | |
| 739 build_scheduling_time=build_scheduling_time, | |
| 740 step_name=step_name).log_event() | |
| 741 | |
| 742 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 743 | |
| 744 # Check that source_extension deserializes to the right thing. | |
| 745 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 746 self.assertTrue(event.HasField('build_event')) | |
| 747 self.assertEquals(event.build_event.type, BuildEvent.STEP) | |
| 748 self.assertEquals(event.build_event.host_name, hostname) | |
| 749 self.assertEquals(event.build_event.build_name, build_name) | |
| 750 self.assertEquals(event.build_event.build_number, build_number) | |
| 751 self.assertEquals(event.build_event.build_scheduling_time_ms, | |
| 752 build_scheduling_time) | |
| 753 self.assertEquals(event.build_event.step_name, step_name) | |
| 754 | |
| 755 self.assertFalse(event.build_event.HasField('step_number')) | |
| 756 | |
| 757 def test_get_build_event_step_info_missing_build_info(self): | |
| 758 hostname = 'bot.host.name' | |
| 759 build_name = 'build_name' | |
| 760 step_name = 'step_name' | |
| 761 step_number = 0 # valid step number | |
| 762 | |
| 763 log_event = monitoring.get_build_event( | |
| 764 'STEP', | |
| 765 hostname, | |
| 766 build_name, | |
| 767 step_name=step_name, | |
| 768 step_number=step_number).log_event() | |
| 769 | |
| 770 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 771 | |
| 772 # Check that source_extension deserializes to the right thing. | |
| 773 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 774 self.assertTrue(event.HasField('build_event')) | |
| 775 self.assertEquals(event.build_event.type, BuildEvent.STEP) | |
| 776 self.assertEquals(event.build_event.host_name, hostname) | |
| 777 self.assertEquals(event.build_event.build_name, build_name) | |
| 778 self.assertEquals(event.build_event.step_name, step_name) | |
| 779 self.assertEquals(event.build_event.step_number, step_number) | |
| 780 | |
| 781 self.assertFalse(event.build_event.HasField('build_number')) | |
| 782 self.assertFalse(event.build_event.HasField('build_scheduling_time_ms')) | |
| 783 | |
| 784 def test_get_build_event_with_invalid_result(self): | |
| 785 hostname = 'bot.host.name' | |
| 786 build_name = 'build_name' | |
| 787 build_number = 314159265 | |
| 788 build_scheduling_time = 123456789 | |
| 789 result = '---INVALID---' | |
| 790 | |
| 791 log_event = monitoring.get_build_event( | |
| 792 'BUILD', | |
| 793 hostname, | |
| 794 build_name, | |
| 795 build_number=build_number, | |
| 796 build_scheduling_time=build_scheduling_time, | |
| 797 result=result).log_event() | |
| 798 | |
| 799 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 800 | |
| 801 # Check that source_extension deserializes to the right thing. | |
| 802 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 803 self.assertTrue(event.HasField('build_event')) | |
| 804 self.assertEquals(event.build_event.type, BuildEvent.BUILD) | |
| 805 self.assertEquals(event.build_event.host_name, hostname) | |
| 806 self.assertEquals(event.build_event.build_name, build_name) | |
| 807 self.assertEquals(event.build_event.build_number, build_number) | |
| 808 self.assertEquals(event.build_event.build_scheduling_time_ms, | |
| 809 build_scheduling_time) | |
| 810 | |
| 811 self.assertFalse(event.build_event.HasField('result')) | |
| 812 | |
| 813 def test_get_build_event_with_valid_result(self): | |
| 814 hostname = 'bot.host.name' | |
| 815 build_name = 'build_name' | |
| 816 build_number = 314159265 | |
| 817 build_scheduling_time = 123456789 | |
| 818 result = 'SUCCESS' | |
| 819 | |
| 820 log_event = monitoring.get_build_event( | |
| 821 'BUILD', | |
| 822 hostname, | |
| 823 build_name, | |
| 824 build_number=build_number, | |
| 825 build_scheduling_time=build_scheduling_time, | |
| 826 result=result).log_event() | |
| 827 | |
| 828 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 829 | |
| 830 # Check that source_extension deserializes to the right thing. | |
| 831 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 832 self.assertTrue(event.HasField('build_event')) | |
| 833 self.assertEquals(event.build_event.type, BuildEvent.BUILD) | |
| 834 self.assertEquals(event.build_event.host_name, hostname) | |
| 835 self.assertEquals(event.build_event.build_name, build_name) | |
| 836 self.assertEquals(event.build_event.build_number, build_number) | |
| 837 self.assertEquals(event.build_event.build_scheduling_time_ms, | |
| 838 build_scheduling_time) | |
| 839 self.assertEquals(event.build_event.result, BuildEvent.SUCCESS) | |
| 840 | |
| 841 def test_get_build_event_test_result_mapping(self): | |
| 842 # Tests the hacky mapping between buildbot results and the proto values. | |
| 843 hostname = 'bot.host.name' | |
| 844 build_name = 'build_name' | |
| 845 build_number = 314159265 | |
| 846 build_scheduling_time = 123456789 | |
| 847 | |
| 848 # WARNINGS -> WARNING | |
| 849 log_event = monitoring.get_build_event( | |
| 850 'BUILD', | |
| 851 hostname, | |
| 852 build_name, | |
| 853 build_number=build_number, | |
| 854 build_scheduling_time=build_scheduling_time, | |
| 855 result='WARNINGS').log_event() # with an S | |
| 856 | |
| 857 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 858 | |
| 859 # Check that source_extension deserializes to the right thing. | |
| 860 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 861 self.assertTrue(event.HasField('build_event')) | |
| 862 self.assertEquals(event.build_event.type, BuildEvent.BUILD) | |
| 863 self.assertEquals(event.build_event.host_name, hostname) | |
| 864 self.assertEquals(event.build_event.build_name, build_name) | |
| 865 self.assertEquals(event.build_event.build_number, build_number) | |
| 866 self.assertEquals(event.build_event.build_scheduling_time_ms, | |
| 867 build_scheduling_time) | |
| 868 self.assertEquals(event.build_event.result, BuildEvent.WARNING) # no S | |
| 869 | |
| 870 # EXCEPTION -> INFRA_FAILURE | |
| 871 log_event = monitoring.get_build_event( | |
| 872 'BUILD', | |
| 873 hostname, | |
| 874 build_name, | |
| 875 build_number=build_number, | |
| 876 build_scheduling_time=build_scheduling_time, | |
| 877 result='EXCEPTION').log_event() | |
| 878 | |
| 879 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 880 | |
| 881 # Check that source_extension deserializes to the right thing. | |
| 882 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 883 self.assertTrue(event.HasField('build_event')) | |
| 884 self.assertEquals(event.build_event.type, BuildEvent.BUILD) | |
| 885 self.assertEquals(event.build_event.host_name, hostname) | |
| 886 self.assertEquals(event.build_event.build_name, build_name) | |
| 887 self.assertEquals(event.build_event.build_number, build_number) | |
| 888 self.assertEquals(event.build_event.build_scheduling_time_ms, | |
| 889 build_scheduling_time) | |
| 890 self.assertEquals(event.build_event.result, BuildEvent.INFRA_FAILURE) | |
| 891 | |
| 892 def test_get_build_event_valid_result_wrong_type(self): | |
| 893 # SCHEDULER can't have a result | |
| 894 hostname = 'bot.host.name' | |
| 895 build_name = 'build_name' | |
| 896 build_number = 314159265 | |
| 897 build_scheduling_time = 123456789 | |
| 898 result = 'SUCCESS' | |
| 899 | |
| 900 log_event = monitoring.get_build_event( | |
| 901 'SCHEDULER', | |
| 902 hostname, | |
| 903 build_name, | |
| 904 build_number=build_number, | |
| 905 build_scheduling_time=build_scheduling_time, | |
| 906 result=result).log_event() | |
| 907 | |
| 908 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 909 | |
| 910 # Check that source_extension deserializes to the right thing. | |
| 911 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 912 self.assertTrue(event.HasField('build_event')) | |
| 913 self.assertEquals(event.build_event.type, BuildEvent.SCHEDULER) | |
| 914 self.assertEquals(event.build_event.host_name, hostname) | |
| 915 self.assertEquals(event.build_event.build_name, build_name) | |
| 916 self.assertEquals(event.build_event.build_number, build_number) | |
| 917 self.assertEquals(event.build_event.build_scheduling_time_ms, | |
| 918 build_scheduling_time) | |
| 919 self.assertEquals(event.build_event.result, BuildEvent.SUCCESS) | |
| 920 | |
| 921 def test_get_build_event_with_non_default_service_name(self): | |
| 922 hostname = 'bot.host.name' | |
| 923 build_name = 'build_name' | |
| 924 service_name = 'my.other.nice.service' | |
| 925 log_event = monitoring.get_build_event( | |
| 926 'BUILD', hostname, build_name, service_name=service_name).log_event() | |
| 927 | |
| 928 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 929 self.assertTrue(log_event.HasField('event_time_ms')) | |
| 930 self.assertTrue(log_event.HasField('source_extension')) | |
| 931 | |
| 932 # Check that source_extension deserializes to the right thing. | |
| 933 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 934 self.assertTrue(event.HasField('build_event')) | |
| 935 self.assertEquals(event.build_event.type, BuildEvent.BUILD) | |
| 936 self.assertEquals(event.build_event.host_name, hostname) | |
| 937 self.assertEquals(event.build_event.build_name, build_name) | |
| 938 self.assertEquals(event.event_source.service_name, service_name) | |
| 939 | |
| 940 def test_get_build_event_with_unicode_service_name(self): | |
| 941 hostname = 'bot.host.name' | |
| 942 build_name = 'build_name' | |
| 943 service_name = u'à_la_française' | |
| 944 log_event = monitoring.get_build_event( | |
| 945 'BUILD', hostname, build_name, service_name=service_name).log_event() | |
| 946 | |
| 947 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 948 self.assertTrue(log_event.HasField('event_time_ms')) | |
| 949 self.assertTrue(log_event.HasField('source_extension')) | |
| 950 | |
| 951 # Check that source_extension deserializes to the right thing. | |
| 952 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 953 self.assertTrue(event.HasField('build_event')) | |
| 954 self.assertEquals(event.build_event.type, BuildEvent.BUILD) | |
| 955 self.assertEquals(event.build_event.host_name, hostname) | |
| 956 self.assertEquals(event.build_event.build_name, build_name) | |
| 957 self.assertEquals(event.event_source.service_name, service_name) | |
| 958 | |
| 959 def test_get_build_event_with_invalid_service_name(self): | |
| 960 hostname = 'bot.host.name' | |
| 961 build_name = 'build_name' | |
| 962 service_name = 1234 # invalid | |
| 963 log_event = monitoring.get_build_event( | |
| 964 'BUILD', hostname, build_name, service_name=service_name).log_event() | |
| 965 | |
| 966 self.assertIsNone(log_event) | |
| 967 | |
| 968 def test_get_build_event_with_extra_result_code_string(self): | |
| 969 hostname = 'bot.host.name' | |
| 970 build_name = 'build_name' | |
| 971 service_name = 'my nice service' | |
| 972 log_event = monitoring.get_build_event( | |
| 973 'BUILD', hostname, build_name, service_name=service_name, | |
| 974 extra_result_code='result').log_event() | |
| 975 | |
| 976 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 977 self.assertTrue(log_event.HasField('event_time_ms')) | |
| 978 self.assertTrue(log_event.HasField('source_extension')) | |
| 979 | |
| 980 # Check that source_extension deserializes to the right thing. | |
| 981 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 982 self.assertTrue(event.HasField('build_event')) | |
| 983 self.assertEquals(event.build_event.type, BuildEvent.BUILD) | |
| 984 self.assertEquals(event.build_event.host_name, hostname) | |
| 985 self.assertEquals(event.build_event.build_name, build_name) | |
| 986 self.assertEquals(event.event_source.service_name, service_name) | |
| 987 self.assertEquals(event.build_event.extra_result_code, ['result']) | |
| 988 | |
| 989 def test_get_build_event_with_extra_result_code_list(self): | |
| 990 hostname = 'bot.host.name' | |
| 991 build_name = 'build_name' | |
| 992 service_name = 'my nice service' | |
| 993 extra_results = ['result1', 'result2'] | |
| 994 log_event = monitoring.get_build_event( | |
| 995 'BUILD', hostname, build_name, service_name=service_name, | |
| 996 extra_result_code=extra_results).log_event() | |
| 997 | |
| 998 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 999 self.assertTrue(log_event.HasField('event_time_ms')) | |
| 1000 self.assertTrue(log_event.HasField('source_extension')) | |
| 1001 | |
| 1002 # Check that source_extension deserializes to the right thing. | |
| 1003 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 1004 self.assertTrue(event.HasField('build_event')) | |
| 1005 self.assertEquals(event.build_event.type, BuildEvent.BUILD) | |
| 1006 self.assertEquals(event.build_event.host_name, hostname) | |
| 1007 self.assertEquals(event.build_event.build_name, build_name) | |
| 1008 self.assertEquals(event.event_source.service_name, service_name) | |
| 1009 self.assertEquals(event.build_event.extra_result_code, extra_results) | |
| 1010 | |
| 1011 def test_get_build_event_with_extra_result_code_invalid_scalar(self): | |
| 1012 hostname = 'bot.host.name' | |
| 1013 build_name = 'build_name' | |
| 1014 service_name = 'my nice service' | |
| 1015 extra_results = 1234 | |
| 1016 log_event = monitoring.get_build_event( | |
| 1017 'BUILD', hostname, build_name, service_name=service_name, | |
| 1018 extra_result_code=extra_results).log_event() | |
| 1019 | |
| 1020 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 1021 self.assertTrue(log_event.HasField('event_time_ms')) | |
| 1022 self.assertTrue(log_event.HasField('source_extension')) | |
| 1023 | |
| 1024 # Check that source_extension deserializes to the right thing. | |
| 1025 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 1026 self.assertTrue(event.HasField('build_event')) | |
| 1027 self.assertEquals(event.build_event.type, BuildEvent.BUILD) | |
| 1028 self.assertEquals(event.build_event.host_name, hostname) | |
| 1029 self.assertEquals(event.build_event.build_name, build_name) | |
| 1030 self.assertEquals(event.event_source.service_name, service_name) | |
| 1031 self.assertEquals(len(event.build_event.extra_result_code), 0) | |
| 1032 | |
| 1033 def test_get_build_event_with_extra_result_code_invalid_list(self): | |
| 1034 hostname = 'bot.host.name' | |
| 1035 build_name = 'build_name' | |
| 1036 service_name = 'my nice service' | |
| 1037 extra_results = [1234, 'result'] | |
| 1038 log_event = monitoring.get_build_event( | |
| 1039 'BUILD', hostname, build_name, service_name=service_name, | |
| 1040 extra_result_code=extra_results).log_event() | |
| 1041 | |
| 1042 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 1043 self.assertTrue(log_event.HasField('event_time_ms')) | |
| 1044 self.assertTrue(log_event.HasField('source_extension')) | |
| 1045 | |
| 1046 # Check that source_extension deserializes to the right thing. | |
| 1047 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 1048 self.assertTrue(event.HasField('build_event')) | |
| 1049 self.assertEquals(event.build_event.type, BuildEvent.BUILD) | |
| 1050 self.assertEquals(event.build_event.host_name, hostname) | |
| 1051 self.assertEquals(event.build_event.build_name, build_name) | |
| 1052 self.assertEquals(event.event_source.service_name, service_name) | |
| 1053 self.assertEquals(event.build_event.extra_result_code, ['result']) | |
| 1054 | |
| 1055 def test_get_build_event_with_goma_stats(self): | |
| 1056 hostname = 'bot.host.name' | |
| 1057 build_name = 'build_name' | |
| 1058 service_name = 'my nice service' | |
| 1059 goma_stats = GomaStats() | |
| 1060 goma_stats.request_stats.total = 42 | |
| 1061 | |
| 1062 log_event = monitoring.get_build_event( | |
| 1063 'BUILD', hostname, build_name, service_name=service_name, | |
| 1064 goma_stats=goma_stats).log_event() | |
| 1065 | |
| 1066 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 1067 self.assertTrue(log_event.HasField('event_time_ms')) | |
| 1068 self.assertTrue(log_event.HasField('source_extension')) | |
| 1069 | |
| 1070 # Check that source_extension deserializes to the right thing. | |
| 1071 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 1072 self.assertTrue(event.HasField('build_event')) | |
| 1073 self.assertEquals(event.build_event.type, BuildEvent.BUILD) | |
| 1074 self.assertEquals(event.build_event.host_name, hostname) | |
| 1075 self.assertEquals(event.build_event.build_name, build_name) | |
| 1076 self.assertEquals(event.event_source.service_name, service_name) | |
| 1077 self.assertEquals(event.build_event.goma_stats, goma_stats) | |
| 1078 | |
| 1079 def test_get_build_event_invalid_goma_stats(self): | |
| 1080 hostname = 'bot.host.name' | |
| 1081 build_name = 'build_name' | |
| 1082 service_name = 'my nice service' | |
| 1083 | |
| 1084 log_event = monitoring.get_build_event( | |
| 1085 'BUILD', hostname, build_name, service_name=service_name, | |
| 1086 goma_stats='what-is-a-string-doing-here?').log_event() | |
| 1087 | |
| 1088 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 1089 self.assertTrue(log_event.HasField('event_time_ms')) | |
| 1090 self.assertTrue(log_event.HasField('source_extension')) | |
| 1091 | |
| 1092 # Check that source_extension deserializes to the right thing. | |
| 1093 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 1094 self.assertTrue(event.HasField('build_event')) | |
| 1095 self.assertEquals(event.build_event.type, BuildEvent.BUILD) | |
| 1096 self.assertEquals(event.build_event.host_name, hostname) | |
| 1097 self.assertEquals(event.build_event.build_name, build_name) | |
| 1098 self.assertEquals(event.event_source.service_name, service_name) | |
| 1099 self.assertFalse(event.build_event.HasField('goma_stats')) | |
| 1100 | |
| 1101 def test_get_build_event_with_goma_error_unknown(self): | |
| 1102 hostname = 'bot.host.name' | |
| 1103 build_name = 'build_name' | |
| 1104 service_name = 'my nice service' | |
| 1105 goma_error = 'GOMA_ERROR_UNKNOWN' | |
| 1106 | |
| 1107 log_event = monitoring.get_build_event( | |
| 1108 'BUILD', hostname, build_name, service_name=service_name, | |
| 1109 goma_error=goma_error).log_event() | |
| 1110 | |
| 1111 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 1112 self.assertTrue(log_event.HasField('event_time_ms')) | |
| 1113 self.assertTrue(log_event.HasField('source_extension')) | |
| 1114 | |
| 1115 # Check that source_extension deserializes to the right thing. | |
| 1116 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 1117 self.assertTrue(event.HasField('build_event')) | |
| 1118 self.assertEquals(event.build_event.type, BuildEvent.BUILD) | |
| 1119 self.assertEquals(event.build_event.host_name, hostname) | |
| 1120 self.assertEquals(event.build_event.build_name, build_name) | |
| 1121 self.assertEquals(event.event_source.service_name, service_name) | |
| 1122 self.assertEquals(event.build_event.goma_error, | |
| 1123 BuildEvent.GOMA_ERROR_UNKNOWN) | |
| 1124 | |
| 1125 def test_get_build_event_with_goma_error_crash(self): | |
| 1126 hostname = 'bot.host.name' | |
| 1127 build_name = 'build_name' | |
| 1128 service_name = 'my nice service' | |
| 1129 goma_error = 'GOMA_ERROR_CRASHED' | |
| 1130 goma_crash_report_id = '0123456789abcdef' | |
| 1131 | |
| 1132 log_event = monitoring.get_build_event( | |
| 1133 'BUILD', hostname, build_name, service_name=service_name, | |
| 1134 goma_error=goma_error, goma_crash_report_id=goma_crash_report_id | |
| 1135 ).log_event() | |
| 1136 | |
| 1137 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 1138 self.assertTrue(log_event.HasField('event_time_ms')) | |
| 1139 self.assertTrue(log_event.HasField('source_extension')) | |
| 1140 | |
| 1141 # Check that source_extension deserializes to the right thing. | |
| 1142 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 1143 self.assertTrue(event.HasField('build_event')) | |
| 1144 self.assertEquals(event.build_event.type, BuildEvent.BUILD) | |
| 1145 self.assertEquals(event.build_event.host_name, hostname) | |
| 1146 self.assertEquals(event.build_event.build_name, build_name) | |
| 1147 self.assertEquals(event.event_source.service_name, service_name) | |
| 1148 self.assertEquals(event.build_event.goma_error, | |
| 1149 BuildEvent.GOMA_ERROR_CRASHED) | |
| 1150 self.assertEquals(event.build_event.goma_crash_report_id, | |
| 1151 goma_crash_report_id) | |
| 1152 | |
| 1153 def test_get_build_event_with_goma_error_non_crash_with_crash_id(self): | |
| 1154 hostname = 'bot.host.name' | |
| 1155 build_name = 'build_name' | |
| 1156 service_name = 'my nice service' | |
| 1157 goma_error = 'GOMA_ERROR_UNKNOWN' | |
| 1158 goma_crash_report_id = '0123456789abcdef' | |
| 1159 | |
| 1160 log_event = monitoring.get_build_event( | |
| 1161 'BUILD', hostname, build_name, service_name=service_name, | |
| 1162 goma_error=goma_error, goma_crash_report_id=goma_crash_report_id | |
| 1163 ).log_event() | |
| 1164 | |
| 1165 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 1166 self.assertTrue(log_event.HasField('event_time_ms')) | |
| 1167 self.assertTrue(log_event.HasField('source_extension')) | |
| 1168 | |
| 1169 # Check that source_extension deserializes to the right thing. | |
| 1170 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 1171 self.assertTrue(event.HasField('build_event')) | |
| 1172 self.assertEquals(event.build_event.type, BuildEvent.BUILD) | |
| 1173 self.assertEquals(event.build_event.host_name, hostname) | |
| 1174 self.assertEquals(event.build_event.build_name, build_name) | |
| 1175 self.assertEquals(event.event_source.service_name, service_name) | |
| 1176 self.assertEquals(event.build_event.goma_error, | |
| 1177 BuildEvent.GOMA_ERROR_UNKNOWN) | |
| 1178 self.assertEquals(event.build_event.goma_crash_report_id, | |
| 1179 goma_crash_report_id) | |
| 1180 | |
| 1181 def test_get_build_event_with_both_goma_error_and_stats(self): | |
| 1182 hostname = 'bot.host.name' | |
| 1183 build_name = 'build_name' | |
| 1184 service_name = 'my nice service' | |
| 1185 goma_error = 'GOMA_ERROR_UNKNOWN' | |
| 1186 goma_stats = GomaStats() | |
| 1187 goma_stats.request_stats.total = 42 | |
| 1188 | |
| 1189 log_event = monitoring.get_build_event( | |
| 1190 'BUILD', hostname, build_name, service_name=service_name, | |
| 1191 goma_stats=goma_stats, goma_error=goma_error, | |
| 1192 ).log_event() | |
| 1193 | |
| 1194 self.assertIsInstance(log_event, LogRequestLite.LogEventLite) | |
| 1195 self.assertTrue(log_event.HasField('event_time_ms')) | |
| 1196 self.assertTrue(log_event.HasField('source_extension')) | |
| 1197 | |
| 1198 # Check that source_extension deserializes to the right thing. | |
| 1199 event = ChromeInfraEvent.FromString(log_event.source_extension) | |
| 1200 self.assertTrue(event.HasField('build_event')) | |
| 1201 self.assertEquals(event.build_event.type, BuildEvent.BUILD) | |
| 1202 self.assertEquals(event.build_event.host_name, hostname) | |
| 1203 self.assertEquals(event.build_event.build_name, build_name) | |
| 1204 self.assertEquals(event.event_source.service_name, service_name) | |
| 1205 # warns but allow to have both. | |
| 1206 self.assertEquals(event.build_event.goma_error, | |
| 1207 BuildEvent.GOMA_ERROR_UNKNOWN) | |
| 1208 self.assertEquals(event.build_event.goma_stats, goma_stats) | |
| 1209 | |
| 1210 | |
| 1211 class SendBuildEventTest(unittest.TestCase): | |
| 1212 def setUp(self): | |
| 1213 event_mon.setup_monitoring(run_type='dry') | |
| 1214 | |
| 1215 def tearDown(self): | |
| 1216 event_mon.close() | |
| 1217 | |
| 1218 def test_send_build_event_smoke(self): | |
| 1219 self.assertIsInstance(config._router, router._Router) | |
| 1220 self.assertIsInstance(config._cache.get('default_event'), ChromeInfraEvent) | |
| 1221 | |
| 1222 self.assertTrue(event_mon.send_build_event('BUILD', | |
| 1223 'bot.host.name', | |
| 1224 'build.name')) | |
| 1225 self.assertTrue(event_mon.send_build_event( | |
| 1226 'BUILD', | |
| 1227 'bot.host.name', | |
| 1228 'build_name', | |
| 1229 build_number=1, | |
| 1230 build_scheduling_time=123456789, | |
| 1231 result='FAILURE', | |
| 1232 timestamp_kind='POINT', | |
| 1233 event_timestamp=None)) | |
| 1234 | |
| 1235 | |
| 1236 class SendEventsTest(unittest.TestCase): | |
| 1237 def setUp(self): | |
| 1238 event_mon.setup_monitoring(run_type='dry') | |
| 1239 | |
| 1240 def tearDown(self): | |
| 1241 event_mon.close() | |
| 1242 | |
| 1243 def test_send_events_smoke(self): | |
| 1244 self.assertIsInstance(config._router, router._Router) | |
| 1245 self.assertIsInstance(config._cache.get('default_event'), ChromeInfraEvent) | |
| 1246 | |
| 1247 events = [ | |
| 1248 event_mon.get_build_event( | |
| 1249 'BUILD', | |
| 1250 'bot.host.name', | |
| 1251 'build_name', | |
| 1252 build_number=1, | |
| 1253 build_scheduling_time=123456789, | |
| 1254 result='FAILURE', | |
| 1255 timestamp_kind='POINT', | |
| 1256 event_timestamp=None), | |
| 1257 event_mon.get_build_event( | |
| 1258 'BUILD', | |
| 1259 'bot2.host.name', | |
| 1260 'build_name2', | |
| 1261 build_number=1, | |
| 1262 build_scheduling_time=123456789, | |
| 1263 result='FAILURE', | |
| 1264 timestamp_kind='POINT', | |
| 1265 event_timestamp=None), | |
| 1266 ] | |
| 1267 self.assertTrue(monitoring.send_events(events)) | |
| OLD | NEW |