Move integration tests into their own subdir
authorAntoine Busque <abusque@efficios.com>
Thu, 10 Mar 2016 22:59:36 +0000 (17:59 -0500)
committerAntoine Busque <abusque@efficios.com>
Thu, 10 Mar 2016 22:59:36 +0000 (17:59 -0500)
Signed-off-by: Antoine Busque <abusque@efficios.com>
24 files changed:
tests/__init__.py
tests/analysis_test.py [deleted file]
tests/expected/cputop.txt [deleted file]
tests/expected/iolatencytop.txt [deleted file]
tests/expected/iousagetop.txt [deleted file]
tests/expected/irqlog.txt [deleted file]
tests/expected/irqstats.txt [deleted file]
tests/gen_ctfwriter.py [deleted file]
tests/integration/__init__.py [new file with mode: 0644]
tests/integration/analysis_test.py [new file with mode: 0644]
tests/integration/expected/cputop.txt [new file with mode: 0644]
tests/integration/expected/iolatencytop.txt [new file with mode: 0644]
tests/integration/expected/iousagetop.txt [new file with mode: 0644]
tests/integration/expected/irqlog.txt [new file with mode: 0644]
tests/integration/expected/irqstats.txt [new file with mode: 0644]
tests/integration/gen_ctfwriter.py [new file with mode: 0755]
tests/integration/test_cputop.py [new file with mode: 0644]
tests/integration/test_io.py [new file with mode: 0644]
tests/integration/test_irq.py [new file with mode: 0644]
tests/integration/trace_writer.py [new file with mode: 0644]
tests/test_cputop.py [deleted file]
tests/test_io.py [deleted file]
tests/test_irq.py [deleted file]
tests/trace_writer.py [deleted file]

index 8eca6e0700721c6538a4693d4a67ab5432431df9..6cc6302c63c9787a22a1b35afbb3b448b646c8d1 100644 (file)
@@ -19,3 +19,5 @@
 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
+
+from . import integration
diff --git a/tests/analysis_test.py b/tests/analysis_test.py
deleted file mode 100644 (file)
index 53c5b15..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-# The MIT License (MIT)
-#
-# Copyright (C) 2016 - Julien Desfossez <jdesfossez@efficios.com>
-#                      Antoine Busque <abusque@efficios.com>
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-
-import os
-import subprocess
-import unittest
-from .trace_writer import TraceWriter
-
-
-class AnalysisTest(unittest.TestCase):
-    COMMON_OPTIONS = '--no-progress --skip-validation --gmt'
-
-    def __init__(self, *args, **kwargs):
-        super().__init__(*args, **kwargs)
-        self.rm_trace = True
-
-    def set_up_class(self):
-        dirname = os.path.dirname(os.path.realpath(__file__))
-        self.data_path = dirname + '/expected/'
-        self.maxDiff = None
-        self.trace_writer = TraceWriter()
-        self.write_trace()
-
-    def tear_down_class(self):
-        if self.rm_trace:
-            self.trace_writer.rm_trace()
-
-    def write_trace(self):
-        raise NotImplementedError
-
-    def run(self, result=None):
-        self.set_up_class()
-        super().run(result)
-        self.tear_down_class()
-
-        return result
-
-    def get_expected_output(self, test_name):
-        expected_path = os.path.join(self.data_path, test_name + '.txt')
-        with open(expected_path, 'r') as expected_file:
-            return expected_file.read()
-
-    def get_cmd_output(self, exec_name, options=''):
-        cmd_fmt = './{} {} {} {}'
-        cmd = cmd_fmt.format(exec_name, self.COMMON_OPTIONS,
-                             options, self.trace_writer.trace_root)
-
-        return subprocess.getoutput(cmd)
-
-    def save_test_result(self, result, test_name):
-        result_path = os.path.join(self.trace_writer.trace_root, test_name)
-        with open(result_path, 'w') as result_file:
-            result_file.write(result)
-            self.rm_trace = False
-
-    def _assertMultiLineEqual(self, result, expected, test_name):
-        try:
-            self.assertMultiLineEqual(result, expected)
-        except AssertionError:
-            self.save_test_result(result, test_name)
-            raise
diff --git a/tests/expected/cputop.txt b/tests/expected/cputop.txt
deleted file mode 100644 (file)
index 50ff7a0..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-Timerange: [1970-01-01 00:00:01.000000000, 1970-01-01 00:00:11.000000000]
-Per-TID Usage                                                                               Process                   Migrations   Priorities
-################################################################################
-████████████████████████████████████████████████████████████████████████████████ 100.00 %   prog100pc-cpu5 (42)                0   [20]
-████████████████████                                                              25.00 %   prog25pc-cpu1 (30665)              0   [20]
-████████████████                                                                  20.00 %   prog20pc-cpu0 (30664)              0   [20]
-
-Per-CPU Usage
-################################################################################
-████████████████                                                                  20.00 % CPU 0
-████████████████████                                                              25.00 % CPU 1
-████████████████████████████████████████████████████████████████████████████████ 100.00 % CPU 5
-
-
-Total CPU Usage: 48.33%
diff --git a/tests/expected/iolatencytop.txt b/tests/expected/iolatencytop.txt
deleted file mode 100644 (file)
index b59e5b5..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-Timerange: [1970-01-01 00:00:01.000000000, 1970-01-01 00:00:01.024000000]
-
-Top system call latencies open (usec)
-Begin                End                  Name             Duration (usec)         Size  Proc                     PID      Filename      
-[00:00:01.023000000, 00:00:01.024000000]  open                    1000.000          N/A  app3                     101      test/open/file (fd=42)
-
-Top system call latencies read (usec)
-Begin                End                  Name             Duration (usec)         Size  Proc                     PID      Filename      
-[00:00:01.008000000, 00:00:01.009000000]  read                    1000.000      100   B  app2                     100      testfile (fd=3)
-[00:00:01.012000000, 00:00:01.013000000]  read                    1000.000       42   B  app3                     101      unknown (fd=3)
-
-Top system call latencies write (usec)
-Begin                End                  Name             Duration (usec)         Size  Proc                     PID      Filename      
-[00:00:01.004000000, 00:00:01.005000000]  write                   1000.000       10   B  app                      99       unknown (fd=4)
\ No newline at end of file
diff --git a/tests/expected/iousagetop.txt b/tests/expected/iousagetop.txt
deleted file mode 100644 (file)
index d7f45fe..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-Timerange: [1970-01-01 00:00:01.000000000, 1970-01-01 00:00:01.024000000]
-Per-process I/O Read                                                                     Process                   Disk       Net        Unknown   
-################################################################################
-████████████████████████████████████████████████████████████████████████████████ 100   B app2 (100)                     0   B      0   B    100   B
-█████████████████████████████████                                                 42   B app3 (unknown (tid=101))       0   B      0   B     42   B
-                                                                                   0   B app (99)                       0   B      0   B      0   B
-
-Per-process I/O Write                                                                   Process                   Disk       Net        Unknown   
-################################################################################
-████████████████████████████████████████████████████████████████████████████████ 10   B app (99)                       0   B      0   B     10   B
-                                                                                  0   B app2 (100)                     0   B      0   B      0   B
-                                                                                  0   B app3 (unknown (tid=101))       0   B      0   B      0   B
-
-Per-file I/O Read                                                                        Path
-################################################################################
-████████████████████████████████████████████████████████████████████████████████ 100   B testfile
-█████████████████████████████████                                                 42   B unknown (app3)
-
-Per-file I/O Write                                                                      Path
-################################################################################
-████████████████████████████████████████████████████████████████████████████████ 10   B unknown (app)
-
-Block I/O Read                                                                            Process
-################################################################################
-████████████████████████████████████████████████████████████████████████████████ 5.00 KiB app (pid=99)
-
-Block I/O Write                                                                            Process
-################################################################################
-████████████████████████████████████████████████████████████████████████████████ 10.00 KiB app3 (pid=unknown (tid=101))
-
-Disk Requests Sector Count                                                                  Disk
-################################################################################
-████████████████████████████████████████████████████████████████████████████████ 20 sectors (8,0)
-████████████████████████████████████████                                         10 sectors (252,0)
-
-Disk Request Count                                                                          Disk
-################################################################################
-████████████████████████████████████████████████████████████████████████████████ 1 requests (252,0)
-████████████████████████████████████████████████████████████████████████████████ 1 requests (8,0)
-
-Disk Request Average Latency                                                             Disk
-################################################################################
-████████████████████████████████████████████████████████████████████████████████ 1.00 ms (252,0)
-████████████████████████████████████████████████████████████████████████████████ 1.00 ms (8,0)
-
-Network Received Bytes                                                                   Interface
-################################################################################
-████████████████████████████████████████████████████████████████████████████████ 200   B wlan0
-████████████████████████████████████████                                         100   B wlan1
-
-Network Sent Bytes                                                                       Interface
-################################################################################
-████████████████████████████████████████████████████████████████████████████████ 100   B wlan0
-                                                                                   0   B wlan1
diff --git a/tests/expected/irqlog.txt b/tests/expected/irqlog.txt
deleted file mode 100644 (file)
index f75d8a6..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-Timerange: [1970-01-01 00:00:01.000000000, 1970-01-01 00:00:01.045000000]
-Begin                End                   Duration (us)  CPU  Type         #  Name                  
-[00:00:01.007000000, 00:00:01.008000000]        1000.000    1  SoftIRQ      1  TIMER_SOFTIRQ (raised at 00:00:01.000000000)
-[00:00:01.006000000, 00:00:01.009000000]        3000.000    3  SoftIRQ      1  TIMER_SOFTIRQ (raised at 00:00:01.001000000)
-[00:00:01.010000000, 00:00:01.012000000]        2000.000    1  SoftIRQ      9  RCU_SOFTIRQ (raised at 00:00:01.002000000)
-[00:00:01.011000000, 00:00:01.013000000]        2000.000    3  SoftIRQ      7  SCHED_SOFTIRQ (raised at 00:00:01.005000000)
-[00:00:01.014000000, 00:00:01.015000000]        1000.000    3  SoftIRQ      9  RCU_SOFTIRQ (raised at 00:00:01.004000000)
-[00:00:01.016000000, 00:00:01.018000000]        2000.000    0  IRQ         41  ahci                  
-[00:00:01.019000000, 00:00:01.020000000]        1000.000    0  SoftIRQ      4  BLOCK_SOFTIRQ (raised at 00:00:01.017000000)
-[00:00:01.021000000, 00:00:01.023000000]        2000.000    0  IRQ         41  ahci                  
-[00:00:01.024000000, 00:00:01.025000000]        1000.000    0  SoftIRQ      4  BLOCK_SOFTIRQ (raised at 00:00:01.022000000)
-[00:00:01.026000000, 00:00:01.028000000]        2000.000    0  IRQ         41  ahci                  
-[00:00:01.029000000, 00:00:01.030000000]        1000.000    0  SoftIRQ      4  BLOCK_SOFTIRQ (raised at 00:00:01.027000000)
-[00:00:01.031000000, 00:00:01.033000000]        2000.000    0  IRQ         41  ahci                  
-[00:00:01.034000000, 00:00:01.035000000]        1000.000    0  SoftIRQ      4  BLOCK_SOFTIRQ (raised at 00:00:01.032000000)
-[00:00:01.036000000, 00:00:01.038000000]        2000.000    0  IRQ         41  ahci                  
-[00:00:01.039000000, 00:00:01.040000000]        1000.000    0  SoftIRQ      4  BLOCK_SOFTIRQ (raised at 00:00:01.037000000)
-[00:00:01.041000000, 00:00:01.043000000]        2000.000    0  IRQ         41  ahci                  
-[00:00:01.044000000, 00:00:01.045000000]        1000.000    0  SoftIRQ      4  BLOCK_SOFTIRQ (raised at 00:00:01.042000000)
\ No newline at end of file
diff --git a/tests/expected/irqstats.txt b/tests/expected/irqstats.txt
deleted file mode 100644 (file)
index 99dfef9..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-Timerange: [1970-01-01 00:00:01.000000000, 1970-01-01 00:00:01.045000000]
-Hard IRQ                                             Duration (us)
-                       count          min          avg          max        stdev       
-----------------------------------------------------------------------------------|
-41: <ahci>                 6     2000.000     2000.000     2000.000        0.000  |
-
-Soft IRQ                                             Duration (us)                                        Raise latency (us)
-                       count          min          avg          max        stdev  |  count          min          avg          max        stdev       
-----------------------------------------------------------------------------------|------------------------------------------------------------
-1:  <TIMER_SOFTIRQ>        2     1000.000     2000.000     3000.000     1414.214  |      2     5000.000     6000.000     7000.000     1414.214
-4:  <BLOCK_SOFTIRQ>        6     1000.000     1000.000     1000.000        0.000  |      6     2000.000     2000.000     2000.000        0.000
-7:  <SCHED_SOFTIRQ>        1     2000.000     2000.000     2000.000            ?  |      1     6000.000     6000.000     6000.000            ?
-9:  <RCU_SOFTIRQ>          2     1000.000     1500.000     2000.000      707.107  |      2     8000.000     9000.000    10000.000     1414.214
\ No newline at end of file
diff --git a/tests/gen_ctfwriter.py b/tests/gen_ctfwriter.py
deleted file mode 100755 (executable)
index ccb6ba8..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-#!/usr/bin/env python3
-#
-# The MIT License (MIT)
-#
-# Copyright (C) 2016 - Julien Desfossez <jdesfossez@efficios.com>
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-
-# Helper tool to generate CTFWriter code from the metadata of an existing
-# trace.
-# It used to add code in TraceTest.py.
-# Only the basic types are supported, a warning is generated if a field cannot
-# be generated so it is easy to look manually at the metadata and fix it.
-
-import sys
-import argparse
-
-from babeltrace import TraceCollection, CTFScope, CTFTypeId
-
-
-def get_definition_type(field, event):
-    if field.type == CTFTypeId.INTEGER:
-        signed = ''
-        if field.signedness == 0:
-            signed = 'u'
-        length = field.length
-        print('        self.%s.add_field(self.%sint%s_type, "_%s")' %
-              (event.name, signed, length, field.name))
-    elif field.type == CTFTypeId.ARRAY:
-        print('        self.%s.add_field(self.array%s_type, "_%s")' %
-              (event.name, field.length, field.name))
-    elif field.type == CTFTypeId.STRING:
-        print('        self.%s.add_field(self.string_type, "_%s")' %
-              (event.name, field.name))
-    else:
-        print('        # FIXME %s.%s: Unhandled type %d' % (event.name,
-                                                            field.name,
-                                                            field.type))
-
-
-def gen_define(event):
-        fields = []
-        print('    def define_%s(self):' % (event.name))
-        print('        self.%s = CTFWriter.EventClass("%s")' %
-              (event.name, event.name))
-        for field in event.fields:
-            if field.scope == CTFScope.EVENT_FIELDS:
-                fname = field.name
-                fields.append(fname)
-                get_definition_type(field, event)
-        print('        self.add_event(self.%s)' % event.name)
-        print('')
-        return fields
-
-
-def gen_write(event, fields):
-        f_list = None
-        for f in fields:
-            if f_list is None:
-                f_list = f
-            else:
-                f_list = f_list + ", %s" % (f)
-        print('    def write_%s(self, time_ms, cpu_id, %s):' % (event.name,
-                                                                f_list))
-        print('        event = CTFWriter.Event(self.%s)' % (event.name))
-        print('        self.clock.time = time_ms * 1000000')
-        print('        self.set_int(event.payload("_cpu_id"), cpu_id)')
-        for field in event.fields:
-            if field.scope == CTFScope.EVENT_FIELDS:
-                fname = field.name
-                if field.type == CTFTypeId.INTEGER:
-                    print('        self.set_int(event.payload("_%s"), %s)' %
-                          (fname, fname))
-                elif field.type == CTFTypeId.ARRAY:
-                    print('        self.set_char_array(event.payload("_%s"), '
-                          '%s)' % (fname, fname))
-                elif field.type == CTFTypeId.STRING:
-                    print('        self.set_string(event.payload("_%s"), %s)' %
-                          (fname, fname))
-                else:
-                    print('        # FIXME %s.%s: Unhandled type %d' %
-                          (event.name, field.name, field.type))
-        print('        self.stream.append_event(event)')
-        print('        self.stream.flush()')
-        print('')
-
-
-def gen_parser(handle, args):
-    for h in handle.values():
-        for event in h.events:
-            fields = gen_define(event)
-            gen_write(event, fields)
-
-
-if __name__ == "__main__":
-    parser = argparse.ArgumentParser(description='CTFWriter code generator')
-    parser.add_argument('path', metavar="<path/to/trace>", help='Trace path')
-    args = parser.parse_args()
-
-    traces = TraceCollection()
-    handle = traces.add_traces_recursive(args.path, "ctf")
-    if handle is None:
-        sys.exit(1)
-
-    gen_parser(handle, args)
-
-    for h in handle.values():
-        traces.remove_trace(h)
diff --git a/tests/integration/__init__.py b/tests/integration/__init__.py
new file mode 100644 (file)
index 0000000..8eca6e0
--- /dev/null
@@ -0,0 +1,21 @@
+# The MIT License (MIT)
+#
+# Copyright (C) 2016 - Antoine Busque <abusque@efficios.com>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
diff --git a/tests/integration/analysis_test.py b/tests/integration/analysis_test.py
new file mode 100644 (file)
index 0000000..53c5b15
--- /dev/null
@@ -0,0 +1,81 @@
+# The MIT License (MIT)
+#
+# Copyright (C) 2016 - Julien Desfossez <jdesfossez@efficios.com>
+#                      Antoine Busque <abusque@efficios.com>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+import os
+import subprocess
+import unittest
+from .trace_writer import TraceWriter
+
+
+class AnalysisTest(unittest.TestCase):
+    COMMON_OPTIONS = '--no-progress --skip-validation --gmt'
+
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        self.rm_trace = True
+
+    def set_up_class(self):
+        dirname = os.path.dirname(os.path.realpath(__file__))
+        self.data_path = dirname + '/expected/'
+        self.maxDiff = None
+        self.trace_writer = TraceWriter()
+        self.write_trace()
+
+    def tear_down_class(self):
+        if self.rm_trace:
+            self.trace_writer.rm_trace()
+
+    def write_trace(self):
+        raise NotImplementedError
+
+    def run(self, result=None):
+        self.set_up_class()
+        super().run(result)
+        self.tear_down_class()
+
+        return result
+
+    def get_expected_output(self, test_name):
+        expected_path = os.path.join(self.data_path, test_name + '.txt')
+        with open(expected_path, 'r') as expected_file:
+            return expected_file.read()
+
+    def get_cmd_output(self, exec_name, options=''):
+        cmd_fmt = './{} {} {} {}'
+        cmd = cmd_fmt.format(exec_name, self.COMMON_OPTIONS,
+                             options, self.trace_writer.trace_root)
+
+        return subprocess.getoutput(cmd)
+
+    def save_test_result(self, result, test_name):
+        result_path = os.path.join(self.trace_writer.trace_root, test_name)
+        with open(result_path, 'w') as result_file:
+            result_file.write(result)
+            self.rm_trace = False
+
+    def _assertMultiLineEqual(self, result, expected, test_name):
+        try:
+            self.assertMultiLineEqual(result, expected)
+        except AssertionError:
+            self.save_test_result(result, test_name)
+            raise
diff --git a/tests/integration/expected/cputop.txt b/tests/integration/expected/cputop.txt
new file mode 100644 (file)
index 0000000..50ff7a0
--- /dev/null
@@ -0,0 +1,15 @@
+Timerange: [1970-01-01 00:00:01.000000000, 1970-01-01 00:00:11.000000000]
+Per-TID Usage                                                                               Process                   Migrations   Priorities
+################################################################################
+████████████████████████████████████████████████████████████████████████████████ 100.00 %   prog100pc-cpu5 (42)                0   [20]
+████████████████████                                                              25.00 %   prog25pc-cpu1 (30665)              0   [20]
+████████████████                                                                  20.00 %   prog20pc-cpu0 (30664)              0   [20]
+
+Per-CPU Usage
+################################################################################
+████████████████                                                                  20.00 % CPU 0
+████████████████████                                                              25.00 % CPU 1
+████████████████████████████████████████████████████████████████████████████████ 100.00 % CPU 5
+
+
+Total CPU Usage: 48.33%
diff --git a/tests/integration/expected/iolatencytop.txt b/tests/integration/expected/iolatencytop.txt
new file mode 100644 (file)
index 0000000..b59e5b5
--- /dev/null
@@ -0,0 +1,14 @@
+Timerange: [1970-01-01 00:00:01.000000000, 1970-01-01 00:00:01.024000000]
+
+Top system call latencies open (usec)
+Begin                End                  Name             Duration (usec)         Size  Proc                     PID      Filename      
+[00:00:01.023000000, 00:00:01.024000000]  open                    1000.000          N/A  app3                     101      test/open/file (fd=42)
+
+Top system call latencies read (usec)
+Begin                End                  Name             Duration (usec)         Size  Proc                     PID      Filename      
+[00:00:01.008000000, 00:00:01.009000000]  read                    1000.000      100   B  app2                     100      testfile (fd=3)
+[00:00:01.012000000, 00:00:01.013000000]  read                    1000.000       42   B  app3                     101      unknown (fd=3)
+
+Top system call latencies write (usec)
+Begin                End                  Name             Duration (usec)         Size  Proc                     PID      Filename      
+[00:00:01.004000000, 00:00:01.005000000]  write                   1000.000       10   B  app                      99       unknown (fd=4)
\ No newline at end of file
diff --git a/tests/integration/expected/iousagetop.txt b/tests/integration/expected/iousagetop.txt
new file mode 100644 (file)
index 0000000..d7f45fe
--- /dev/null
@@ -0,0 +1,54 @@
+Timerange: [1970-01-01 00:00:01.000000000, 1970-01-01 00:00:01.024000000]
+Per-process I/O Read                                                                     Process                   Disk       Net        Unknown   
+################################################################################
+████████████████████████████████████████████████████████████████████████████████ 100   B app2 (100)                     0   B      0   B    100   B
+█████████████████████████████████                                                 42   B app3 (unknown (tid=101))       0   B      0   B     42   B
+                                                                                   0   B app (99)                       0   B      0   B      0   B
+
+Per-process I/O Write                                                                   Process                   Disk       Net        Unknown   
+################################################################################
+████████████████████████████████████████████████████████████████████████████████ 10   B app (99)                       0   B      0   B     10   B
+                                                                                  0   B app2 (100)                     0   B      0   B      0   B
+                                                                                  0   B app3 (unknown (tid=101))       0   B      0   B      0   B
+
+Per-file I/O Read                                                                        Path
+################################################################################
+████████████████████████████████████████████████████████████████████████████████ 100   B testfile
+█████████████████████████████████                                                 42   B unknown (app3)
+
+Per-file I/O Write                                                                      Path
+################################################################################
+████████████████████████████████████████████████████████████████████████████████ 10   B unknown (app)
+
+Block I/O Read                                                                            Process
+################################################################################
+████████████████████████████████████████████████████████████████████████████████ 5.00 KiB app (pid=99)
+
+Block I/O Write                                                                            Process
+################################################################################
+████████████████████████████████████████████████████████████████████████████████ 10.00 KiB app3 (pid=unknown (tid=101))
+
+Disk Requests Sector Count                                                                  Disk
+################################################################################
+████████████████████████████████████████████████████████████████████████████████ 20 sectors (8,0)
+████████████████████████████████████████                                         10 sectors (252,0)
+
+Disk Request Count                                                                          Disk
+################################################################################
+████████████████████████████████████████████████████████████████████████████████ 1 requests (252,0)
+████████████████████████████████████████████████████████████████████████████████ 1 requests (8,0)
+
+Disk Request Average Latency                                                             Disk
+################################################################################
+████████████████████████████████████████████████████████████████████████████████ 1.00 ms (252,0)
+████████████████████████████████████████████████████████████████████████████████ 1.00 ms (8,0)
+
+Network Received Bytes                                                                   Interface
+################################################################################
+████████████████████████████████████████████████████████████████████████████████ 200   B wlan0
+████████████████████████████████████████                                         100   B wlan1
+
+Network Sent Bytes                                                                       Interface
+################################################################################
+████████████████████████████████████████████████████████████████████████████████ 100   B wlan0
+                                                                                   0   B wlan1
diff --git a/tests/integration/expected/irqlog.txt b/tests/integration/expected/irqlog.txt
new file mode 100644 (file)
index 0000000..f75d8a6
--- /dev/null
@@ -0,0 +1,19 @@
+Timerange: [1970-01-01 00:00:01.000000000, 1970-01-01 00:00:01.045000000]
+Begin                End                   Duration (us)  CPU  Type         #  Name                  
+[00:00:01.007000000, 00:00:01.008000000]        1000.000    1  SoftIRQ      1  TIMER_SOFTIRQ (raised at 00:00:01.000000000)
+[00:00:01.006000000, 00:00:01.009000000]        3000.000    3  SoftIRQ      1  TIMER_SOFTIRQ (raised at 00:00:01.001000000)
+[00:00:01.010000000, 00:00:01.012000000]        2000.000    1  SoftIRQ      9  RCU_SOFTIRQ (raised at 00:00:01.002000000)
+[00:00:01.011000000, 00:00:01.013000000]        2000.000    3  SoftIRQ      7  SCHED_SOFTIRQ (raised at 00:00:01.005000000)
+[00:00:01.014000000, 00:00:01.015000000]        1000.000    3  SoftIRQ      9  RCU_SOFTIRQ (raised at 00:00:01.004000000)
+[00:00:01.016000000, 00:00:01.018000000]        2000.000    0  IRQ         41  ahci                  
+[00:00:01.019000000, 00:00:01.020000000]        1000.000    0  SoftIRQ      4  BLOCK_SOFTIRQ (raised at 00:00:01.017000000)
+[00:00:01.021000000, 00:00:01.023000000]        2000.000    0  IRQ         41  ahci                  
+[00:00:01.024000000, 00:00:01.025000000]        1000.000    0  SoftIRQ      4  BLOCK_SOFTIRQ (raised at 00:00:01.022000000)
+[00:00:01.026000000, 00:00:01.028000000]        2000.000    0  IRQ         41  ahci                  
+[00:00:01.029000000, 00:00:01.030000000]        1000.000    0  SoftIRQ      4  BLOCK_SOFTIRQ (raised at 00:00:01.027000000)
+[00:00:01.031000000, 00:00:01.033000000]        2000.000    0  IRQ         41  ahci                  
+[00:00:01.034000000, 00:00:01.035000000]        1000.000    0  SoftIRQ      4  BLOCK_SOFTIRQ (raised at 00:00:01.032000000)
+[00:00:01.036000000, 00:00:01.038000000]        2000.000    0  IRQ         41  ahci                  
+[00:00:01.039000000, 00:00:01.040000000]        1000.000    0  SoftIRQ      4  BLOCK_SOFTIRQ (raised at 00:00:01.037000000)
+[00:00:01.041000000, 00:00:01.043000000]        2000.000    0  IRQ         41  ahci                  
+[00:00:01.044000000, 00:00:01.045000000]        1000.000    0  SoftIRQ      4  BLOCK_SOFTIRQ (raised at 00:00:01.042000000)
\ No newline at end of file
diff --git a/tests/integration/expected/irqstats.txt b/tests/integration/expected/irqstats.txt
new file mode 100644 (file)
index 0000000..99dfef9
--- /dev/null
@@ -0,0 +1,13 @@
+Timerange: [1970-01-01 00:00:01.000000000, 1970-01-01 00:00:01.045000000]
+Hard IRQ                                             Duration (us)
+                       count          min          avg          max        stdev       
+----------------------------------------------------------------------------------|
+41: <ahci>                 6     2000.000     2000.000     2000.000        0.000  |
+
+Soft IRQ                                             Duration (us)                                        Raise latency (us)
+                       count          min          avg          max        stdev  |  count          min          avg          max        stdev       
+----------------------------------------------------------------------------------|------------------------------------------------------------
+1:  <TIMER_SOFTIRQ>        2     1000.000     2000.000     3000.000     1414.214  |      2     5000.000     6000.000     7000.000     1414.214
+4:  <BLOCK_SOFTIRQ>        6     1000.000     1000.000     1000.000        0.000  |      6     2000.000     2000.000     2000.000        0.000
+7:  <SCHED_SOFTIRQ>        1     2000.000     2000.000     2000.000            ?  |      1     6000.000     6000.000     6000.000            ?
+9:  <RCU_SOFTIRQ>          2     1000.000     1500.000     2000.000      707.107  |      2     8000.000     9000.000    10000.000     1414.214
\ No newline at end of file
diff --git a/tests/integration/gen_ctfwriter.py b/tests/integration/gen_ctfwriter.py
new file mode 100755 (executable)
index 0000000..ccb6ba8
--- /dev/null
@@ -0,0 +1,124 @@
+#!/usr/bin/env python3
+#
+# The MIT License (MIT)
+#
+# Copyright (C) 2016 - Julien Desfossez <jdesfossez@efficios.com>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+# Helper tool to generate CTFWriter code from the metadata of an existing
+# trace.
+# It used to add code in TraceTest.py.
+# Only the basic types are supported, a warning is generated if a field cannot
+# be generated so it is easy to look manually at the metadata and fix it.
+
+import sys
+import argparse
+
+from babeltrace import TraceCollection, CTFScope, CTFTypeId
+
+
+def get_definition_type(field, event):
+    if field.type == CTFTypeId.INTEGER:
+        signed = ''
+        if field.signedness == 0:
+            signed = 'u'
+        length = field.length
+        print('        self.%s.add_field(self.%sint%s_type, "_%s")' %
+              (event.name, signed, length, field.name))
+    elif field.type == CTFTypeId.ARRAY:
+        print('        self.%s.add_field(self.array%s_type, "_%s")' %
+              (event.name, field.length, field.name))
+    elif field.type == CTFTypeId.STRING:
+        print('        self.%s.add_field(self.string_type, "_%s")' %
+              (event.name, field.name))
+    else:
+        print('        # FIXME %s.%s: Unhandled type %d' % (event.name,
+                                                            field.name,
+                                                            field.type))
+
+
+def gen_define(event):
+        fields = []
+        print('    def define_%s(self):' % (event.name))
+        print('        self.%s = CTFWriter.EventClass("%s")' %
+              (event.name, event.name))
+        for field in event.fields:
+            if field.scope == CTFScope.EVENT_FIELDS:
+                fname = field.name
+                fields.append(fname)
+                get_definition_type(field, event)
+        print('        self.add_event(self.%s)' % event.name)
+        print('')
+        return fields
+
+
+def gen_write(event, fields):
+        f_list = None
+        for f in fields:
+            if f_list is None:
+                f_list = f
+            else:
+                f_list = f_list + ", %s" % (f)
+        print('    def write_%s(self, time_ms, cpu_id, %s):' % (event.name,
+                                                                f_list))
+        print('        event = CTFWriter.Event(self.%s)' % (event.name))
+        print('        self.clock.time = time_ms * 1000000')
+        print('        self.set_int(event.payload("_cpu_id"), cpu_id)')
+        for field in event.fields:
+            if field.scope == CTFScope.EVENT_FIELDS:
+                fname = field.name
+                if field.type == CTFTypeId.INTEGER:
+                    print('        self.set_int(event.payload("_%s"), %s)' %
+                          (fname, fname))
+                elif field.type == CTFTypeId.ARRAY:
+                    print('        self.set_char_array(event.payload("_%s"), '
+                          '%s)' % (fname, fname))
+                elif field.type == CTFTypeId.STRING:
+                    print('        self.set_string(event.payload("_%s"), %s)' %
+                          (fname, fname))
+                else:
+                    print('        # FIXME %s.%s: Unhandled type %d' %
+                          (event.name, field.name, field.type))
+        print('        self.stream.append_event(event)')
+        print('        self.stream.flush()')
+        print('')
+
+
+def gen_parser(handle, args):
+    for h in handle.values():
+        for event in h.events:
+            fields = gen_define(event)
+            gen_write(event, fields)
+
+
+if __name__ == "__main__":
+    parser = argparse.ArgumentParser(description='CTFWriter code generator')
+    parser.add_argument('path', metavar="<path/to/trace>", help='Trace path')
+    args = parser.parse_args()
+
+    traces = TraceCollection()
+    handle = traces.add_traces_recursive(args.path, "ctf")
+    if handle is None:
+        sys.exit(1)
+
+    gen_parser(handle, args)
+
+    for h in handle.values():
+        traces.remove_trace(h)
diff --git a/tests/integration/test_cputop.py b/tests/integration/test_cputop.py
new file mode 100644 (file)
index 0000000..93943bb
--- /dev/null
@@ -0,0 +1,48 @@
+# The MIT License (MIT)
+#
+# Copyright (C) 2016 - Julien Desfossez <jdesfossez@efficios.com>
+#                      Antoine Busque <abusque@efficios.com>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from .analysis_test import AnalysisTest
+
+
+class CpuTest(AnalysisTest):
+    def write_trace(self):
+        # runs the whole time: 100%
+        self.trace_writer.write_sched_switch(1000, 5, 'swapper/5',
+                                             0, 'prog100pc-cpu5', 42)
+        # runs for 2s alternating with swapper out every 100ms
+        self.trace_writer.sched_switch_50pc(1100, 5000, 0, 100, 'swapper/0',
+                                            0, 'prog20pc-cpu0', 30664)
+        # runs for 2.5s alternating with swapper out every 100ms
+        self.trace_writer.sched_switch_50pc(5100, 10000, 1, 100, 'swapper/1',
+                                            0, 'prog25pc-cpu1', 30665)
+        # switch out prog100pc-cpu5
+        self.trace_writer.write_sched_switch(11000, 5, 'prog100pc-cpu5',
+                                             42, 'swapper/5', 0)
+        self.trace_writer.flush()
+
+    def test_cputop(self):
+        test_name = 'cputop'
+        expected = self.get_expected_output(test_name)
+        result = self.get_cmd_output('lttng-cputop')
+
+        self._assertMultiLineEqual(result, expected, test_name)
diff --git a/tests/integration/test_io.py b/tests/integration/test_io.py
new file mode 100644 (file)
index 0000000..0ab5755
--- /dev/null
@@ -0,0 +1,79 @@
+# The MIT License (MIT)
+#
+# Copyright (C) 2016 - Julien Desfossez <jdesfossez@efficios.com>
+#                      Antoine Busque <abusque@efficios.com>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from .analysis_test import AnalysisTest
+
+
+class IoTest(AnalysisTest):
+    def write_trace(self):
+        # app (99) is known at statedump
+        self.trace_writer.write_lttng_statedump_process_state(
+            1000, 0, 99, 99, 99, 99, 98, 98, 'app', 0, 5, 0, 5, 0)
+        # app2 (100) unknown at statedump has testfile, FD 3 defined at
+        # statedump
+        self.trace_writer.write_lttng_statedump_file_descriptor(
+            1001, 0, 100, 3, 0, 0, 'testfile')
+        # app write 10 bytes to FD 4
+        self.trace_writer.write_sched_switch(1002, 0, 'swapper/0', 0, 'app',
+                                             99)
+        self.trace_writer.write_syscall_write(1004, 0, 1, 4, 0xabcd, 10, 10)
+        # app2 reads 100 bytes in FD 3
+        self.trace_writer.write_sched_switch(1006, 0, 'app', 99, 'app2', 100)
+        self.trace_writer.write_syscall_read(1008, 0, 1, 3, 0xcafe, 100, 100)
+        # app3 and its FD 3 are completely unknown at statedump, tries to read
+        # 100 bytes from FD 3 but only gets 42
+        self.trace_writer.write_sched_switch(1010, 0, 'app2', 100, 'app3', 101)
+        self.trace_writer.write_syscall_read(1012, 0, 1, 3, 0xcafe, 100, 42)
+        # block write
+        self.trace_writer.write_block_rq_issue(1015, 0, 264241152, 33, 10, 40,
+                                               99, 0, 0, '', 'app')
+        self.trace_writer.write_block_rq_complete(1016, 0, 264241152, 33, 10,
+                                                  0, 0, 0, '')
+        # block read
+        self.trace_writer.write_block_rq_issue(1017, 0, 8388608, 33, 20, 90,
+                                               101, 1, 0, '', 'app3')
+        self.trace_writer.write_block_rq_complete(1018, 0, 8388608, 33, 20, 0,
+                                                  1, 0, '')
+        # net xmit
+        self.trace_writer.write_net_dev_xmit(1020, 2, 0xff, 32, 100, 'wlan0')
+        # net receive
+        self.trace_writer.write_netif_receive_skb(1021, 1, 0xff, 100, 'wlan1')
+        self.trace_writer.write_netif_receive_skb(1022, 1, 0xff, 200, 'wlan0')
+        # syscall open
+        self.trace_writer.write_syscall_open(1023, 0, 1, 'test/open/file', 0,
+                                             0, 42)
+        self.trace_writer.flush()
+
+    def test_iousagetop(self):
+        test_name = 'iousagetop'
+        expected = self.get_expected_output(test_name)
+        result = self.get_cmd_output('lttng-iousagetop')
+
+        self._assertMultiLineEqual(result, expected, test_name)
+
+    def test_iolatencytop(self):
+        test_name = 'iolatencytop'
+        expected = self.get_expected_output(test_name)
+        result = self.get_cmd_output('lttng-iolatencytop')
+
+        self._assertMultiLineEqual(result, expected, test_name)
diff --git a/tests/integration/test_irq.py b/tests/integration/test_irq.py
new file mode 100644 (file)
index 0000000..6a0856c
--- /dev/null
@@ -0,0 +1,89 @@
+# The MIT License (MIT)
+#
+# Copyright (C) 2016 - Julien Desfossez <jdesfossez@efficios.com>
+#                      Antoine Busque <abusque@efficios.com>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from .analysis_test import AnalysisTest
+
+
+class IrqTest(AnalysisTest):
+    def write_trace(self):
+        self.trace_writer.write_softirq_raise(1000, 1, 1)
+        self.trace_writer.write_softirq_raise(1001, 3, 1)
+        self.trace_writer.write_softirq_raise(1002, 1, 9)
+        self.trace_writer.write_softirq_exit(1003, 0, 4)
+        self.trace_writer.write_softirq_raise(1004, 3, 9)
+        self.trace_writer.write_softirq_raise(1005, 3, 7)
+        self.trace_writer.write_softirq_entry(1006, 3, 1)
+        self.trace_writer.write_softirq_entry(1007, 1, 1)
+        self.trace_writer.write_softirq_exit(1008, 1, 1)
+        self.trace_writer.write_softirq_exit(1009, 3, 1)
+        self.trace_writer.write_softirq_entry(1010, 1, 9)
+        self.trace_writer.write_softirq_entry(1011, 3, 7)
+        self.trace_writer.write_softirq_exit(1012, 1, 9)
+        self.trace_writer.write_softirq_exit(1013, 3, 7)
+        self.trace_writer.write_softirq_entry(1014, 3, 9)
+        self.trace_writer.write_softirq_exit(1015, 3, 9)
+        self.trace_writer.write_irq_handler_entry(1016, 0, 41, 'ahci')
+        self.trace_writer.write_softirq_raise(1017, 0, 4)
+        self.trace_writer.write_irq_handler_exit(1018, 0, 41, 1)
+        self.trace_writer.write_softirq_entry(1019, 0, 4)
+        self.trace_writer.write_softirq_exit(1020, 0, 4)
+        self.trace_writer.write_irq_handler_entry(1021, 0, 41, 'ahci')
+        self.trace_writer.write_softirq_raise(1022, 0, 4)
+        self.trace_writer.write_irq_handler_exit(1023, 0, 41, 1)
+        self.trace_writer.write_softirq_entry(1024, 0, 4)
+        self.trace_writer.write_softirq_exit(1025, 0, 4)
+        self.trace_writer.write_irq_handler_entry(1026, 0, 41, 'ahci')
+        self.trace_writer.write_softirq_raise(1027, 0, 4)
+        self.trace_writer.write_irq_handler_exit(1028, 0, 41, 1)
+        self.trace_writer.write_softirq_entry(1029, 0, 4)
+        self.trace_writer.write_softirq_exit(1030, 0, 4)
+        self.trace_writer.write_irq_handler_entry(1031, 0, 41, 'ahci')
+        self.trace_writer.write_softirq_raise(1032, 0, 4)
+        self.trace_writer.write_irq_handler_exit(1033, 0, 41, 1)
+        self.trace_writer.write_softirq_entry(1034, 0, 4)
+        self.trace_writer.write_softirq_exit(1035, 0, 4)
+        self.trace_writer.write_irq_handler_entry(1036, 0, 41, 'ahci')
+        self.trace_writer.write_softirq_raise(1037, 0, 4)
+        self.trace_writer.write_irq_handler_exit(1038, 0, 41, 1)
+        self.trace_writer.write_softirq_entry(1039, 0, 4)
+        self.trace_writer.write_softirq_exit(1040, 0, 4)
+        self.trace_writer.write_irq_handler_entry(1041, 0, 41, 'ahci')
+        self.trace_writer.write_softirq_raise(1042, 0, 4)
+        self.trace_writer.write_irq_handler_exit(1043, 0, 41, 1)
+        self.trace_writer.write_softirq_entry(1044, 0, 4)
+        self.trace_writer.write_softirq_exit(1045, 0, 4)
+        self.trace_writer.flush()
+
+    def test_irqstats(self):
+        test_name = 'irqstats'
+        expected = self.get_expected_output(test_name)
+        result = self.get_cmd_output('lttng-irqstats')
+
+        self._assertMultiLineEqual(result, expected, test_name)
+
+    def test_irqlog(self):
+        test_name = 'irqlog'
+        expected = self.get_expected_output(test_name)
+        result = self.get_cmd_output('lttng-irqlog')
+
+        self._assertMultiLineEqual(result, expected, test_name)
diff --git a/tests/integration/trace_writer.py b/tests/integration/trace_writer.py
new file mode 100644 (file)
index 0000000..dc69051
--- /dev/null
@@ -0,0 +1,534 @@
+# The MIT License (MIT)
+#
+# Copyright (C) 2016 - Julien Desfossez <jdesfossez@efficios.com>
+#                      Antoine Busque <abusque@efficios.com>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+import sys
+import os
+import shutil
+import tempfile
+from babeltrace import CTFWriter, CTFStringEncoding
+
+
+class TraceWriter():
+    def __init__(self):
+        self._trace_root = tempfile.mkdtemp()
+        self.trace_path = os.path.join(self.trace_root, "kernel")
+        self.create_writer()
+        self.create_stream_class()
+        self.define_base_types()
+        self.define_events()
+        self.create_stream()
+
+    @property
+    def trace_root(self):
+        return self._trace_root
+
+    def rm_trace(self):
+        shutil.rmtree(self.trace_root)
+
+    def flush(self):
+        self.writer.flush_metadata()
+        self.stream.flush()
+
+    def create_writer(self):
+        self.clock = CTFWriter.Clock("A_clock")
+        self.clock.description = "Simple clock"
+        self.writer = CTFWriter.Writer(self.trace_path)
+        self.writer.add_clock(self.clock)
+        self.writer.add_environment_field("Python_version",
+                                          str(sys.version_info))
+        self.writer.add_environment_field("tracer_major", 2)
+        self.writer.add_environment_field("tracer_minor", 8)
+        self.writer.add_environment_field("tracer_patchlevel", 0)
+
+    def create_stream_class(self):
+        self.stream_class = CTFWriter.StreamClass("test_stream")
+        self.stream_class.clock = self.clock
+
+    def define_base_types(self):
+        self.char8_type = CTFWriter.IntegerFieldDeclaration(8)
+        self.char8_type.signed = True
+        self.char8_type.encoding = CTFStringEncoding.UTF8
+        self.char8_type.alignment = 8
+
+        self.int16_type = CTFWriter.IntegerFieldDeclaration(16)
+        self.int16_type.signed = True
+        self.int16_type.alignment = 8
+
+        self.uint16_type = CTFWriter.IntegerFieldDeclaration(16)
+        self.uint16_type.signed = False
+        self.uint16_type.alignment = 8
+
+        self.int32_type = CTFWriter.IntegerFieldDeclaration(32)
+        self.int32_type.signed = True
+        self.int32_type.alignment = 8
+
+        self.uint32_type = CTFWriter.IntegerFieldDeclaration(32)
+        self.uint32_type.signed = False
+        self.uint32_type.alignment = 8
+
+        self.int64_type = CTFWriter.IntegerFieldDeclaration(64)
+        self.int64_type.signed = True
+        self.int64_type.alignment = 8
+
+        self.uint64_type = CTFWriter.IntegerFieldDeclaration(64)
+        self.uint64_type.signed = False
+        self.uint64_type.alignment = 8
+
+        self.array16_type = CTFWriter.ArrayFieldDeclaration(self.char8_type,
+                                                            16)
+
+        self.string_type = CTFWriter.StringFieldDeclaration()
+
+    def add_event(self, event):
+        event.add_field(self.uint32_type, "_cpu_id")
+        self.stream_class.add_event_class(event)
+
+    def define_sched_switch(self):
+        self.sched_switch = CTFWriter.EventClass("sched_switch")
+        self.sched_switch.add_field(self.array16_type, "_prev_comm")
+        self.sched_switch.add_field(self.int32_type, "_prev_tid")
+        self.sched_switch.add_field(self.int32_type, "_prev_prio")
+        self.sched_switch.add_field(self.int64_type, "_prev_state")
+        self.sched_switch.add_field(self.array16_type, "_next_comm")
+        self.sched_switch.add_field(self.int32_type, "_next_tid")
+        self.sched_switch.add_field(self.int32_type, "_next_prio")
+        self.add_event(self.sched_switch)
+
+    def define_softirq_raise(self):
+        self.softirq_raise = CTFWriter.EventClass("softirq_raise")
+        self.softirq_raise.add_field(self.uint32_type, "_vec")
+        self.add_event(self.softirq_raise)
+
+    def define_softirq_entry(self):
+        self.softirq_entry = CTFWriter.EventClass("softirq_entry")
+        self.softirq_entry.add_field(self.uint32_type, "_vec")
+        self.add_event(self.softirq_entry)
+
+    def define_softirq_exit(self):
+        self.softirq_exit = CTFWriter.EventClass("softirq_exit")
+        self.softirq_exit.add_field(self.uint32_type, "_vec")
+        self.add_event(self.softirq_exit)
+
+    def define_irq_handler_entry(self):
+        self.irq_handler_entry = CTFWriter.EventClass("irq_handler_entry")
+        self.irq_handler_entry.add_field(self.int32_type, "_irq")
+        self.irq_handler_entry.add_field(self.string_type, "_name")
+        self.add_event(self.irq_handler_entry)
+
+    def define_irq_handler_exit(self):
+        self.irq_handler_exit = CTFWriter.EventClass("irq_handler_exit")
+        self.irq_handler_exit.add_field(self.int32_type, "_irq")
+        self.irq_handler_exit.add_field(self.int32_type, "_ret")
+        self.add_event(self.irq_handler_exit)
+
+    def define_syscall_entry_write(self):
+        self.syscall_entry_write = CTFWriter.EventClass("syscall_entry_write")
+        self.syscall_entry_write.add_field(self.uint32_type, "_fd")
+        self.syscall_entry_write.add_field(self.uint64_type, "_buf")
+        self.syscall_entry_write.add_field(self.uint64_type, "_count")
+        self.add_event(self.syscall_entry_write)
+
+    def define_syscall_exit_write(self):
+        self.syscall_exit_write = CTFWriter.EventClass("syscall_exit_write")
+        self.syscall_exit_write.add_field(self.int64_type, "_ret")
+        self.add_event(self.syscall_exit_write)
+
+    def define_syscall_entry_read(self):
+        self.syscall_entry_read = CTFWriter.EventClass("syscall_entry_read")
+        self.syscall_entry_read.add_field(self.uint32_type, "_fd")
+        self.syscall_entry_read.add_field(self.uint64_type, "_count")
+        self.add_event(self.syscall_entry_read)
+
+    def define_syscall_exit_read(self):
+        self.syscall_exit_read = CTFWriter.EventClass("syscall_exit_read")
+        self.syscall_exit_read.add_field(self.uint64_type, "_buf")
+        self.syscall_exit_read.add_field(self.int64_type, "_ret")
+        self.add_event(self.syscall_exit_read)
+
+    def define_syscall_entry_open(self):
+        self.syscall_entry_open = CTFWriter.EventClass("syscall_entry_open")
+        self.syscall_entry_open.add_field(self.string_type, "_filename")
+        self.syscall_entry_open.add_field(self.int32_type, "_flags")
+        self.syscall_entry_open.add_field(self.uint16_type, "_mode")
+        self.add_event(self.syscall_entry_open)
+
+    def define_syscall_exit_open(self):
+        self.syscall_exit_open = CTFWriter.EventClass("syscall_exit_open")
+        self.syscall_exit_open.add_field(self.int64_type, "_ret")
+        self.add_event(self.syscall_exit_open)
+
+    def define_lttng_statedump_process_state(self):
+        self.lttng_statedump_process_state = CTFWriter.EventClass(
+            "lttng_statedump_process_state")
+        self.lttng_statedump_process_state.add_field(self.int32_type, "_tid")
+        self.lttng_statedump_process_state.add_field(self.int32_type, "_vtid")
+        self.lttng_statedump_process_state.add_field(self.int32_type, "_pid")
+        self.lttng_statedump_process_state.add_field(self.int32_type, "_vpid")
+        self.lttng_statedump_process_state.add_field(self.int32_type, "_ppid")
+        self.lttng_statedump_process_state.add_field(self.int32_type, "_vppid")
+        self.lttng_statedump_process_state.add_field(self.array16_type,
+                                                     "_name")
+        self.lttng_statedump_process_state.add_field(self.int32_type, "_type")
+        self.lttng_statedump_process_state.add_field(self.int32_type, "_mode")
+        self.lttng_statedump_process_state.add_field(self.int32_type,
+                                                     "_submode")
+        self.lttng_statedump_process_state.add_field(self.int32_type,
+                                                     "_status")
+        self.lttng_statedump_process_state.add_field(self.int32_type,
+                                                     "_ns_level")
+        self.add_event(self.lttng_statedump_process_state)
+
+    def define_lttng_statedump_file_descriptor(self):
+        self.lttng_statedump_file_descriptor = CTFWriter.EventClass(
+            "lttng_statedump_file_descriptor")
+        self.lttng_statedump_file_descriptor.add_field(self.int32_type, "_pid")
+        self.lttng_statedump_file_descriptor.add_field(self.int32_type, "_fd")
+        self.lttng_statedump_file_descriptor.add_field(self.uint32_type,
+                                                       "_flags")
+        self.lttng_statedump_file_descriptor.add_field(self.uint32_type,
+                                                       "_fmode")
+        self.lttng_statedump_file_descriptor.add_field(self.string_type,
+                                                       "_filename")
+        self.add_event(self.lttng_statedump_file_descriptor)
+
+    def define_sched_wakeup(self):
+        self.sched_wakeup = CTFWriter.EventClass("sched_wakeup")
+        self.sched_wakeup.add_field(self.array16_type, "_comm")
+        self.sched_wakeup.add_field(self.int32_type, "_tid")
+        self.sched_wakeup.add_field(self.int32_type, "_prio")
+        self.sched_wakeup.add_field(self.int32_type, "_success")
+        self.sched_wakeup.add_field(self.int32_type, "_target_cpu")
+        self.add_event(self.sched_wakeup)
+
+    def define_sched_waking(self):
+        self.sched_waking = CTFWriter.EventClass("sched_waking")
+        self.sched_waking.add_field(self.array16_type, "_comm")
+        self.sched_waking.add_field(self.int32_type, "_tid")
+        self.sched_waking.add_field(self.int32_type, "_prio")
+        self.sched_waking.add_field(self.int32_type, "_target_cpu")
+        self.add_event(self.sched_waking)
+
+    def define_block_rq_complete(self):
+        self.block_rq_complete = CTFWriter.EventClass("block_rq_complete")
+        self.block_rq_complete.add_field(self.uint32_type, "_dev")
+        self.block_rq_complete.add_field(self.uint64_type, "_sector")
+        self.block_rq_complete.add_field(self.uint32_type, "_nr_sector")
+        self.block_rq_complete.add_field(self.int32_type, "_errors")
+        self.block_rq_complete.add_field(self.uint32_type, "_rwbs")
+        self.block_rq_complete.add_field(self.uint64_type, "__cmd_length")
+        self.block_rq_complete.add_field(self.array16_type, "_cmd")
+        self.add_event(self.block_rq_complete)
+
+    def define_block_rq_issue(self):
+        self.block_rq_issue = CTFWriter.EventClass("block_rq_issue")
+        self.block_rq_issue.add_field(self.uint32_type, "_dev")
+        self.block_rq_issue.add_field(self.uint64_type, "_sector")
+        self.block_rq_issue.add_field(self.uint32_type, "_nr_sector")
+        self.block_rq_issue.add_field(self.uint32_type, "_bytes")
+        self.block_rq_issue.add_field(self.int32_type, "_tid")
+        self.block_rq_issue.add_field(self.uint32_type, "_rwbs")
+        self.block_rq_issue.add_field(self.uint64_type, "__cmd_length")
+        self.block_rq_issue.add_field(self.array16_type, "_cmd")
+        self.block_rq_issue.add_field(self.array16_type, "_comm")
+        self.add_event(self.block_rq_issue)
+
+    def define_net_dev_xmit(self):
+        self.net_dev_xmit = CTFWriter.EventClass("net_dev_xmit")
+        self.net_dev_xmit.add_field(self.uint64_type, "_skbaddr")
+        self.net_dev_xmit.add_field(self.int32_type, "_rc")
+        self.net_dev_xmit.add_field(self.uint32_type, "_len")
+        self.net_dev_xmit.add_field(self.string_type, "_name")
+        self.add_event(self.net_dev_xmit)
+
+    def define_netif_receive_skb(self):
+        self.netif_receive_skb = CTFWriter.EventClass("netif_receive_skb")
+        self.netif_receive_skb.add_field(self.uint64_type, "_skbaddr")
+        self.netif_receive_skb.add_field(self.uint32_type, "_len")
+        self.netif_receive_skb.add_field(self.string_type, "_name")
+        self.add_event(self.netif_receive_skb)
+
+    def define_events(self):
+        self.define_sched_switch()
+        self.define_softirq_raise()
+        self.define_softirq_entry()
+        self.define_softirq_exit()
+        self.define_irq_handler_entry()
+        self.define_irq_handler_exit()
+        self.define_syscall_entry_write()
+        self.define_syscall_exit_write()
+        self.define_syscall_entry_read()
+        self.define_syscall_exit_read()
+        self.define_syscall_entry_open()
+        self.define_syscall_exit_open()
+        self.define_lttng_statedump_process_state()
+        self.define_lttng_statedump_file_descriptor()
+        self.define_sched_wakeup()
+        self.define_sched_waking()
+        self.define_block_rq_complete()
+        self.define_block_rq_issue()
+        self.define_net_dev_xmit()
+        self.define_netif_receive_skb()
+
+    def create_stream(self):
+        self.stream = self.writer.create_stream(self.stream_class)
+
+    def set_char_array(self, event, string):
+        if len(string) > 16:
+            string = string[0:16]
+        else:
+            string = "%s" % (string + "\0" * (16 - len(string)))
+
+        for i, char in enumerate(string):
+            event.field(i).value = ord(char)
+
+    def set_int(self, event, value):
+        event.value = value
+
+    def set_string(self, event, value):
+        event.value = value
+
+    def write_softirq_raise(self, time_ms, cpu_id, vec):
+        event = CTFWriter.Event(self.softirq_raise)
+        self.clock.time = time_ms * 1000000
+        self.set_int(event.payload("_cpu_id"), cpu_id)
+        self.set_int(event.payload("_vec"), vec)
+        self.stream.append_event(event)
+        self.stream.flush()
+
+    def write_softirq_entry(self, time_ms, cpu_id, vec):
+        event = CTFWriter.Event(self.softirq_entry)
+        self.clock.time = time_ms * 1000000
+        self.set_int(event.payload("_cpu_id"), cpu_id)
+        self.set_int(event.payload("_vec"), vec)
+        self.stream.append_event(event)
+        self.stream.flush()
+
+    def write_softirq_exit(self, time_ms, cpu_id, vec):
+        event = CTFWriter.Event(self.softirq_exit)
+        self.clock.time = time_ms * 1000000
+        self.set_int(event.payload("_cpu_id"), cpu_id)
+        self.set_int(event.payload("_vec"), vec)
+        self.stream.append_event(event)
+        self.stream.flush()
+
+    def write_irq_handler_entry(self, time_ms, cpu_id, irq, name):
+        event = CTFWriter.Event(self.irq_handler_entry)
+        self.clock.time = time_ms * 1000000
+        self.set_int(event.payload("_cpu_id"), cpu_id)
+        self.set_int(event.payload("_irq"), irq)
+        self.set_string(event.payload("_name"), name)
+        self.stream.append_event(event)
+        self.stream.flush()
+
+    def write_irq_handler_exit(self, time_ms, cpu_id, irq, ret):
+        event = CTFWriter.Event(self.irq_handler_exit)
+        self.clock.time = time_ms * 1000000
+        self.set_int(event.payload("_cpu_id"), cpu_id)
+        self.set_int(event.payload("_irq"), irq)
+        self.set_int(event.payload("_ret"), ret)
+        self.stream.append_event(event)
+        self.stream.flush()
+
+    def write_syscall_write(self, time_ms, cpu_id, delay, fd, buf, count, ret):
+        event_entry = CTFWriter.Event(self.syscall_entry_write)
+        self.clock.time = time_ms * 1000000
+        self.set_int(event_entry.payload("_cpu_id"), cpu_id)
+        self.set_int(event_entry.payload("_fd"), fd)
+        self.set_int(event_entry.payload("_buf"), buf)
+        self.set_int(event_entry.payload("_count"), count)
+        self.stream.append_event(event_entry)
+
+        event_exit = CTFWriter.Event(self.syscall_exit_write)
+        self.clock.time = (time_ms + delay) * 1000000
+        self.set_int(event_exit.payload("_cpu_id"), cpu_id)
+        self.set_int(event_exit.payload("_ret"), ret)
+        self.stream.append_event(event_exit)
+        self.stream.flush()
+
+    def write_syscall_read(self, time_ms, cpu_id, delay, fd, buf, count, ret):
+        event_entry = CTFWriter.Event(self.syscall_entry_read)
+        self.clock.time = time_ms * 1000000
+        self.set_int(event_entry.payload("_cpu_id"), cpu_id)
+        self.set_int(event_entry.payload("_fd"), fd)
+        self.set_int(event_entry.payload("_count"), count)
+        self.stream.append_event(event_entry)
+
+        event_exit = CTFWriter.Event(self.syscall_exit_read)
+        self.clock.time = (time_ms + delay) * 1000000
+        self.set_int(event_exit.payload("_cpu_id"), cpu_id)
+        self.set_int(event_exit.payload("_buf"), buf)
+        self.set_int(event_exit.payload("_ret"), ret)
+        self.stream.append_event(event_exit)
+        self.stream.flush()
+
+    def write_syscall_open(self, time_ms, cpu_id, delay, filename, flags,
+                           mode, ret):
+        event = CTFWriter.Event(self.syscall_entry_open)
+        self.clock.time = time_ms * 1000000
+        self.set_int(event.payload("_cpu_id"), cpu_id)
+        self.set_string(event.payload("_filename"), filename)
+        self.set_int(event.payload("_flags"), flags)
+        self.set_int(event.payload("_mode"), mode)
+        self.stream.append_event(event)
+        self.stream.flush()
+
+        event = CTFWriter.Event(self.syscall_exit_open)
+        self.clock.time = (time_ms + delay) * 1000000
+        self.set_int(event.payload("_cpu_id"), cpu_id)
+        self.set_int(event.payload("_ret"), ret)
+        self.stream.append_event(event)
+        self.stream.flush()
+
+    def write_lttng_statedump_file_descriptor(self, time_ms, cpu_id, pid, fd,
+                                              flags, fmode, filename):
+        event = CTFWriter.Event(self.lttng_statedump_file_descriptor)
+        self.clock.time = time_ms * 1000000
+        self.set_int(event.payload("_cpu_id"), cpu_id)
+        self.set_int(event.payload("_pid"), pid)
+        self.set_int(event.payload("_fd"), fd)
+        self.set_int(event.payload("_flags"), flags)
+        self.set_int(event.payload("_fmode"), fmode)
+        self.set_string(event.payload("_filename"), filename)
+        self.stream.append_event(event)
+        self.stream.flush()
+
+    def write_lttng_statedump_process_state(self, time_ms, cpu_id, tid, vtid,
+                                            pid, vpid, ppid, vppid, name, type,
+                                            mode, submode, status, ns_level):
+        event = CTFWriter.Event(self.lttng_statedump_process_state)
+        self.clock.time = time_ms * 1000000
+        self.set_int(event.payload("_cpu_id"), cpu_id)
+        self.set_int(event.payload("_tid"), tid)
+        self.set_int(event.payload("_vtid"), vtid)
+        self.set_int(event.payload("_pid"), pid)
+        self.set_int(event.payload("_vpid"), vpid)
+        self.set_int(event.payload("_ppid"), ppid)
+        self.set_int(event.payload("_vppid"), vppid)
+        self.set_char_array(event.payload("_name"), name)
+        self.set_int(event.payload("_type"), type)
+        self.set_int(event.payload("_mode"), mode)
+        self.set_int(event.payload("_submode"), submode)
+        self.set_int(event.payload("_status"), status)
+        self.set_int(event.payload("_ns_level"), ns_level)
+        self.stream.append_event(event)
+        self.stream.flush()
+
+    def write_sched_wakeup(self, time_ms, cpu_id, comm, tid, prio, target_cpu):
+        event = CTFWriter.Event(self.sched_wakeup)
+        self.clock.time = time_ms * 1000000
+        self.set_int(event.payload("_cpu_id"), cpu_id)
+        self.set_char_array(event.payload("_comm"), comm)
+        self.set_int(event.payload("_tid"), tid)
+        self.set_int(event.payload("_prio"), prio)
+        self.set_int(event.payload("_target_cpu"), target_cpu)
+        self.stream.append_event(event)
+        self.stream.flush()
+
+    def write_sched_waking(self, time_ms, cpu_id, comm, tid, prio, target_cpu):
+        event = CTFWriter.Event(self.sched_waking)
+        self.clock.time = time_ms * 1000000
+        self.set_int(event.payload("_cpu_id"), cpu_id)
+        self.set_char_array(event.payload("_comm"), comm)
+        self.set_int(event.payload("_tid"), tid)
+        self.set_int(event.payload("_prio"), prio)
+        self.set_int(event.payload("_target_cpu"), target_cpu)
+        self.stream.append_event(event)
+        self.stream.flush()
+
+    def write_block_rq_complete(self, time_ms, cpu_id, dev, sector, nr_sector,
+                                errors, rwbs, _cmd_length, cmd):
+        event = CTFWriter.Event(self.block_rq_complete)
+        self.clock.time = time_ms * 1000000
+        self.set_int(event.payload("_cpu_id"), cpu_id)
+        self.set_int(event.payload("_dev"), dev)
+        self.set_int(event.payload("_sector"), sector)
+        self.set_int(event.payload("_nr_sector"), nr_sector)
+        self.set_int(event.payload("_errors"), errors)
+        self.set_int(event.payload("_rwbs"), rwbs)
+        self.set_int(event.payload("__cmd_length"), _cmd_length)
+        self.set_char_array(event.payload("_cmd"), cmd)
+        self.stream.append_event(event)
+        self.stream.flush()
+
+    def write_block_rq_issue(self, time_ms, cpu_id, dev, sector, nr_sector,
+                             bytes, tid, rwbs, _cmd_length, cmd, comm):
+        event = CTFWriter.Event(self.block_rq_issue)
+        self.clock.time = time_ms * 1000000
+        self.set_int(event.payload("_cpu_id"), cpu_id)
+        self.set_int(event.payload("_dev"), dev)
+        self.set_int(event.payload("_sector"), sector)
+        self.set_int(event.payload("_nr_sector"), nr_sector)
+        self.set_int(event.payload("_bytes"), bytes)
+        self.set_int(event.payload("_tid"), tid)
+        self.set_int(event.payload("_rwbs"), rwbs)
+        self.set_int(event.payload("__cmd_length"), _cmd_length)
+        self.set_char_array(event.payload("_cmd"), cmd)
+        self.set_char_array(event.payload("_comm"), comm)
+        self.stream.append_event(event)
+        self.stream.flush()
+
+    def write_net_dev_xmit(self, time_ms, cpu_id, skbaddr, rc, len, name):
+        event = CTFWriter.Event(self.net_dev_xmit)
+        self.clock.time = time_ms * 1000000
+        self.set_int(event.payload("_cpu_id"), cpu_id)
+        self.set_int(event.payload("_skbaddr"), skbaddr)
+        self.set_int(event.payload("_rc"), rc)
+        self.set_int(event.payload("_len"), len)
+        self.set_string(event.payload("_name"), name)
+        self.stream.append_event(event)
+        self.stream.flush()
+
+    def write_netif_receive_skb(self, time_ms, cpu_id, skbaddr, len, name):
+        event = CTFWriter.Event(self.netif_receive_skb)
+        self.clock.time = time_ms * 1000000
+        self.set_int(event.payload("_cpu_id"), cpu_id)
+        self.set_int(event.payload("_skbaddr"), skbaddr)
+        self.set_int(event.payload("_len"), len)
+        self.set_string(event.payload("_name"), name)
+        self.stream.append_event(event)
+        self.stream.flush()
+
+    def write_sched_switch(self, time_ms, cpu_id, prev_comm, prev_tid,
+                           next_comm, next_tid, prev_prio=20, prev_state=1,
+                           next_prio=20):
+        event = CTFWriter.Event(self.sched_switch)
+        self.clock.time = time_ms * 1000000
+        self.set_char_array(event.payload("_prev_comm"), prev_comm)
+        self.set_int(event.payload("_prev_tid"), prev_tid)
+        self.set_int(event.payload("_prev_prio"), prev_prio)
+        self.set_int(event.payload("_prev_state"), prev_state)
+        self.set_char_array(event.payload("_next_comm"), next_comm)
+        self.set_int(event.payload("_next_tid"), next_tid)
+        self.set_int(event.payload("_next_prio"), next_prio)
+        self.set_int(event.payload("_cpu_id"), cpu_id)
+        self.stream.append_event(event)
+        self.stream.flush()
+
+    def sched_switch_50pc(self, start_time_ms, end_time_ms, cpu_id, period,
+                          comm1, tid1, comm2, tid2):
+        current = start_time_ms
+        while current < end_time_ms:
+            self.write_sched_switch(current, cpu_id, comm1, tid1, comm2, tid2)
+            current += period
+            self.write_sched_switch(current, cpu_id, comm2, tid2, comm1, tid1)
+            current += period
diff --git a/tests/test_cputop.py b/tests/test_cputop.py
deleted file mode 100644 (file)
index 93943bb..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-# The MIT License (MIT)
-#
-# Copyright (C) 2016 - Julien Desfossez <jdesfossez@efficios.com>
-#                      Antoine Busque <abusque@efficios.com>
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-
-from .analysis_test import AnalysisTest
-
-
-class CpuTest(AnalysisTest):
-    def write_trace(self):
-        # runs the whole time: 100%
-        self.trace_writer.write_sched_switch(1000, 5, 'swapper/5',
-                                             0, 'prog100pc-cpu5', 42)
-        # runs for 2s alternating with swapper out every 100ms
-        self.trace_writer.sched_switch_50pc(1100, 5000, 0, 100, 'swapper/0',
-                                            0, 'prog20pc-cpu0', 30664)
-        # runs for 2.5s alternating with swapper out every 100ms
-        self.trace_writer.sched_switch_50pc(5100, 10000, 1, 100, 'swapper/1',
-                                            0, 'prog25pc-cpu1', 30665)
-        # switch out prog100pc-cpu5
-        self.trace_writer.write_sched_switch(11000, 5, 'prog100pc-cpu5',
-                                             42, 'swapper/5', 0)
-        self.trace_writer.flush()
-
-    def test_cputop(self):
-        test_name = 'cputop'
-        expected = self.get_expected_output(test_name)
-        result = self.get_cmd_output('lttng-cputop')
-
-        self._assertMultiLineEqual(result, expected, test_name)
diff --git a/tests/test_io.py b/tests/test_io.py
deleted file mode 100644 (file)
index 0ab5755..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-# The MIT License (MIT)
-#
-# Copyright (C) 2016 - Julien Desfossez <jdesfossez@efficios.com>
-#                      Antoine Busque <abusque@efficios.com>
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-
-from .analysis_test import AnalysisTest
-
-
-class IoTest(AnalysisTest):
-    def write_trace(self):
-        # app (99) is known at statedump
-        self.trace_writer.write_lttng_statedump_process_state(
-            1000, 0, 99, 99, 99, 99, 98, 98, 'app', 0, 5, 0, 5, 0)
-        # app2 (100) unknown at statedump has testfile, FD 3 defined at
-        # statedump
-        self.trace_writer.write_lttng_statedump_file_descriptor(
-            1001, 0, 100, 3, 0, 0, 'testfile')
-        # app write 10 bytes to FD 4
-        self.trace_writer.write_sched_switch(1002, 0, 'swapper/0', 0, 'app',
-                                             99)
-        self.trace_writer.write_syscall_write(1004, 0, 1, 4, 0xabcd, 10, 10)
-        # app2 reads 100 bytes in FD 3
-        self.trace_writer.write_sched_switch(1006, 0, 'app', 99, 'app2', 100)
-        self.trace_writer.write_syscall_read(1008, 0, 1, 3, 0xcafe, 100, 100)
-        # app3 and its FD 3 are completely unknown at statedump, tries to read
-        # 100 bytes from FD 3 but only gets 42
-        self.trace_writer.write_sched_switch(1010, 0, 'app2', 100, 'app3', 101)
-        self.trace_writer.write_syscall_read(1012, 0, 1, 3, 0xcafe, 100, 42)
-        # block write
-        self.trace_writer.write_block_rq_issue(1015, 0, 264241152, 33, 10, 40,
-                                               99, 0, 0, '', 'app')
-        self.trace_writer.write_block_rq_complete(1016, 0, 264241152, 33, 10,
-                                                  0, 0, 0, '')
-        # block read
-        self.trace_writer.write_block_rq_issue(1017, 0, 8388608, 33, 20, 90,
-                                               101, 1, 0, '', 'app3')
-        self.trace_writer.write_block_rq_complete(1018, 0, 8388608, 33, 20, 0,
-                                                  1, 0, '')
-        # net xmit
-        self.trace_writer.write_net_dev_xmit(1020, 2, 0xff, 32, 100, 'wlan0')
-        # net receive
-        self.trace_writer.write_netif_receive_skb(1021, 1, 0xff, 100, 'wlan1')
-        self.trace_writer.write_netif_receive_skb(1022, 1, 0xff, 200, 'wlan0')
-        # syscall open
-        self.trace_writer.write_syscall_open(1023, 0, 1, 'test/open/file', 0,
-                                             0, 42)
-        self.trace_writer.flush()
-
-    def test_iousagetop(self):
-        test_name = 'iousagetop'
-        expected = self.get_expected_output(test_name)
-        result = self.get_cmd_output('lttng-iousagetop')
-
-        self._assertMultiLineEqual(result, expected, test_name)
-
-    def test_iolatencytop(self):
-        test_name = 'iolatencytop'
-        expected = self.get_expected_output(test_name)
-        result = self.get_cmd_output('lttng-iolatencytop')
-
-        self._assertMultiLineEqual(result, expected, test_name)
diff --git a/tests/test_irq.py b/tests/test_irq.py
deleted file mode 100644 (file)
index 6a0856c..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-# The MIT License (MIT)
-#
-# Copyright (C) 2016 - Julien Desfossez <jdesfossez@efficios.com>
-#                      Antoine Busque <abusque@efficios.com>
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-
-from .analysis_test import AnalysisTest
-
-
-class IrqTest(AnalysisTest):
-    def write_trace(self):
-        self.trace_writer.write_softirq_raise(1000, 1, 1)
-        self.trace_writer.write_softirq_raise(1001, 3, 1)
-        self.trace_writer.write_softirq_raise(1002, 1, 9)
-        self.trace_writer.write_softirq_exit(1003, 0, 4)
-        self.trace_writer.write_softirq_raise(1004, 3, 9)
-        self.trace_writer.write_softirq_raise(1005, 3, 7)
-        self.trace_writer.write_softirq_entry(1006, 3, 1)
-        self.trace_writer.write_softirq_entry(1007, 1, 1)
-        self.trace_writer.write_softirq_exit(1008, 1, 1)
-        self.trace_writer.write_softirq_exit(1009, 3, 1)
-        self.trace_writer.write_softirq_entry(1010, 1, 9)
-        self.trace_writer.write_softirq_entry(1011, 3, 7)
-        self.trace_writer.write_softirq_exit(1012, 1, 9)
-        self.trace_writer.write_softirq_exit(1013, 3, 7)
-        self.trace_writer.write_softirq_entry(1014, 3, 9)
-        self.trace_writer.write_softirq_exit(1015, 3, 9)
-        self.trace_writer.write_irq_handler_entry(1016, 0, 41, 'ahci')
-        self.trace_writer.write_softirq_raise(1017, 0, 4)
-        self.trace_writer.write_irq_handler_exit(1018, 0, 41, 1)
-        self.trace_writer.write_softirq_entry(1019, 0, 4)
-        self.trace_writer.write_softirq_exit(1020, 0, 4)
-        self.trace_writer.write_irq_handler_entry(1021, 0, 41, 'ahci')
-        self.trace_writer.write_softirq_raise(1022, 0, 4)
-        self.trace_writer.write_irq_handler_exit(1023, 0, 41, 1)
-        self.trace_writer.write_softirq_entry(1024, 0, 4)
-        self.trace_writer.write_softirq_exit(1025, 0, 4)
-        self.trace_writer.write_irq_handler_entry(1026, 0, 41, 'ahci')
-        self.trace_writer.write_softirq_raise(1027, 0, 4)
-        self.trace_writer.write_irq_handler_exit(1028, 0, 41, 1)
-        self.trace_writer.write_softirq_entry(1029, 0, 4)
-        self.trace_writer.write_softirq_exit(1030, 0, 4)
-        self.trace_writer.write_irq_handler_entry(1031, 0, 41, 'ahci')
-        self.trace_writer.write_softirq_raise(1032, 0, 4)
-        self.trace_writer.write_irq_handler_exit(1033, 0, 41, 1)
-        self.trace_writer.write_softirq_entry(1034, 0, 4)
-        self.trace_writer.write_softirq_exit(1035, 0, 4)
-        self.trace_writer.write_irq_handler_entry(1036, 0, 41, 'ahci')
-        self.trace_writer.write_softirq_raise(1037, 0, 4)
-        self.trace_writer.write_irq_handler_exit(1038, 0, 41, 1)
-        self.trace_writer.write_softirq_entry(1039, 0, 4)
-        self.trace_writer.write_softirq_exit(1040, 0, 4)
-        self.trace_writer.write_irq_handler_entry(1041, 0, 41, 'ahci')
-        self.trace_writer.write_softirq_raise(1042, 0, 4)
-        self.trace_writer.write_irq_handler_exit(1043, 0, 41, 1)
-        self.trace_writer.write_softirq_entry(1044, 0, 4)
-        self.trace_writer.write_softirq_exit(1045, 0, 4)
-        self.trace_writer.flush()
-
-    def test_irqstats(self):
-        test_name = 'irqstats'
-        expected = self.get_expected_output(test_name)
-        result = self.get_cmd_output('lttng-irqstats')
-
-        self._assertMultiLineEqual(result, expected, test_name)
-
-    def test_irqlog(self):
-        test_name = 'irqlog'
-        expected = self.get_expected_output(test_name)
-        result = self.get_cmd_output('lttng-irqlog')
-
-        self._assertMultiLineEqual(result, expected, test_name)
diff --git a/tests/trace_writer.py b/tests/trace_writer.py
deleted file mode 100644 (file)
index dc69051..0000000
+++ /dev/null
@@ -1,534 +0,0 @@
-# The MIT License (MIT)
-#
-# Copyright (C) 2016 - Julien Desfossez <jdesfossez@efficios.com>
-#                      Antoine Busque <abusque@efficios.com>
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-
-import sys
-import os
-import shutil
-import tempfile
-from babeltrace import CTFWriter, CTFStringEncoding
-
-
-class TraceWriter():
-    def __init__(self):
-        self._trace_root = tempfile.mkdtemp()
-        self.trace_path = os.path.join(self.trace_root, "kernel")
-        self.create_writer()
-        self.create_stream_class()
-        self.define_base_types()
-        self.define_events()
-        self.create_stream()
-
-    @property
-    def trace_root(self):
-        return self._trace_root
-
-    def rm_trace(self):
-        shutil.rmtree(self.trace_root)
-
-    def flush(self):
-        self.writer.flush_metadata()
-        self.stream.flush()
-
-    def create_writer(self):
-        self.clock = CTFWriter.Clock("A_clock")
-        self.clock.description = "Simple clock"
-        self.writer = CTFWriter.Writer(self.trace_path)
-        self.writer.add_clock(self.clock)
-        self.writer.add_environment_field("Python_version",
-                                          str(sys.version_info))
-        self.writer.add_environment_field("tracer_major", 2)
-        self.writer.add_environment_field("tracer_minor", 8)
-        self.writer.add_environment_field("tracer_patchlevel", 0)
-
-    def create_stream_class(self):
-        self.stream_class = CTFWriter.StreamClass("test_stream")
-        self.stream_class.clock = self.clock
-
-    def define_base_types(self):
-        self.char8_type = CTFWriter.IntegerFieldDeclaration(8)
-        self.char8_type.signed = True
-        self.char8_type.encoding = CTFStringEncoding.UTF8
-        self.char8_type.alignment = 8
-
-        self.int16_type = CTFWriter.IntegerFieldDeclaration(16)
-        self.int16_type.signed = True
-        self.int16_type.alignment = 8
-
-        self.uint16_type = CTFWriter.IntegerFieldDeclaration(16)
-        self.uint16_type.signed = False
-        self.uint16_type.alignment = 8
-
-        self.int32_type = CTFWriter.IntegerFieldDeclaration(32)
-        self.int32_type.signed = True
-        self.int32_type.alignment = 8
-
-        self.uint32_type = CTFWriter.IntegerFieldDeclaration(32)
-        self.uint32_type.signed = False
-        self.uint32_type.alignment = 8
-
-        self.int64_type = CTFWriter.IntegerFieldDeclaration(64)
-        self.int64_type.signed = True
-        self.int64_type.alignment = 8
-
-        self.uint64_type = CTFWriter.IntegerFieldDeclaration(64)
-        self.uint64_type.signed = False
-        self.uint64_type.alignment = 8
-
-        self.array16_type = CTFWriter.ArrayFieldDeclaration(self.char8_type,
-                                                            16)
-
-        self.string_type = CTFWriter.StringFieldDeclaration()
-
-    def add_event(self, event):
-        event.add_field(self.uint32_type, "_cpu_id")
-        self.stream_class.add_event_class(event)
-
-    def define_sched_switch(self):
-        self.sched_switch = CTFWriter.EventClass("sched_switch")
-        self.sched_switch.add_field(self.array16_type, "_prev_comm")
-        self.sched_switch.add_field(self.int32_type, "_prev_tid")
-        self.sched_switch.add_field(self.int32_type, "_prev_prio")
-        self.sched_switch.add_field(self.int64_type, "_prev_state")
-        self.sched_switch.add_field(self.array16_type, "_next_comm")
-        self.sched_switch.add_field(self.int32_type, "_next_tid")
-        self.sched_switch.add_field(self.int32_type, "_next_prio")
-        self.add_event(self.sched_switch)
-
-    def define_softirq_raise(self):
-        self.softirq_raise = CTFWriter.EventClass("softirq_raise")
-        self.softirq_raise.add_field(self.uint32_type, "_vec")
-        self.add_event(self.softirq_raise)
-
-    def define_softirq_entry(self):
-        self.softirq_entry = CTFWriter.EventClass("softirq_entry")
-        self.softirq_entry.add_field(self.uint32_type, "_vec")
-        self.add_event(self.softirq_entry)
-
-    def define_softirq_exit(self):
-        self.softirq_exit = CTFWriter.EventClass("softirq_exit")
-        self.softirq_exit.add_field(self.uint32_type, "_vec")
-        self.add_event(self.softirq_exit)
-
-    def define_irq_handler_entry(self):
-        self.irq_handler_entry = CTFWriter.EventClass("irq_handler_entry")
-        self.irq_handler_entry.add_field(self.int32_type, "_irq")
-        self.irq_handler_entry.add_field(self.string_type, "_name")
-        self.add_event(self.irq_handler_entry)
-
-    def define_irq_handler_exit(self):
-        self.irq_handler_exit = CTFWriter.EventClass("irq_handler_exit")
-        self.irq_handler_exit.add_field(self.int32_type, "_irq")
-        self.irq_handler_exit.add_field(self.int32_type, "_ret")
-        self.add_event(self.irq_handler_exit)
-
-    def define_syscall_entry_write(self):
-        self.syscall_entry_write = CTFWriter.EventClass("syscall_entry_write")
-        self.syscall_entry_write.add_field(self.uint32_type, "_fd")
-        self.syscall_entry_write.add_field(self.uint64_type, "_buf")
-        self.syscall_entry_write.add_field(self.uint64_type, "_count")
-        self.add_event(self.syscall_entry_write)
-
-    def define_syscall_exit_write(self):
-        self.syscall_exit_write = CTFWriter.EventClass("syscall_exit_write")
-        self.syscall_exit_write.add_field(self.int64_type, "_ret")
-        self.add_event(self.syscall_exit_write)
-
-    def define_syscall_entry_read(self):
-        self.syscall_entry_read = CTFWriter.EventClass("syscall_entry_read")
-        self.syscall_entry_read.add_field(self.uint32_type, "_fd")
-        self.syscall_entry_read.add_field(self.uint64_type, "_count")
-        self.add_event(self.syscall_entry_read)
-
-    def define_syscall_exit_read(self):
-        self.syscall_exit_read = CTFWriter.EventClass("syscall_exit_read")
-        self.syscall_exit_read.add_field(self.uint64_type, "_buf")
-        self.syscall_exit_read.add_field(self.int64_type, "_ret")
-        self.add_event(self.syscall_exit_read)
-
-    def define_syscall_entry_open(self):
-        self.syscall_entry_open = CTFWriter.EventClass("syscall_entry_open")
-        self.syscall_entry_open.add_field(self.string_type, "_filename")
-        self.syscall_entry_open.add_field(self.int32_type, "_flags")
-        self.syscall_entry_open.add_field(self.uint16_type, "_mode")
-        self.add_event(self.syscall_entry_open)
-
-    def define_syscall_exit_open(self):
-        self.syscall_exit_open = CTFWriter.EventClass("syscall_exit_open")
-        self.syscall_exit_open.add_field(self.int64_type, "_ret")
-        self.add_event(self.syscall_exit_open)
-
-    def define_lttng_statedump_process_state(self):
-        self.lttng_statedump_process_state = CTFWriter.EventClass(
-            "lttng_statedump_process_state")
-        self.lttng_statedump_process_state.add_field(self.int32_type, "_tid")
-        self.lttng_statedump_process_state.add_field(self.int32_type, "_vtid")
-        self.lttng_statedump_process_state.add_field(self.int32_type, "_pid")
-        self.lttng_statedump_process_state.add_field(self.int32_type, "_vpid")
-        self.lttng_statedump_process_state.add_field(self.int32_type, "_ppid")
-        self.lttng_statedump_process_state.add_field(self.int32_type, "_vppid")
-        self.lttng_statedump_process_state.add_field(self.array16_type,
-                                                     "_name")
-        self.lttng_statedump_process_state.add_field(self.int32_type, "_type")
-        self.lttng_statedump_process_state.add_field(self.int32_type, "_mode")
-        self.lttng_statedump_process_state.add_field(self.int32_type,
-                                                     "_submode")
-        self.lttng_statedump_process_state.add_field(self.int32_type,
-                                                     "_status")
-        self.lttng_statedump_process_state.add_field(self.int32_type,
-                                                     "_ns_level")
-        self.add_event(self.lttng_statedump_process_state)
-
-    def define_lttng_statedump_file_descriptor(self):
-        self.lttng_statedump_file_descriptor = CTFWriter.EventClass(
-            "lttng_statedump_file_descriptor")
-        self.lttng_statedump_file_descriptor.add_field(self.int32_type, "_pid")
-        self.lttng_statedump_file_descriptor.add_field(self.int32_type, "_fd")
-        self.lttng_statedump_file_descriptor.add_field(self.uint32_type,
-                                                       "_flags")
-        self.lttng_statedump_file_descriptor.add_field(self.uint32_type,
-                                                       "_fmode")
-        self.lttng_statedump_file_descriptor.add_field(self.string_type,
-                                                       "_filename")
-        self.add_event(self.lttng_statedump_file_descriptor)
-
-    def define_sched_wakeup(self):
-        self.sched_wakeup = CTFWriter.EventClass("sched_wakeup")
-        self.sched_wakeup.add_field(self.array16_type, "_comm")
-        self.sched_wakeup.add_field(self.int32_type, "_tid")
-        self.sched_wakeup.add_field(self.int32_type, "_prio")
-        self.sched_wakeup.add_field(self.int32_type, "_success")
-        self.sched_wakeup.add_field(self.int32_type, "_target_cpu")
-        self.add_event(self.sched_wakeup)
-
-    def define_sched_waking(self):
-        self.sched_waking = CTFWriter.EventClass("sched_waking")
-        self.sched_waking.add_field(self.array16_type, "_comm")
-        self.sched_waking.add_field(self.int32_type, "_tid")
-        self.sched_waking.add_field(self.int32_type, "_prio")
-        self.sched_waking.add_field(self.int32_type, "_target_cpu")
-        self.add_event(self.sched_waking)
-
-    def define_block_rq_complete(self):
-        self.block_rq_complete = CTFWriter.EventClass("block_rq_complete")
-        self.block_rq_complete.add_field(self.uint32_type, "_dev")
-        self.block_rq_complete.add_field(self.uint64_type, "_sector")
-        self.block_rq_complete.add_field(self.uint32_type, "_nr_sector")
-        self.block_rq_complete.add_field(self.int32_type, "_errors")
-        self.block_rq_complete.add_field(self.uint32_type, "_rwbs")
-        self.block_rq_complete.add_field(self.uint64_type, "__cmd_length")
-        self.block_rq_complete.add_field(self.array16_type, "_cmd")
-        self.add_event(self.block_rq_complete)
-
-    def define_block_rq_issue(self):
-        self.block_rq_issue = CTFWriter.EventClass("block_rq_issue")
-        self.block_rq_issue.add_field(self.uint32_type, "_dev")
-        self.block_rq_issue.add_field(self.uint64_type, "_sector")
-        self.block_rq_issue.add_field(self.uint32_type, "_nr_sector")
-        self.block_rq_issue.add_field(self.uint32_type, "_bytes")
-        self.block_rq_issue.add_field(self.int32_type, "_tid")
-        self.block_rq_issue.add_field(self.uint32_type, "_rwbs")
-        self.block_rq_issue.add_field(self.uint64_type, "__cmd_length")
-        self.block_rq_issue.add_field(self.array16_type, "_cmd")
-        self.block_rq_issue.add_field(self.array16_type, "_comm")
-        self.add_event(self.block_rq_issue)
-
-    def define_net_dev_xmit(self):
-        self.net_dev_xmit = CTFWriter.EventClass("net_dev_xmit")
-        self.net_dev_xmit.add_field(self.uint64_type, "_skbaddr")
-        self.net_dev_xmit.add_field(self.int32_type, "_rc")
-        self.net_dev_xmit.add_field(self.uint32_type, "_len")
-        self.net_dev_xmit.add_field(self.string_type, "_name")
-        self.add_event(self.net_dev_xmit)
-
-    def define_netif_receive_skb(self):
-        self.netif_receive_skb = CTFWriter.EventClass("netif_receive_skb")
-        self.netif_receive_skb.add_field(self.uint64_type, "_skbaddr")
-        self.netif_receive_skb.add_field(self.uint32_type, "_len")
-        self.netif_receive_skb.add_field(self.string_type, "_name")
-        self.add_event(self.netif_receive_skb)
-
-    def define_events(self):
-        self.define_sched_switch()
-        self.define_softirq_raise()
-        self.define_softirq_entry()
-        self.define_softirq_exit()
-        self.define_irq_handler_entry()
-        self.define_irq_handler_exit()
-        self.define_syscall_entry_write()
-        self.define_syscall_exit_write()
-        self.define_syscall_entry_read()
-        self.define_syscall_exit_read()
-        self.define_syscall_entry_open()
-        self.define_syscall_exit_open()
-        self.define_lttng_statedump_process_state()
-        self.define_lttng_statedump_file_descriptor()
-        self.define_sched_wakeup()
-        self.define_sched_waking()
-        self.define_block_rq_complete()
-        self.define_block_rq_issue()
-        self.define_net_dev_xmit()
-        self.define_netif_receive_skb()
-
-    def create_stream(self):
-        self.stream = self.writer.create_stream(self.stream_class)
-
-    def set_char_array(self, event, string):
-        if len(string) > 16:
-            string = string[0:16]
-        else:
-            string = "%s" % (string + "\0" * (16 - len(string)))
-
-        for i, char in enumerate(string):
-            event.field(i).value = ord(char)
-
-    def set_int(self, event, value):
-        event.value = value
-
-    def set_string(self, event, value):
-        event.value = value
-
-    def write_softirq_raise(self, time_ms, cpu_id, vec):
-        event = CTFWriter.Event(self.softirq_raise)
-        self.clock.time = time_ms * 1000000
-        self.set_int(event.payload("_cpu_id"), cpu_id)
-        self.set_int(event.payload("_vec"), vec)
-        self.stream.append_event(event)
-        self.stream.flush()
-
-    def write_softirq_entry(self, time_ms, cpu_id, vec):
-        event = CTFWriter.Event(self.softirq_entry)
-        self.clock.time = time_ms * 1000000
-        self.set_int(event.payload("_cpu_id"), cpu_id)
-        self.set_int(event.payload("_vec"), vec)
-        self.stream.append_event(event)
-        self.stream.flush()
-
-    def write_softirq_exit(self, time_ms, cpu_id, vec):
-        event = CTFWriter.Event(self.softirq_exit)
-        self.clock.time = time_ms * 1000000
-        self.set_int(event.payload("_cpu_id"), cpu_id)
-        self.set_int(event.payload("_vec"), vec)
-        self.stream.append_event(event)
-        self.stream.flush()
-
-    def write_irq_handler_entry(self, time_ms, cpu_id, irq, name):
-        event = CTFWriter.Event(self.irq_handler_entry)
-        self.clock.time = time_ms * 1000000
-        self.set_int(event.payload("_cpu_id"), cpu_id)
-        self.set_int(event.payload("_irq"), irq)
-        self.set_string(event.payload("_name"), name)
-        self.stream.append_event(event)
-        self.stream.flush()
-
-    def write_irq_handler_exit(self, time_ms, cpu_id, irq, ret):
-        event = CTFWriter.Event(self.irq_handler_exit)
-        self.clock.time = time_ms * 1000000
-        self.set_int(event.payload("_cpu_id"), cpu_id)
-        self.set_int(event.payload("_irq"), irq)
-        self.set_int(event.payload("_ret"), ret)
-        self.stream.append_event(event)
-        self.stream.flush()
-
-    def write_syscall_write(self, time_ms, cpu_id, delay, fd, buf, count, ret):
-        event_entry = CTFWriter.Event(self.syscall_entry_write)
-        self.clock.time = time_ms * 1000000
-        self.set_int(event_entry.payload("_cpu_id"), cpu_id)
-        self.set_int(event_entry.payload("_fd"), fd)
-        self.set_int(event_entry.payload("_buf"), buf)
-        self.set_int(event_entry.payload("_count"), count)
-        self.stream.append_event(event_entry)
-
-        event_exit = CTFWriter.Event(self.syscall_exit_write)
-        self.clock.time = (time_ms + delay) * 1000000
-        self.set_int(event_exit.payload("_cpu_id"), cpu_id)
-        self.set_int(event_exit.payload("_ret"), ret)
-        self.stream.append_event(event_exit)
-        self.stream.flush()
-
-    def write_syscall_read(self, time_ms, cpu_id, delay, fd, buf, count, ret):
-        event_entry = CTFWriter.Event(self.syscall_entry_read)
-        self.clock.time = time_ms * 1000000
-        self.set_int(event_entry.payload("_cpu_id"), cpu_id)
-        self.set_int(event_entry.payload("_fd"), fd)
-        self.set_int(event_entry.payload("_count"), count)
-        self.stream.append_event(event_entry)
-
-        event_exit = CTFWriter.Event(self.syscall_exit_read)
-        self.clock.time = (time_ms + delay) * 1000000
-        self.set_int(event_exit.payload("_cpu_id"), cpu_id)
-        self.set_int(event_exit.payload("_buf"), buf)
-        self.set_int(event_exit.payload("_ret"), ret)
-        self.stream.append_event(event_exit)
-        self.stream.flush()
-
-    def write_syscall_open(self, time_ms, cpu_id, delay, filename, flags,
-                           mode, ret):
-        event = CTFWriter.Event(self.syscall_entry_open)
-        self.clock.time = time_ms * 1000000
-        self.set_int(event.payload("_cpu_id"), cpu_id)
-        self.set_string(event.payload("_filename"), filename)
-        self.set_int(event.payload("_flags"), flags)
-        self.set_int(event.payload("_mode"), mode)
-        self.stream.append_event(event)
-        self.stream.flush()
-
-        event = CTFWriter.Event(self.syscall_exit_open)
-        self.clock.time = (time_ms + delay) * 1000000
-        self.set_int(event.payload("_cpu_id"), cpu_id)
-        self.set_int(event.payload("_ret"), ret)
-        self.stream.append_event(event)
-        self.stream.flush()
-
-    def write_lttng_statedump_file_descriptor(self, time_ms, cpu_id, pid, fd,
-                                              flags, fmode, filename):
-        event = CTFWriter.Event(self.lttng_statedump_file_descriptor)
-        self.clock.time = time_ms * 1000000
-        self.set_int(event.payload("_cpu_id"), cpu_id)
-        self.set_int(event.payload("_pid"), pid)
-        self.set_int(event.payload("_fd"), fd)
-        self.set_int(event.payload("_flags"), flags)
-        self.set_int(event.payload("_fmode"), fmode)
-        self.set_string(event.payload("_filename"), filename)
-        self.stream.append_event(event)
-        self.stream.flush()
-
-    def write_lttng_statedump_process_state(self, time_ms, cpu_id, tid, vtid,
-                                            pid, vpid, ppid, vppid, name, type,
-                                            mode, submode, status, ns_level):
-        event = CTFWriter.Event(self.lttng_statedump_process_state)
-        self.clock.time = time_ms * 1000000
-        self.set_int(event.payload("_cpu_id"), cpu_id)
-        self.set_int(event.payload("_tid"), tid)
-        self.set_int(event.payload("_vtid"), vtid)
-        self.set_int(event.payload("_pid"), pid)
-        self.set_int(event.payload("_vpid"), vpid)
-        self.set_int(event.payload("_ppid"), ppid)
-        self.set_int(event.payload("_vppid"), vppid)
-        self.set_char_array(event.payload("_name"), name)
-        self.set_int(event.payload("_type"), type)
-        self.set_int(event.payload("_mode"), mode)
-        self.set_int(event.payload("_submode"), submode)
-        self.set_int(event.payload("_status"), status)
-        self.set_int(event.payload("_ns_level"), ns_level)
-        self.stream.append_event(event)
-        self.stream.flush()
-
-    def write_sched_wakeup(self, time_ms, cpu_id, comm, tid, prio, target_cpu):
-        event = CTFWriter.Event(self.sched_wakeup)
-        self.clock.time = time_ms * 1000000
-        self.set_int(event.payload("_cpu_id"), cpu_id)
-        self.set_char_array(event.payload("_comm"), comm)
-        self.set_int(event.payload("_tid"), tid)
-        self.set_int(event.payload("_prio"), prio)
-        self.set_int(event.payload("_target_cpu"), target_cpu)
-        self.stream.append_event(event)
-        self.stream.flush()
-
-    def write_sched_waking(self, time_ms, cpu_id, comm, tid, prio, target_cpu):
-        event = CTFWriter.Event(self.sched_waking)
-        self.clock.time = time_ms * 1000000
-        self.set_int(event.payload("_cpu_id"), cpu_id)
-        self.set_char_array(event.payload("_comm"), comm)
-        self.set_int(event.payload("_tid"), tid)
-        self.set_int(event.payload("_prio"), prio)
-        self.set_int(event.payload("_target_cpu"), target_cpu)
-        self.stream.append_event(event)
-        self.stream.flush()
-
-    def write_block_rq_complete(self, time_ms, cpu_id, dev, sector, nr_sector,
-                                errors, rwbs, _cmd_length, cmd):
-        event = CTFWriter.Event(self.block_rq_complete)
-        self.clock.time = time_ms * 1000000
-        self.set_int(event.payload("_cpu_id"), cpu_id)
-        self.set_int(event.payload("_dev"), dev)
-        self.set_int(event.payload("_sector"), sector)
-        self.set_int(event.payload("_nr_sector"), nr_sector)
-        self.set_int(event.payload("_errors"), errors)
-        self.set_int(event.payload("_rwbs"), rwbs)
-        self.set_int(event.payload("__cmd_length"), _cmd_length)
-        self.set_char_array(event.payload("_cmd"), cmd)
-        self.stream.append_event(event)
-        self.stream.flush()
-
-    def write_block_rq_issue(self, time_ms, cpu_id, dev, sector, nr_sector,
-                             bytes, tid, rwbs, _cmd_length, cmd, comm):
-        event = CTFWriter.Event(self.block_rq_issue)
-        self.clock.time = time_ms * 1000000
-        self.set_int(event.payload("_cpu_id"), cpu_id)
-        self.set_int(event.payload("_dev"), dev)
-        self.set_int(event.payload("_sector"), sector)
-        self.set_int(event.payload("_nr_sector"), nr_sector)
-        self.set_int(event.payload("_bytes"), bytes)
-        self.set_int(event.payload("_tid"), tid)
-        self.set_int(event.payload("_rwbs"), rwbs)
-        self.set_int(event.payload("__cmd_length"), _cmd_length)
-        self.set_char_array(event.payload("_cmd"), cmd)
-        self.set_char_array(event.payload("_comm"), comm)
-        self.stream.append_event(event)
-        self.stream.flush()
-
-    def write_net_dev_xmit(self, time_ms, cpu_id, skbaddr, rc, len, name):
-        event = CTFWriter.Event(self.net_dev_xmit)
-        self.clock.time = time_ms * 1000000
-        self.set_int(event.payload("_cpu_id"), cpu_id)
-        self.set_int(event.payload("_skbaddr"), skbaddr)
-        self.set_int(event.payload("_rc"), rc)
-        self.set_int(event.payload("_len"), len)
-        self.set_string(event.payload("_name"), name)
-        self.stream.append_event(event)
-        self.stream.flush()
-
-    def write_netif_receive_skb(self, time_ms, cpu_id, skbaddr, len, name):
-        event = CTFWriter.Event(self.netif_receive_skb)
-        self.clock.time = time_ms * 1000000
-        self.set_int(event.payload("_cpu_id"), cpu_id)
-        self.set_int(event.payload("_skbaddr"), skbaddr)
-        self.set_int(event.payload("_len"), len)
-        self.set_string(event.payload("_name"), name)
-        self.stream.append_event(event)
-        self.stream.flush()
-
-    def write_sched_switch(self, time_ms, cpu_id, prev_comm, prev_tid,
-                           next_comm, next_tid, prev_prio=20, prev_state=1,
-                           next_prio=20):
-        event = CTFWriter.Event(self.sched_switch)
-        self.clock.time = time_ms * 1000000
-        self.set_char_array(event.payload("_prev_comm"), prev_comm)
-        self.set_int(event.payload("_prev_tid"), prev_tid)
-        self.set_int(event.payload("_prev_prio"), prev_prio)
-        self.set_int(event.payload("_prev_state"), prev_state)
-        self.set_char_array(event.payload("_next_comm"), next_comm)
-        self.set_int(event.payload("_next_tid"), next_tid)
-        self.set_int(event.payload("_next_prio"), next_prio)
-        self.set_int(event.payload("_cpu_id"), cpu_id)
-        self.stream.append_event(event)
-        self.stream.flush()
-
-    def sched_switch_50pc(self, start_time_ms, end_time_ms, cpu_id, period,
-                          comm1, tid1, comm2, tid2):
-        current = start_time_ms
-        while current < end_time_ms:
-            self.write_sched_switch(current, cpu_id, comm1, tid1, comm2, tid2)
-            current += period
-            self.write_sched_switch(current, cpu_id, comm2, tid2, comm1, tid1)
-            current += period
This page took 0.049844 seconds and 5 git commands to generate.