blob: fdc48e2c10974df3ab68dd227e1f408928487859 [file] [log] [blame]
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import base64
import json
import os
import tempfile
import unittest
from py_utils import tempfile_ext
from tracing.trace_data import trace_data
class TraceDataTest(unittest.TestCase):
def testHasTracesForChrome(self):
d = trace_data.CreateFromRawChromeEvents([{'ph': 'B'}])
self.assertTrue(d.HasTracesFor(trace_data.CHROME_TRACE_PART))
def testHasNotTracesForCpu(self):
d = trace_data.CreateFromRawChromeEvents([{'ph': 'B'}])
self.assertFalse(d.HasTracesFor(trace_data.CPU_TRACE_DATA))
def testGetTracesForChrome(self):
d = trace_data.CreateFromRawChromeEvents([{'ph': 'B'}])
ts = d.GetTracesFor(trace_data.CHROME_TRACE_PART)
self.assertEqual(len(ts), 1)
self.assertEqual(ts[0], {'traceEvents': [{'ph': 'B'}]})
def testGetNoTracesForCpu(self):
d = trace_data.CreateFromRawChromeEvents([{'ph': 'B'}])
ts = d.GetTracesFor(trace_data.CPU_TRACE_DATA)
self.assertEqual(ts, [])
class TraceDataBuilderTest(unittest.TestCase):
def testAddTraceDataAndSerialize(self):
with tempfile_ext.TemporaryFileName() as trace_path:
with trace_data.TraceDataBuilder() as builder:
builder.AddTraceFor(trace_data.CHROME_TRACE_PART,
{'traceEvents': [1, 2, 3]})
builder.Serialize(trace_path)
self.assertTrue(os.path.exists(trace_path))
self.assertGreater(os.stat(trace_path).st_size, 0) # File not empty.
def testAddTraceForRaisesWithInvalidPart(self):
with trace_data.TraceDataBuilder() as builder:
with self.assertRaises(TypeError):
builder.AddTraceFor('not_a_trace_part', {})
def testAddTraceWithUnstructuredData(self):
with trace_data.TraceDataBuilder() as builder:
builder.AddTraceFor(trace_data.TELEMETRY_PART, 'unstructured trace',
allow_unstructured=True)
def testAddTraceRaisesWithImplicitUnstructuredData(self):
with trace_data.TraceDataBuilder() as builder:
with self.assertRaises(ValueError):
builder.AddTraceFor(trace_data.TELEMETRY_PART, 'unstructured trace')
def testAddTraceFileFor(self):
original_data = {'msg': 'The answer is 42'}
with tempfile.NamedTemporaryFile(delete=False) as source:
json.dump(original_data, source)
with trace_data.TraceDataBuilder() as builder:
builder.AddTraceFileFor(trace_data.CHROME_TRACE_PART, source.name)
self.assertFalse(os.path.exists(source.name))
out_data = builder.AsData().GetTraceFor(trace_data.CHROME_TRACE_PART)
self.assertEqual(original_data, out_data)
def testOpenTraceHandleFor(self):
original_data = {'msg': 'The answer is 42'}
with trace_data.TraceDataBuilder() as builder:
with builder.OpenTraceHandleFor(trace_data.CHROME_TRACE_PART) as handle:
handle.write(json.dumps(original_data))
out_data = builder.AsData().GetTraceFor(trace_data.CHROME_TRACE_PART)
# Trace handle should be cleaned up.
self.assertFalse(os.path.exists(handle.name))
self.assertEqual(original_data, out_data)
def testOpenTraceHandleForCompressedData(self):
original_data = {'msg': 'The answer is 42'}
# gzip.compress() does not work in python 2, so hardcode the encoded data.
compressed_data = base64.b64decode(
'H4sIAIDMblwAA6tWyi1OV7JSUArJSFVIzCsuTy1SyCxWMDFSquUCAA4QMtscAAAA')
with trace_data.TraceDataBuilder() as builder:
with builder.OpenTraceHandleFor(
trace_data.CHROME_TRACE_PART, compressed=True) as handle:
handle.write(compressed_data)
out_data = builder.AsData().GetTraceFor(trace_data.CHROME_TRACE_PART)
# Trace handle should be cleaned up.
self.assertFalse(os.path.exists(handle.name))
self.assertEqual(original_data, out_data)
def testCantWriteAfterCleanup(self):
with trace_data.TraceDataBuilder() as builder:
builder.AddTraceFor(trace_data.CHROME_TRACE_PART,
{'traceEvents': [1, 2, 3]})
builder.CleanUpTraceData()
with self.assertRaises(RuntimeError):
builder.AddTraceFor(trace_data.CHROME_TRACE_PART,
{'traceEvents': [1, 2, 3]})
def testCantWriteAfterFreeze(self):
with trace_data.TraceDataBuilder() as builder:
builder.AddTraceFor(trace_data.CHROME_TRACE_PART,
{'traceEvents': [1, 2, 3]})
builder.Freeze()
with self.assertRaises(RuntimeError):
builder.AddTraceFor(trace_data.CHROME_TRACE_PART,
{'traceEvents': [1, 2, 3]})