| Index: infra/tools/send_monitoring_event/test/send_event_test.py
|
| diff --git a/infra/tools/send_monitoring_event/test/send_event_test.py b/infra/tools/send_monitoring_event/test/send_event_test.py
|
| index e4db55fd70aba3deaa6d39651f85a5a111708e8f..4cdee7ac9acdb5f4b1c311af27d43c150da63eb8 100755
|
| --- a/infra/tools/send_monitoring_event/test/send_event_test.py
|
| +++ b/infra/tools/send_monitoring_event/test/send_event_test.py
|
| @@ -6,10 +6,15 @@ import argparse
|
| import os
|
| import unittest
|
|
|
| +import google.protobuf
|
| +
|
| import infra_libs
|
| from infra_libs import event_mon
|
| +
|
| from infra.tools.send_monitoring_event import send_event
|
|
|
| +from infra_libs.event_mon import (BuildEvent, ServiceEvent,
|
| + ChromeInfraEvent, LogRequestLite)
|
|
|
| DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'data')
|
|
|
| @@ -88,11 +93,249 @@ class TestBuildEvent(SendingEventBaseTest):
|
| '--build-event-type', 'SCHEDULER',
|
| '--build-event-hostname', 'foo.bar.dns',
|
| '--build-event-build-name', 'whatever'])
|
| - self.assertEquals(args.event_mon_run_type, 'dry')
|
| - send_event.send_build_event(args)
|
| + self.assertTrue(send_event.send_build_event(args))
|
| +
|
| + def test_send_build_event_smoke_missing_goma_file(self):
|
| + args = send_event.get_arguments(
|
| + ['--event-mon-service-name', 'thing',
|
| + '--build-event-type', 'BUILD',
|
| + '--build-event-hostname', 'foo.bar.dns',
|
| + '--build-event-build-name', 'whatever',
|
| + '--build-event-goma-stats-path',
|
| + os.path.join(DATA_DIR, 'this-file-does-not-exist')])
|
| + with self.assertRaises(IOError):
|
| + send_event.send_build_event(args)
|
|
|
|
|
| -class TestEventsFromFile(SendingEventBaseTest):
|
| +class TestInputModesFile(unittest.TestCase):
|
| + # Test the various ways to pass information to send_monitoring_event
|
| + # TODO(pgervais): test precedence order.
|
| + def tearDown(self):
|
| + event_mon.close()
|
| +
|
| + def test_send_build_event_with_goma_stats(self):
|
| + # Write a file to avoid mocks
|
| + with infra_libs.temporary_directory(prefix='send_event_test-') as tmpdir:
|
| + outfile = os.path.join(tmpdir, 'out.bin')
|
| + args = send_event.get_arguments(
|
| + ['--event-mon-run-type', 'file',
|
| + '--event-mon-output-file', outfile,
|
| + '--event-mon-service-name', 'thing',
|
| + '--build-event-type', 'BUILD',
|
| + '--build-event-hostname', 'foo.bar.dns',
|
| + '--build-event-build-name', 'whatever',
|
| + '--build-event-goma-stats-path',
|
| + os.path.join(DATA_DIR, 'goma_stats.bin')])
|
| + self.assertEquals(args.event_mon_run_type, 'file')
|
| + event_mon.process_argparse_options(args)
|
| + self.assertTrue(send_event.send_build_event(args))
|
| +
|
| + # Now open the resulting file and check what was written
|
| + with open(outfile, 'rb') as f:
|
| + request = LogRequestLite.FromString(f.read())
|
| +
|
| + self.assertEqual(len(request.log_event), 1)
|
| + event = ChromeInfraEvent.FromString(request.log_event[0].source_extension)
|
| + self.assertEqual(event.build_event.goma_stats.request_stats.total, 10)
|
| + self.assertEqual(event.build_event.goma_stats.request_stats.success, 9)
|
| + self.assertEqual(event.build_event.goma_stats.request_stats.failure, 1)
|
| + self.assertEqual(event.build_event.host_name, 'foo.bar.dns')
|
| +
|
| + def test_send_build_event_with_invalid_goma_stats(self):
|
| + # Write a file to avoid mocks
|
| + with infra_libs.temporary_directory(prefix='send_event_test-') as tmpdir:
|
| + outfile = os.path.join(tmpdir, 'out.bin')
|
| + args = send_event.get_arguments(
|
| + ['--event-mon-run-type', 'file',
|
| + '--event-mon-output-file', outfile,
|
| + '--event-mon-service-name', 'thing',
|
| + '--build-event-type', 'BUILD',
|
| + '--build-event-hostname', 'foo.bar.dns',
|
| + '--build-event-build-name', 'whatever',
|
| + '--build-event-goma-stats-path',
|
| + os.path.join(DATA_DIR, 'garbage')])
|
| + self.assertEquals(args.event_mon_run_type, 'file')
|
| + event_mon.process_argparse_options(args)
|
| + with self.assertRaises(google.protobuf.message.DecodeError):
|
| + send_event.send_build_event(args)
|
| +
|
| + # The default event used below (build-foo-builder.bin) has been generated by:
|
| + # ./run.py infra.tools.send_monitoring_event \
|
| + # --event-mon-run-type=file \
|
| + # --event-mon-output-file=./build-foo-builder.bin \
|
| + # --build-event-hostname=myhostname \
|
| + # --event-mon-timestamp-kind=BEGIN \
|
| + # --event-mon-event-timestamp=123 \
|
| + # --build-event-type=BUILD \
|
| + # --build-event-build-name=foo"
|
| + def test_logrequest_path_valid_build_event(self):
|
| + with infra_libs.temporary_directory(prefix='send_event_test-') as tmpdir:
|
| + outfile = os.path.join(tmpdir, 'out.bin')
|
| + args = send_event.get_arguments(
|
| + ['--event-mon-run-type', 'file',
|
| + '--event-mon-output-file', outfile,
|
| + '--event-mon-service-name', 'thing',
|
| + '--event-logrequest-path',
|
| + os.path.join(DATA_DIR, 'build-foo-builder.bin'),
|
| + '--build-event-build-number', '3'
|
| + ])
|
| + self.assertEquals(args.event_mon_run_type, 'file')
|
| + event_mon.process_argparse_options(args)
|
| + send_event._process_logrequest_path(args)
|
| + self.assertTrue(send_event.send_build_event(args))
|
| +
|
| + # Now open the resulting file and check what was written
|
| + with open(outfile, 'rb') as f:
|
| + request = LogRequestLite.FromString(f.read())
|
| +
|
| + self.assertEqual(len(request.log_event), 1)
|
| + event = ChromeInfraEvent.FromString(request.log_event[0].source_extension)
|
| + self.assertEqual(event.build_event.host_name, 'myhostname')
|
| + self.assertEqual(event.build_event.build_number, 3)
|
| + self.assertEqual(event.timestamp_kind, ChromeInfraEvent.BEGIN)
|
| +
|
| + def test_logrequest_path_build_type_override(self):
|
| + # logrequest contains build event, overrid the type with an arg.
|
| + with infra_libs.temporary_directory(prefix='send_event_test-') as tmpdir:
|
| + outfile = os.path.join(tmpdir, 'out.bin')
|
| + args = send_event.get_arguments(
|
| + ['--event-mon-run-type', 'file',
|
| + '--event-mon-output-file', outfile,
|
| + '--event-mon-service-name', 'thing',
|
| + '--event-logrequest-path',
|
| + os.path.join(DATA_DIR, 'build-foo-builder.bin'),
|
| + '--build-event-build-number', '3',
|
| + '--build-event-type', 'STEP',
|
| + ])
|
| + self.assertEquals(args.event_mon_run_type, 'file')
|
| + event_mon.process_argparse_options(args)
|
| + send_event._process_logrequest_path(args)
|
| + self.assertTrue(send_event.send_build_event(args))
|
| +
|
| + # Now open the resulting file and check what was written
|
| + with open(outfile, 'rb') as f:
|
| + request = LogRequestLite.FromString(f.read())
|
| +
|
| + self.assertEqual(len(request.log_event), 1)
|
| + event = ChromeInfraEvent.FromString(request.log_event[0].source_extension)
|
| + self.assertEqual(event.build_event.host_name, 'myhostname')
|
| + self.assertEqual(event.build_event.type, BuildEvent.STEP)
|
| + self.assertEqual(event.build_event.build_number, 3)
|
| + self.assertEqual(event.timestamp_kind, ChromeInfraEvent.BEGIN)
|
| +
|
| + def test_logrequest_path_build_service_conflicts(self):
|
| + # logrequest contains build event, provides service event as arg
|
| + with infra_libs.temporary_directory(prefix='send_event_test-') as tmpdir:
|
| + outfile = os.path.join(tmpdir, 'out.bin')
|
| + args = send_event.get_arguments(
|
| + ['--event-mon-run-type', 'file',
|
| + '--event-mon-output-file', outfile,
|
| + '--event-mon-service-name', 'thing',
|
| + '--event-logrequest-path',
|
| + os.path.join(DATA_DIR, 'build-foo-builder.bin'),
|
| + '--build-event-build-number', '3',
|
| + '--service-event-type', 'START',
|
| + ])
|
| + self.assertEquals(args.event_mon_run_type, 'file')
|
| + event_mon.process_argparse_options(args)
|
| + with self.assertRaises(ValueError):
|
| + send_event._process_logrequest_path(args)
|
| +
|
| + # The default event used below has been generated using:
|
| + # ./run.py infra.tools.send_monitoring_event
|
| + # --event-mon-run-type=file
|
| + # --event-mon-output-file=./service-bar-service.bin
|
| + # --service-event-type=START
|
| + # --event-mon-service-name=bar
|
| + # --event-mon-hostname=myhostname
|
| + # --event-mon-timestamp-kind=BEGIN
|
| + # --event-mon-event-timestamp=123
|
| + def test_logrequest_path_valid_service_event(self):
|
| + with infra_libs.temporary_directory(prefix='send_event_test-') as tmpdir:
|
| + outfile = os.path.join(tmpdir, 'out.bin')
|
| + args = send_event.get_arguments(
|
| + ['--event-mon-run-type', 'file',
|
| + '--event-mon-output-file', outfile,
|
| + '--event-mon-service-name', 'thing',
|
| + '--event-logrequest-path',
|
| + os.path.join(DATA_DIR, 'service-bar-service.bin'),
|
| + ])
|
| + self.assertEquals(args.event_mon_run_type, 'file')
|
| + event_mon.process_argparse_options(args)
|
| + send_event._process_logrequest_path(args)
|
| + self.assertTrue(send_event.send_service_event(args))
|
| +
|
| + # Now open the resulting file and check what was written
|
| + with open(outfile, 'rb') as f:
|
| + request = LogRequestLite.FromString(f.read())
|
| +
|
| + self.assertEqual(len(request.log_event), 1)
|
| + event = ChromeInfraEvent.FromString(request.log_event[0].source_extension)
|
| + self.assertEqual(event.event_source.host_name, 'myhostname')
|
| + self.assertEqual(event.service_event.type, ServiceEvent.START)
|
| + self.assertEqual(event.timestamp_kind, ChromeInfraEvent.BEGIN)
|
| +
|
| + def test_logrequest_path_service_type_override(self):
|
| + with infra_libs.temporary_directory(prefix='send_event_test-') as tmpdir:
|
| + outfile = os.path.join(tmpdir, 'out.bin')
|
| + args = send_event.get_arguments(
|
| + ['--event-mon-run-type', 'file',
|
| + '--event-mon-output-file', outfile,
|
| + '--event-mon-service-name', 'thing',
|
| + '--event-logrequest-path',
|
| + os.path.join(DATA_DIR, 'service-bar-service.bin'),
|
| + '--service-event-type', 'STOP',
|
| + ])
|
| + self.assertEquals(args.event_mon_run_type, 'file')
|
| + event_mon.process_argparse_options(args)
|
| + send_event._process_logrequest_path(args)
|
| + self.assertTrue(send_event.send_service_event(args))
|
| +
|
| + # Now open the resulting file and check what was written
|
| + with open(outfile, 'rb') as f:
|
| + request = LogRequestLite.FromString(f.read())
|
| +
|
| + self.assertEqual(len(request.log_event), 1)
|
| + event = ChromeInfraEvent.FromString(request.log_event[0].source_extension)
|
| + self.assertEqual(event.event_source.host_name, 'myhostname')
|
| + self.assertEqual(event.service_event.type, ServiceEvent.STOP)
|
| + self.assertEqual(event.timestamp_kind, ChromeInfraEvent.END)
|
| +
|
| + def test_logrequest_path_service_build_conflict(self):
|
| + with infra_libs.temporary_directory(prefix='send_event_test-') as tmpdir:
|
| + outfile = os.path.join(tmpdir, 'out.bin')
|
| + args = send_event.get_arguments(
|
| + ['--event-mon-run-type', 'file',
|
| + '--event-mon-output-file', outfile,
|
| + '--event-mon-service-name', 'thing',
|
| + '--event-logrequest-path',
|
| + os.path.join(DATA_DIR, 'service-bar-service.bin'),
|
| + '--build-event-type', 'BUILD',
|
| + ])
|
| + self.assertEquals(args.event_mon_run_type, 'file')
|
| + event_mon.process_argparse_options(args)
|
| + with self.assertRaises(ValueError):
|
| + send_event._process_logrequest_path(args)
|
| +
|
| + def test_logrequest_path_service_build_and_service(self):
|
| + # The logrequest provided contains both a service and a build type,
|
| + # which is invalid.
|
| + with infra_libs.temporary_directory(prefix='send_event_test-') as tmpdir:
|
| + outfile = os.path.join(tmpdir, 'out.bin')
|
| + args = send_event.get_arguments(
|
| + ['--event-mon-run-type', 'file',
|
| + '--event-mon-output-file', outfile,
|
| + '--event-mon-service-name', 'thing',
|
| + '--event-logrequest-path',
|
| + os.path.join(DATA_DIR, 'build-and-service-event.bin'),
|
| + ])
|
| + self.assertEquals(args.event_mon_run_type, 'file')
|
| + event_mon.process_argparse_options(args)
|
| + with self.assertRaises(ValueError):
|
| + send_event._process_logrequest_path(args)
|
| +
|
| +
|
| +class TestEventsFromTextFile(SendingEventBaseTest):
|
| def test_send_events_from_file_smoke(self):
|
| # Create a temporary file because we don't want to risk deleting a
|
| # checked-in file.
|
| @@ -215,3 +458,53 @@ class TestGetEventsFileList(unittest.TestCase):
|
| self.assertTrue(len(file_list) == 3)
|
| for fname in file_list:
|
| self.assertTrue(any(fname.endswith(filename) for filename in filenames))
|
| +
|
| +
|
| +class TestProcessRequestPath(SendingEventBaseTest):
|
| + def test_logrequest_missing_args(self):
|
| + orig_event = event_mon.get_default_event()
|
| + self.assertIsNot(orig_event, None)
|
| +
|
| + args = argparse.Namespace()
|
| + args.event_logrequest_path = None
|
| + send_event._process_logrequest_path(args)
|
| +
|
| + self.assertEqual(orig_event, event_mon.get_default_event())
|
| +
|
| + def test_logrequest_with_valid_file(self):
|
| + orig_event = event_mon.get_default_event()
|
| + self.assertIsNot(orig_event, None)
|
| +
|
| + args = argparse.Namespace()
|
| + args.event_logrequest_path = os.path.join(DATA_DIR, 'logrequest-build.bin')
|
| + args.service_event_type = None
|
| + args.build_event_type = None
|
| + send_event._process_logrequest_path(args)
|
| +
|
| + new_event = event_mon.get_default_event()
|
| + self.assertNotEqual(orig_event, new_event)
|
| + self.assertEqual(new_event.build_event.type, BuildEvent.BUILD)
|
| +
|
| + def test_logrequest_with_no_log_event(self):
|
| + orig_event = event_mon.get_default_event()
|
| + self.assertIsNot(orig_event, None)
|
| +
|
| + args = argparse.Namespace()
|
| + args.event_logrequest_path = os.path.join(DATA_DIR, 'logrequest-empty.bin')
|
| + with self.assertRaises(ValueError):
|
| + send_event._process_logrequest_path(args)
|
| +
|
| + def test_logrequest_with_bad_content(self):
|
| + orig_event = event_mon.get_default_event()
|
| + self.assertIsNot(orig_event, None)
|
| +
|
| + args = argparse.Namespace()
|
| + args.event_logrequest_path = os.path.join(DATA_DIR, 'garbage')
|
| + with self.assertRaises(google.protobuf.message.DecodeError):
|
| + send_event._process_logrequest_path(args)
|
| +
|
| + def test_logrequest_with_missing_file(self):
|
| + args = argparse.Namespace()
|
| + args.event_logrequest_path = os.path.join(DATA_DIR, 'non-existent-file.bin')
|
| + with self.assertRaises(IOError):
|
| + send_event._process_logrequest_path(args)
|
|
|