diff options
Diffstat (limited to 'catapult/common/py_trace_event/py_trace_event/trace_event_unittest.py')
-rw-r--r-- | catapult/common/py_trace_event/py_trace_event/trace_event_unittest.py | 135 |
1 files changed, 115 insertions, 20 deletions
diff --git a/catapult/common/py_trace_event/py_trace_event/trace_event_unittest.py b/catapult/common/py_trace_event/py_trace_event/trace_event_unittest.py index f88ef953..9916c71d 100644 --- a/catapult/common/py_trace_event/py_trace_event/trace_event_unittest.py +++ b/catapult/common/py_trace_event/py_trace_event/trace_event_unittest.py @@ -8,34 +8,29 @@ import logging import math import multiprocessing import os -import tempfile import time import unittest +import sys from py_trace_event import trace_event from py_trace_event import trace_time from py_trace_event.trace_event_impl import log +from py_trace_event.trace_event_impl import multiprocessing_shim +from py_utils import tempfile_ext class TraceEventTests(unittest.TestCase): - def setUp(self): - tf = tempfile.NamedTemporaryFile(delete=False) - self._log_path = tf.name - tf.close() - - def tearDown(self): - if os.path.exists(self._log_path): - os.remove(self._log_path) - @contextlib.contextmanager - def _test_trace(self, disable=True): - try: - trace_event.trace_enable(self._log_path) - yield - finally: - if disable: - trace_event.trace_disable() + def _test_trace(self, disable=True, format=None): + with tempfile_ext.TemporaryFileName() as filename: + self._log_path = filename + try: + trace_event.trace_enable(self._log_path, format=format) + yield + finally: + if disable: + trace_event.trace_disable() def testNoImpl(self): orig_impl = trace_event.trace_event_impl @@ -77,10 +72,15 @@ class TraceEventTests(unittest.TestCase): assert False def testDisable(self): + _old_multiprocessing_process = multiprocessing.Process with self._test_trace(disable=False): with open(self._log_path, 'r') as f: self.assertTrue(trace_event.trace_is_enabled()) + self.assertEqual( + multiprocessing.Process, multiprocessing_shim.ProcessShim) trace_event.trace_disable() + self.assertEqual( + multiprocessing.Process, _old_multiprocessing_process) self.assertEquals(len(json.loads(f.read() + ']')), 1) self.assertFalse(trace_event.trace_is_enabled()) @@ -187,6 +187,7 @@ class TraceEventTests(unittest.TestCase): with open(self._log_path, 'r') as f: log_output = json.loads(f.read() + ']') self.assertEquals(len(log_output), 3) + expected_name = __name__ + '.test_decorator' current_entry = log_output.pop(0) self.assertEquals(current_entry['category'], 'process_argv') self.assertEquals(current_entry['name'], 'process_argv') @@ -194,12 +195,12 @@ class TraceEventTests(unittest.TestCase): self.assertEquals(current_entry['ph'], 'M') current_entry = log_output.pop(0) self.assertEquals(current_entry['category'], 'python') - self.assertEquals(current_entry['name'], '__main__.test_decorator') + self.assertEquals(current_entry['name'], expected_name) self.assertEquals(current_entry['args']['this'], '\'that\'') self.assertEquals(current_entry['ph'], 'B') current_entry = log_output.pop(0) self.assertEquals(current_entry['category'], 'python') - self.assertEquals(current_entry['name'], '__main__.test_decorator') + self.assertEquals(current_entry['name'], expected_name) self.assertEquals(current_entry['args'], {}) self.assertEquals(current_entry['ph'], 'E') @@ -349,7 +350,8 @@ class TraceEventTests(unittest.TestCase): self.assertLessEqual(one_open['ts'], two_open['ts']) self.assertLessEqual(one_close['ts'], two_close['ts']) - def testMultiprocess(self): + # TODO(khokhlov): Fix this test on Windows. See crbug.com/945819 for details. + def disabled_testMultiprocess(self): def child_function(): with trace_event.trace('child_event'): pass @@ -392,6 +394,21 @@ class TraceEventTests(unittest.TestCase): self.assertEquals(parent_close['name'], 'parent_event') self.assertEquals(parent_close['ph'], 'E') + @unittest.skipIf(sys.platform == 'win32', 'crbug.com/945819') + def testTracingControlDisabledInChildButNotInParent(self): + def child(resp): + # test tracing is not controllable in the child + resp.put(trace_event.is_tracing_controllable()) + + with self._test_trace(): + q = multiprocessing.Queue() + p = multiprocessing.Process(target=child, args=[q]) + p.start() + # test tracing is controllable in the parent + self.assertTrue(trace_event.is_tracing_controllable()) + self.assertFalse(q.get()) + p.join() + def testMultiprocessExceptionInChild(self): def bad_child(): trace_event.trace_disable() @@ -418,6 +435,84 @@ class TraceEventTests(unittest.TestCase): self.assertEquals(parent_close['name'], 'parent') self.assertEquals(parent_close['ph'], 'E') + def testFormatJson(self): + with self._test_trace(format=trace_event.JSON): + trace_event.trace_flush() + with open(self._log_path, 'r') as f: + log_output = json.loads(f.read() + ']') + self.assertEquals(len(log_output), 1) + self.assertEquals(log_output[0]['ph'], 'M') + + def testFormatJsonWithMetadata(self): + with self._test_trace(format=trace_event.JSON_WITH_METADATA): + trace_event.trace_disable() + with open(self._log_path, 'r') as f: + log_output = json.load(f) + self.assertEquals(len(log_output), 2) + events = log_output['traceEvents'] + self.assertEquals(len(events), 1) + self.assertEquals(events[0]['ph'], 'M') + + def testFormatProtobuf(self): + with self._test_trace(format=trace_event.PROTOBUF): + trace_event.trace_flush() + with open(self._log_path, 'r') as f: + self.assertGreater(len(f.read()), 0) + + def testAddMetadata(self): + with self._test_trace(format=trace_event.JSON_WITH_METADATA): + trace_event.trace_add_benchmark_metadata( + benchmark_start_time_us=1000, + story_run_time_us=2000, + benchmark_name='benchmark', + benchmark_description='desc', + story_name='story', + story_tags=['tag1', 'tag2'], + story_run_index=0, + ) + trace_event.trace_disable() + with open(self._log_path, 'r') as f: + log_output = json.load(f) + self.assertEquals(len(log_output), 2) + telemetry_metadata = log_output['metadata']['telemetry'] + self.assertEquals(len(telemetry_metadata), 7) + self.assertEquals(telemetry_metadata['benchmarkStart'], 1) + self.assertEquals(telemetry_metadata['traceStart'], 2) + self.assertEquals(telemetry_metadata['benchmarks'], ['benchmark']) + self.assertEquals(telemetry_metadata['benchmarkDescriptions'], ['desc']) + self.assertEquals(telemetry_metadata['stories'], ['story']) + self.assertEquals(telemetry_metadata['storyTags'], ['tag1', 'tag2']) + self.assertEquals(telemetry_metadata['storysetRepeats'], [0]) + + def testAddMetadataProtobuf(self): + with self._test_trace(format=trace_event.PROTOBUF): + trace_event.trace_add_benchmark_metadata( + benchmark_start_time_us=1000, + story_run_time_us=2000, + benchmark_name='benchmark', + benchmark_description='desc', + story_name='story', + story_tags=['tag1', 'tag2'], + story_run_index=0, + ) + trace_event.trace_disable() + with open(self._log_path, 'r') as f: + self.assertGreater(len(f.read()), 0) + + def testAddMetadataInJsonFormatRaises(self): + with self._test_trace(format=trace_event.JSON): + with self.assertRaises(log.TraceException): + trace_event.trace_add_benchmark_metadata( + benchmark_start_time_us=1000, + story_run_time_us=2000, + benchmark_name='benchmark', + benchmark_description='description', + story_name='story', + story_tags=['tag1', 'tag2'], + story_run_index=0, + ) + + if __name__ == '__main__': logging.getLogger().setLevel(logging.DEBUG) unittest.main(verbosity=2) |