blob: fdc54cdaab3022b89fef46cd4979bdfdc10579f5 [file] [log] [blame] [edit]
#!/usr/bin/env python
# Copyright 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 unittest
import logging
from systrace import decorators
from systrace import run_systrace
from systrace.tracing_agents import ftrace_agent
SYSTRACE_HOST_CMD_DEFAULT = ['./systrace.py', '--target=linux']
FT_DIR = "/sys/kernel/debug/tracing/"
FT_EVENT_DIR = FT_DIR + "events/"
FT_TRACE_ON = FT_DIR + "tracing_on"
FT_TRACE = FT_DIR + "trace"
FT_BUFFER_SIZE = FT_DIR + "buffer_size_kb"
def make_test_io_interface(permitted_files):
class TestIoImpl(object):
@staticmethod
def writeFile(path, data):
permitted_files[path] = data
@staticmethod
def readFile(path):
if path in permitted_files:
return permitted_files[path]
else:
return ""
@staticmethod
def haveWritePermissions(path):
return path in permitted_files
return TestIoImpl
class FtraceAgentTest(unittest.TestCase):
@decorators.HostOnlyTest
def test_avail_categories(self):
# sched only has required events
permitted_files = {
FT_EVENT_DIR + "sched/sched_switch/enable": "0",
FT_EVENT_DIR + "sched/sched_wakeup/enable": "0"
}
io_interface = make_test_io_interface(permitted_files)
agent = ftrace_agent.FtraceAgent(io_interface)
self.assertEqual(['sched'], agent._avail_categories())
# check for no available categories
permitted_files = {}
io_interface = make_test_io_interface(permitted_files)
agent = ftrace_agent.FtraceAgent(io_interface)
self.assertEqual([], agent._avail_categories())
# block has some required, some optional events
permitted_files = {
FT_EVENT_DIR + "block/block_rq_complete/enable": "0",
FT_EVENT_DIR + "block/block_rq_issue/enable": "0"
}
io_interface = make_test_io_interface(permitted_files)
agent = ftrace_agent.FtraceAgent(io_interface)
self.assertEqual(['disk'], agent._avail_categories())
@decorators.HostOnlyTest
def test_tracing_bootstrap(self):
workq_event_path = FT_EVENT_DIR + "workqueue/enable"
permitted_files = {
workq_event_path: "0",
FT_TRACE: "x"
}
io_interface = make_test_io_interface(permitted_files)
systrace_cmd = SYSTRACE_HOST_CMD_DEFAULT + ["workq"]
options, categories = run_systrace.parse_options(systrace_cmd)
agent = ftrace_agent.FtraceAgent(io_interface)
self.assertEqual(['workq'], agent._avail_categories())
# confirm tracing is enabled, buffer is cleared
agent.StartAgentTracing(options, categories)
self.assertEqual(permitted_files[FT_TRACE_ON], "1")
self.assertEqual(permitted_files[FT_TRACE], "")
# fill in file with dummy contents
dummy_trace = "trace_contents"
permitted_files[FT_TRACE] = dummy_trace
# confirm tracing is disabled
agent.StopAgentTracing()
agent.GetResults()
self.assertEqual(permitted_files[FT_TRACE_ON], "0")
# confirm trace is expected, and read from fs
self.assertEqual(agent.GetResults().raw_data, dummy_trace)
# confirm buffer size is reset to 1
self.assertEqual(permitted_files[FT_BUFFER_SIZE], "1")
@decorators.HostOnlyTest
def test_tracing_event_enable_disable(self):
# turn on irq tracing
ipi_event_path = FT_EVENT_DIR + "ipi/enable"
irq_event_path = FT_EVENT_DIR + "irq/enable"
permitted_files = {
ipi_event_path: "0",
irq_event_path: "0"
}
io_interface = make_test_io_interface(permitted_files)
systrace_cmd = SYSTRACE_HOST_CMD_DEFAULT + ["irq"]
options, categories = run_systrace.parse_options(systrace_cmd)
options.ftrace_categories = categories
agent = ftrace_agent.FtraceAgent(io_interface)
self.assertEqual(['irq'], agent._avail_categories())
# confirm all the event nodes are turned on during tracing
agent.StartAgentTracing(options)
self.assertEqual(permitted_files[irq_event_path], "1")
self.assertEqual(permitted_files[ipi_event_path], "1")
# and then turned off when completed.
agent.StopAgentTracing()
agent.GetResults()
self.assertEqual(permitted_files[irq_event_path], "0")
self.assertEqual(permitted_files[ipi_event_path], "0")
@decorators.HostOnlyTest
def test_buffer_size(self):
systrace_cmd = SYSTRACE_HOST_CMD_DEFAULT + ['-b', '16000']
options, categories = run_systrace.parse_options(systrace_cmd)
agent = ftrace_agent.FtraceAgent()
agent._config = options
agent._config.atrace_categories = categories
self.assertEqual(agent._get_trace_buffer_size(), 16000)
if __name__ == "__main__":
logging.getLogger().setLevel(logging.DEBUG)
unittest.main(verbosity=2)