aboutsummaryrefslogtreecommitdiff
path: root/catapult/common/py_trace_event/py_trace_event/trace_event_unittest.py
diff options
context:
space:
mode:
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.py135
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)