diff options
Diffstat (limited to 'tests/test_git_trace2_event_log.py')
| -rw-r--r-- | tests/test_git_trace2_event_log.py | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/tests/test_git_trace2_event_log.py b/tests/test_git_trace2_event_log.py index 89dcfb92..0623d32e 100644 --- a/tests/test_git_trace2_event_log.py +++ b/tests/test_git_trace2_event_log.py | |||
| @@ -16,11 +16,42 @@ | |||
| 16 | 16 | ||
| 17 | import json | 17 | import json |
| 18 | import os | 18 | import os |
| 19 | import socket | ||
| 19 | import tempfile | 20 | import tempfile |
| 21 | import threading | ||
| 20 | import unittest | 22 | import unittest |
| 21 | from unittest import mock | 23 | from unittest import mock |
| 22 | 24 | ||
| 23 | import git_trace2_event_log | 25 | import git_trace2_event_log |
| 26 | import platform_utils | ||
| 27 | |||
| 28 | |||
| 29 | def serverLoggingThread(socket_path, server_ready, received_traces): | ||
| 30 | """Helper function to receive logs over a Unix domain socket. | ||
| 31 | |||
| 32 | Appends received messages on the provided socket and appends to received_traces. | ||
| 33 | |||
| 34 | Args: | ||
| 35 | socket_path: path to a Unix domain socket on which to listen for traces | ||
| 36 | server_ready: a threading.Condition used to signal to the caller that this thread is ready to | ||
| 37 | accept connections | ||
| 38 | received_traces: a list to which received traces will be appended (after decoding to a utf-8 | ||
| 39 | string). | ||
| 40 | """ | ||
| 41 | platform_utils.remove(socket_path, missing_ok=True) | ||
| 42 | data = b'' | ||
| 43 | with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: | ||
| 44 | sock.bind(socket_path) | ||
| 45 | sock.listen(0) | ||
| 46 | with server_ready: | ||
| 47 | server_ready.notify() | ||
| 48 | with sock.accept()[0] as conn: | ||
| 49 | while True: | ||
| 50 | recved = conn.recv(4096) | ||
| 51 | if not recved: | ||
| 52 | break | ||
| 53 | data += recved | ||
| 54 | received_traces.extend(data.decode('utf-8').splitlines()) | ||
| 24 | 55 | ||
| 25 | 56 | ||
| 26 | class EventLogTestCase(unittest.TestCase): | 57 | class EventLogTestCase(unittest.TestCase): |
| @@ -324,6 +355,37 @@ class EventLogTestCase(unittest.TestCase): | |||
| 324 | with self.assertRaises(TypeError): | 355 | with self.assertRaises(TypeError): |
| 325 | self._event_log_module.Write(path=1234) | 356 | self._event_log_module.Write(path=1234) |
| 326 | 357 | ||
| 358 | def test_write_socket(self): | ||
| 359 | """Test Write() with Unix domain socket for |path| and validate received traces.""" | ||
| 360 | received_traces = [] | ||
| 361 | with tempfile.TemporaryDirectory(prefix='test_server_sockets') as tempdir: | ||
| 362 | socket_path = os.path.join(tempdir, "server.sock") | ||
| 363 | server_ready = threading.Condition() | ||
| 364 | # Start "server" listening on Unix domain socket at socket_path. | ||
| 365 | try: | ||
| 366 | server_thread = threading.Thread( | ||
| 367 | target=serverLoggingThread, | ||
| 368 | args=(socket_path, server_ready, received_traces)) | ||
| 369 | server_thread.start() | ||
| 370 | |||
| 371 | with server_ready: | ||
| 372 | server_ready.wait() | ||
| 373 | |||
| 374 | self._event_log_module.StartEvent() | ||
| 375 | path = self._event_log_module.Write(path=f'af_unix:{socket_path}') | ||
| 376 | finally: | ||
| 377 | server_thread.join(timeout=5) | ||
| 378 | |||
| 379 | self.assertEqual(path, f'af_unix:stream:{socket_path}') | ||
| 380 | self.assertEqual(len(received_traces), 2) | ||
| 381 | version_event = json.loads(received_traces[0]) | ||
| 382 | start_event = json.loads(received_traces[1]) | ||
| 383 | self.verifyCommonKeys(version_event, expected_event_name='version') | ||
| 384 | self.verifyCommonKeys(start_event, expected_event_name='start') | ||
| 385 | # Check for 'start' event specific fields. | ||
| 386 | self.assertIn('argv', start_event) | ||
| 387 | self.assertIsInstance(start_event['argv'], list) | ||
| 388 | |||
| 327 | 389 | ||
| 328 | if __name__ == '__main__': | 390 | if __name__ == '__main__': |
| 329 | unittest.main() | 391 | unittest.main() |
