示例#1
0
    def test_parse_values_concatenation(self):
        """TestBase: Trace with space separated values created a valid DataFrame"""

        in_data = """     rcu_preempt-7     [000]    73.604532: my_sched_stat_runtime:   comm=Space separated taskname pid=7 runtime=262875 [ns] vruntime=17096359856 [ns]"""

        expected_columns = set([
            "__comm", "__pid", "__cpu", "__line", "comm", "pid", "runtime",
            "vruntime"
        ])

        with open("trace.txt", "w") as fout:
            fout.write(in_data)

        ftrace_parser = trappy.register_dynamic_ftrace("sched_stat_runtime",
                                                       "my_sched_stat_runtime",
                                                       scope="sched")
        trace = trappy.FTrace()
        dfr = trace.sched_stat_runtime.data_frame

        self.assertEquals(set(dfr.columns), expected_columns)
        self.assertEquals(dfr["comm"].iloc[0], "Space separated taskname")
        self.assertEquals(dfr["pid"].iloc[0], 7)
        self.assertEquals(dfr["runtime"].iloc[0], 262875)
        self.assertEquals(dfr["vruntime"].iloc[0], 17096359856)

        trappy.unregister_dynamic_ftrace(ftrace_parser)
示例#2
0
    def test_ftrace_unique_but_no_fields(self):
        """Test with a matching unique but no special fields"""
        version_parser = trappy.register_dynamic_ftrace("Version", "version")

        with self.assertRaises(ValueError):
            trappy.FTrace(scope="custom")

        trappy.unregister_dynamic_ftrace(version_parser)
示例#3
0
    def test_dynamic_data_frame(self):
        """
           Test if the dynamic events are populated
           in the data frame
        """
        parse_class = trappy.register_dynamic_ftrace("DynamicEvent", "dynamic_test_key")
        t = trappy.FTrace(name="first")
        self.assertTrue(len(t.dynamic_event.data_frame) == 1)

        trappy.unregister_dynamic_ftrace(parse_class)
示例#4
0
    def test_dynamic_event_scope(self):
	"""Test the case when an "all" scope class is
	registered. it should appear in both thermal and sched
	ftrace class definitions when scoped ftrace objects are created
	"""
        cls = trappy.register_dynamic_ftrace("DynamicEvent", "dynamic_test_key")
        t1 = trappy.FTrace(name="first")
	self.assertTrue(t1.class_definitions.has_key(cls.name))

        trappy.unregister_dynamic_ftrace(cls)
示例#5
0
    def test_dynamic_event_plot(self):
        """Test if plotter can accept a dynamic class
            for a template argument"""

        cls = trappy.register_dynamic_ftrace("DynamicEvent", "dynamic_test_key")
        t = trappy.FTrace(name="first")
        l = trappy.LinePlot(t, cls, column="load")
        l.view(test=True)

        trappy.unregister_dynamic_ftrace(cls)
示例#6
0
    def test_ftrace_unique_but_no_fields(self):
        """Test with a matching unique but no special fields"""
        version_parser = trappy.register_dynamic_ftrace("Version", "version")

        # Append invalid line to file
        with open("trace.txt", "a") as fil:
            fil.write("version = 6")

        trace = trappy.FTrace(scope="all")

        trappy.unregister_dynamic_ftrace(version_parser)
示例#7
0
    def test_parse_special_fields(self):
        """TestBase: Task name, PID, CPU and timestamp are properly paresed """

        events = {
                # Trace events using [global] clock format ([us] resolution)
                1001.456789 : { 'task': 'rcu_preempt',       'pid': 1123, 'cpu': 001 },
                1002.456789 : { 'task': 'rs:main',           'pid': 2123, 'cpu': 002 },
                1003.456789 : { 'task': 'AsyncTask #1',      'pid': 3123, 'cpu': 003 },
                1004.456789 : { 'task': 'kworker/1:1H',      'pid': 4123, 'cpu': 004 },
                1005.456789 : { 'task': 'jbd2/sda2-8',       'pid': 5123, 'cpu': 005 },
                1006.456789 : { 'task': 'IntentService[',    'pid': 6123, 'cpu': 005 },
                1006.456789 : { 'task': r'/system/bin/.s$_?.u- \a]}c\./ef[.12]*[[l]in]ger',
                                'pid': 1234, 'cpu': 666 },
                # Trace events using [boot] clock format ([ns] resolution)
                1011456789000: { 'task': 'rcu_preempt',       'pid': 1123, 'cpu': 001 },
                1012456789000: { 'task': 'rs:main',           'pid': 2123, 'cpu': 002 },
                1013456789000: { 'task': 'AsyncTask #1',      'pid': 3123, 'cpu': 003 },
                1014456789000: { 'task': 'kworker/1:1H',      'pid': 4123, 'cpu': 004 },
                1015456789000: { 'task': 'jbd2/sda2-8',       'pid': 5123, 'cpu': 005 },
                1016456789000: { 'task': 'IntentService[',    'pid': 6123, 'cpu': 005 },
                1016456789000: { 'task': r'/system/bin/.s$_?.u- \a]}c\./ef[.12]*[[l]in]ger',
                                'pid': 1234, 'cpu': 666 },
        }

        in_data = """"""
        for timestamp in sorted(events):
            in_data+="{0:>16s}-{1:d} [{2:04d}] {3}: event0:   tag=value\n".\
                    format(
                        events[timestamp]['task'],
                        events[timestamp]['pid'],
                        events[timestamp]['cpu'],
                        timestamp
                        )

        expected_columns = set(["__comm", "__pid", "__tgid", "__cpu", "__line", "tag"])

        with open("trace.txt", "w") as fout:
            fout.write(in_data)

        ftrace_parser = trappy.register_dynamic_ftrace("Event0", "event0", scope="sched")
        trace = trappy.FTrace(normalize_time=False)
        dfr = trace.event0.data_frame

        self.assertEquals(set(dfr.columns), expected_columns)

        for timestamp, event in events.iteritems():
            if type(timestamp) == int:
                timestamp = float(timestamp) / 1e9
            self.assertEquals(dfr["__comm"].loc[timestamp], event['task'])
            self.assertEquals(dfr["__pid"].loc[timestamp],  event['pid'])
            self.assertEquals(dfr["__cpu"].loc[timestamp],  event['cpu'])

        trappy.unregister_dynamic_ftrace(ftrace_parser)
示例#8
0
    def test_dynamic_class_attr(self):
        """
           Test the attibutes of the dynamically
           generated class
        """
        cls = trappy.register_dynamic_ftrace("DynamicEvent", "dynamic_test_key",
              pivot="test_pivot")
        self.assertEquals(cls.__name__, "DynamicEvent")
        self.assertEquals(cls.name, "dynamic_event")
        self.assertEquals(cls.unique_word, "dynamic_test_key")
        self.assertEquals(cls.pivot, "test_pivot")

        trappy.unregister_dynamic_ftrace(cls)
示例#9
0
    def test_ftrace_has_no_classes_scope_dynamic(self):
        """The FTrace() class has only dynamically registered classes with scope=custom"""

        trace = trappy.FTrace(scope="custom")

        for attr in trace.thermal_classes.iterkeys():
            self.assertFalse(hasattr(trace, attr))

        for attr in trace.sched_classes.iterkeys():
            self.assertFalse(hasattr(trace, attr))

        ftrace_parser = trappy.register_dynamic_ftrace("ADynamicEvent",
                                                       "a_dynamic_event")
        trace = trappy.FTrace(scope="custom")

        self.assertTrue(hasattr(trace, "a_dynamic_event"))

        trappy.unregister_dynamic_ftrace(ftrace_parser)
示例#10
0
    def test_ftrace_has_no_classes_scope_dynamic(self):
        """The FTrace() class has only dynamically registered classes with scope=custom"""

        trace = trappy.FTrace(scope="custom")

        for attr in trace.thermal_classes.keys():
            self.assertFalse(hasattr(trace, attr))

        for attr in trace.sched_classes.keys():
            self.assertFalse(hasattr(trace, attr))

        ftrace_parser = trappy.register_dynamic_ftrace("ADynamicEvent",
                                                       "a_dynamic_event")
        trace = trappy.FTrace(scope="custom")

        self.assertTrue(hasattr(trace, "a_dynamic_event"))

        trappy.unregister_dynamic_ftrace(ftrace_parser)
示例#11
0
    def test_cache_dynamic_events(self):
        """Test that caching works if new event parsers have been registered"""

        # Parse the trace to create a cache
        GenericFTrace.disable_cache = False
        trace1 = trappy.FTrace()

        # Check we're actually testing what we think we are
        if hasattr(trace1, 'dynamic_event'):
            raise RuntimeError('Test bug: found unexpected event in trace')

        # Now register a new event type, call the constructor again, and check
        # that the newly added event (which is not present in the cache) is
        # parsed.

        parse_class = trappy.register_dynamic_ftrace("DynamicEvent", "dynamic_test_key")

        trace2 = trappy.FTrace()
        self.assertTrue(len(trace2.dynamic_event.data_frame) == 1)

        trappy.unregister_dynamic_ftrace(parse_class)
示例#12
0
    def test_parse_special_fields(self):
        """TestBase: Task name, PID, CPU and timestamp are properly paresed """

        events = {
                '1001.456789' : { 'task': 'rcu_preempt',       'pid': 1123, 'cpu': 001 },
                '1002.456789' : { 'task': 'rs:main',           'pid': 2123, 'cpu': 002 },
                '1003.456789' : { 'task': 'AsyncTask #1',      'pid': 3123, 'cpu': 003 },
                '1004.456789' : { 'task': 'kworker/1:1H',      'pid': 4123, 'cpu': 004 },
                '1005.456789' : { 'task': 'jbd2/sda2-8',       'pid': 5123, 'cpu': 005 },
        }

        in_data = """"""
        for timestamp in sorted(events):
            in_data+="{0:>16s}-{1:d} [{2:04d}] {3:s}: event0:   tag=value\n".\
                    format(
                        events[timestamp]['task'],
                        events[timestamp]['pid'],
                        events[timestamp]['cpu'],
                        timestamp
                        )

        expected_columns = set(["__comm", "__pid", "__cpu", "tag"])

        with open("trace.txt", "w") as fout:
            fout.write(in_data)

        ftrace_parser = trappy.register_dynamic_ftrace("Event0", "event0", scope="sched")
        trace = trappy.FTrace()
        dfr = trace.event0.data_frame

        self.assertEquals(set(dfr.columns), expected_columns)

        for idx in range(len(events)):
            timestap = str( dfr.index[idx]+float(events.keys()[0]))
            self.assertTrue(timestamp in events)
            self.assertEquals(dfr["__comm"].iloc[idx], events[timestap]['task'])
            self.assertEquals(dfr["__pid"].iloc[idx],  events[timestap]['pid'])
            self.assertEquals(dfr["__cpu"].iloc[idx],  events[timestap]['cpu'])

        trappy.unregister_dynamic_ftrace(ftrace_parser)
示例#13
0
    def test_parse_values_concatenation(self):
        """TestBase: Trace with space separated values created a valid DataFrame"""

        in_data = """     rcu_preempt-7     [000]    73.604532: my_sched_stat_runtime:   comm=Space separated taskname pid=7 runtime=262875 [ns] vruntime=17096359856 [ns]"""

        expected_columns = set(["__comm", "__pid", "__cpu", "comm", "pid", "runtime", "vruntime"])

        with open("trace.txt", "w") as fout:
            fout.write(in_data)

        ftrace_parser = trappy.register_dynamic_ftrace("sched_stat_runtime",
                                       "my_sched_stat_runtime", scope="sched")
        trace = trappy.FTrace()
        dfr = trace.sched_stat_runtime.data_frame

        self.assertEquals(set(dfr.columns), expected_columns)
        self.assertEquals(dfr["comm"].iloc[0], "Space separated taskname")
        self.assertEquals(dfr["pid"].iloc[0], 7)
        self.assertEquals(dfr["runtime"].iloc[0], 262875)
        self.assertEquals(dfr["vruntime"].iloc[0], 17096359856)

        trappy.unregister_dynamic_ftrace(ftrace_parser)
示例#14
0
    def test_unregister_dynamic_ftrace(self):
        """Test that dynamic events can be unregistered"""
        dyn_event = trappy.register_dynamic_ftrace("DynamicEvent",
                                                   "dynamic_test_key")
        trace = trappy.FTrace(name="first")
        self.assertTrue(len(trace.dynamic_event.data_frame) == 1)

        trappy.unregister_dynamic_ftrace(dyn_event)
        trace = trappy.FTrace(name="first")

        self.assertFalse(hasattr(trace, "dynamic_event"))

        dyn_event = trappy.register_dynamic_ftrace("DynamicEvent",
                                                   "dynamic_test_key",
                                                   scope="sched")
        trace = trappy.FTrace(name="first")
        self.assertTrue(len(trace.dynamic_event.data_frame) == 1)

        trappy.unregister_dynamic_ftrace(dyn_event)
        trace = trappy.FTrace(name="first")

        self.assertFalse(hasattr(trace, "dynamic_event"))
示例#15
0
    def test_unregister_dynamic_ftrace(self):
        """Test that dynamic events can be unregistered"""
        dyn_event = trappy.register_dynamic_ftrace("DynamicEvent",
                                                   "dynamic_test_key")
        trace = trappy.FTrace(name="first")
        self.assertTrue(len(trace.dynamic_event.data_frame) == 1)

        trappy.unregister_dynamic_ftrace(dyn_event)
        trace = trappy.FTrace(name="first")

        self.assertFalse(hasattr(trace, "dynamic_event"))

        dyn_event = trappy.register_dynamic_ftrace("DynamicEvent",
                                                   "dynamic_test_key",
                                                   scope="sched")
        trace = trappy.FTrace(name="first")
        self.assertTrue(len(trace.dynamic_event.data_frame) == 1)

        trappy.unregister_dynamic_ftrace(dyn_event)
        trace = trappy.FTrace(name="first")

        self.assertFalse(hasattr(trace, "dynamic_event"))
示例#16
0
    def test_no_none_pivot(self):
        """register_dynamic_ftrace() with default value for pivot doesn't create a class with a pivot=None"""
        cls = trappy.register_dynamic_ftrace("MyEvent", "my_dyn_test_key")
        self.assertFalse(hasattr(cls, "pivot"))

        trappy.unregister_dynamic_ftrace(cls)
示例#17
0
    def test_no_none_pivot(self):
        """register_dynamic_ftrace() with default value for pivot doesn't create a class with a pivot=None"""
        cls = trappy.register_dynamic_ftrace("MyEvent", "my_dyn_test_key")
        self.assertFalse(hasattr(cls, "pivot"))

        trappy.unregister_dynamic_ftrace(cls)