summaryrefslogtreecommitdiffstats
path: root/tests/test_git_trace2_event_log.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_git_trace2_event_log.py')
-rw-r--r--tests/test_git_trace2_event_log.py62
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
17import json 17import json
18import os 18import os
19import socket
19import tempfile 20import tempfile
21import threading
20import unittest 22import unittest
21from unittest import mock 23from unittest import mock
22 24
23import git_trace2_event_log 25import git_trace2_event_log
26import platform_utils
27
28
29def 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
26class EventLogTestCase(unittest.TestCase): 57class 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
328if __name__ == '__main__': 390if __name__ == '__main__':
329 unittest.main() 391 unittest.main()