blob: d44b4bbdf96a7734a62b7e6446d19eb5b4208036 [file] [log] [blame]
# Copyright (c) 2015 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 json
import tempfile
import unittest
from perf_insights import in_memory_trace_handle
from perf_insights import map_single_trace
from perf_insights import function_handle
from perf_insights import results as results_module
from perf_insights import value as value_module
from perf_insights.value import run_info as run_info_module
def _Handle(filename):
module = function_handle.ModuleToLoad(filename=filename)
return function_handle.FunctionHandle(modules_to_load=[module],
function_name='MyMapFunction')
class MapSingleTraceTests(unittest.TestCase):
def testPassingMapScript(self):
run_info = run_info_module.RunInfo('file:///a.json', '/a.json',
metadata={'m': 1})
events = [
{'pid': 1, 'tid': 2, 'ph': 'X', 'name': 'a', 'cat': 'c',
'ts': 0, 'dur': 10, 'args': {}},
{'pid': 1, 'tid': 2, 'ph': 'X', 'name': 'b', 'cat': 'c',
'ts': 3, 'dur': 5, 'args': {}}
]
trace_handle = in_memory_trace_handle.InMemoryTraceHandle(
run_info, json.dumps(events));
results = results_module.Results()
with map_single_trace.TemporaryMapScript("""
pi.FunctionRegistry.register(
function MyMapFunction(results, run_info, model) {
results.addValue(new pi.v.DictValue(
run_info,
'result', {
numProcesses: model.getAllProcesses().length
}));
});
""") as map_script:
map_single_trace.MapSingleTrace(results, trace_handle,
_Handle(map_script.filename))
self.assertFalse(results.failure_values)
v = results.FindValueNamed('result')
self.assertEquals(v['numProcesses'], 1)
def testTraceDidntImport(self):
run_info = run_info_module.RunInfo('file:///a.json', '/a.json',
metadata={'m': 1})
trace_string = 'This is intentionally not a trace-formatted string.'
trace_handle = in_memory_trace_handle.InMemoryTraceHandle(
run_info, trace_string);
results = results_module.Results()
with map_single_trace.TemporaryMapScript("""
pi.FunctionRegistry.register(
function MyMapFunction(results, run_info, model) {
});
""") as map_script:
map_single_trace.MapSingleTrace(results, trace_handle,
_Handle(map_script.filename))
self.assertEquals(len(results.all_values), 1)
v = results.all_values[0]
self.assertIsInstance(v, map_single_trace.TraceImportErrorValue);
def testMapFunctionThatThrows(self):
run_info = run_info_module.RunInfo('file:///a.json', '/a.json',
metadata={'m': 1})
events = [
{'pid': 1, 'tid': 2, 'ph': 'X', 'name': 'a', 'cat': 'c',
'ts': 0, 'dur': 10, 'args': {}},
{'pid': 1, 'tid': 2, 'ph': 'X', 'name': 'b', 'cat': 'c',
'ts': 3, 'dur': 5, 'args': {}}
]
trace_handle = in_memory_trace_handle.InMemoryTraceHandle(
run_info, json.dumps(events));
results = results_module.Results()
with map_single_trace.TemporaryMapScript("""
pi.FunctionRegistry.register(
function MyMapFunction(results, run_info, model) {
throw new Error('Expected error');
});
""") as map_script:
map_single_trace.MapSingleTrace(results, trace_handle,
_Handle(map_script.filename))
self.assertEquals(len(results.all_values), 1)
v = results.all_values[0]
self.assertIsInstance(v, map_single_trace.MapFunctionErrorValue);
def testMapperWithLoadeError(self):
run_info = run_info_module.RunInfo('file:///a.json', '/a.json',
metadata={'m': 1})
events = [
{'pid': 1, 'tid': 2, 'ph': 'X', 'name': 'a', 'cat': 'c',
'ts': 0, 'dur': 10, 'args': {}},
{'pid': 1, 'tid': 2, 'ph': 'X', 'name': 'b', 'cat': 'c',
'ts': 3, 'dur': 5, 'args': {}}
]
trace_handle = in_memory_trace_handle.InMemoryTraceHandle(
run_info, json.dumps(events));
results = results_module.Results()
with map_single_trace.TemporaryMapScript("""
throw new Error('Expected load error');
""") as map_script:
map_single_trace.MapSingleTrace(results, trace_handle,
_Handle(map_script.filename))
self.assertEquals(len(results.all_values), 1)
v = results.all_values[0]
self.assertIsInstance(v, map_single_trace.FunctionLoadingErrorValue);
def testNoMapper(self):
run_info = run_info_module.RunInfo('file:///a.json', '/a.json',
metadata={'m': 1})
events = [
{'pid': 1, 'tid': 2, 'ph': 'X', 'name': 'a', 'cat': 'c',
'ts': 0, 'dur': 10, 'args': {}},
{'pid': 1, 'tid': 2, 'ph': 'X', 'name': 'b', 'cat': 'c',
'ts': 3, 'dur': 5, 'args': {}}
]
trace_handle = in_memory_trace_handle.InMemoryTraceHandle(
run_info, json.dumps(events));
results = results_module.Results()
with map_single_trace.TemporaryMapScript("""
""") as map_script:
map_single_trace.MapSingleTrace(results, trace_handle,
_Handle(map_script.filename))
self.assertEquals(len(results.all_values), 1)
v = results.all_values[0]
self.assertIsInstance(v, map_single_trace.FunctionNotDefinedErrorValue);
def testMapperDoesntAddValues(self):
run_info = run_info_module.RunInfo('file:///a.json', '/a.json',
metadata={'m': 1})
events = [
{'pid': 1, 'tid': 2, 'ph': 'X', 'name': 'a', 'cat': 'c',
'ts': 0, 'dur': 10, 'args': {}},
{'pid': 1, 'tid': 2, 'ph': 'X', 'name': 'b', 'cat': 'c',
'ts': 3, 'dur': 5, 'args': {}}
]
trace_handle = in_memory_trace_handle.InMemoryTraceHandle(
run_info, json.dumps(events));
results = results_module.Results()
with map_single_trace.TemporaryMapScript("""
pi.FunctionRegistry.register(
function MyMapFunction(results, run_info, model) {
});
""") as map_script:
map_single_trace.MapSingleTrace(results, trace_handle,
_Handle(map_script.filename))
self.assertEquals(len(results.all_values), 1)
v = results.all_values[0]
self.assertIsInstance(v, map_single_trace.NoResultsAddedErrorValue);
def testMapperSkips(self):
run_info = run_info_module.RunInfo('file:///a.json', '/a.json',
metadata={'m': 1})
events = [
{'pid': 1, 'tid': 2, 'ph': 'X', 'name': 'a', 'cat': 'c',
'ts': 0, 'dur': 10, 'args': {}},
{'pid': 1, 'tid': 2, 'ph': 'X', 'name': 'b', 'cat': 'c',
'ts': 3, 'dur': 5, 'args': {}}
]
trace_handle = in_memory_trace_handle.InMemoryTraceHandle(
run_info, json.dumps(events));
results = results_module.Results()
with map_single_trace.TemporaryMapScript("""
pi.FunctionRegistry.register(
function MyMapFunction(results, run_info, model) {
results.addValue(new pi.v.SkipValue(
run_info, 'SkippedFieldName',
{description: 'SkippedReason'}));
});
""") as map_script:
map_single_trace.MapSingleTrace(results, trace_handle,
_Handle(map_script.filename))
self.assertEquals(len(results.all_values), 1)
v = results.all_values[0]
self.assertIsInstance(v, value_module.SkipValue)
self.assertEquals(v.name, 'SkippedFieldName')
self.assertEquals(v.description, 'SkippedReason')