[lttng-dev] [PATCH lttng-tools 1/7] Tests: Add Python test_utils module
David Goulet
dgoulet at efficios.com
Wed Mar 27 10:38:47 EDT 2013
Merged!
Thanks!
Jérémie Galarneau:
> Basic Python test framework based on the lttng-tools Python bindings
> that facilitates the creation of a tracing session saving its trace in
> a temporary location, the activation of events in the UST domain and
> clean teardown of the test session.
>
> Also provides basic TAP output facilities.
>
> Signed-off-by: Jérémie Galarneau <jeremie.galarneau at efficios.com>
> ---
> tests/utils/test_utils.py | 111 ++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 111 insertions(+)
> create mode 100644 tests/utils/test_utils.py
>
> diff --git a/tests/utils/test_utils.py b/tests/utils/test_utils.py
> new file mode 100644
> index 0000000..5e00de4
> --- /dev/null
> +++ b/tests/utils/test_utils.py
> @@ -0,0 +1,111 @@
> +#!/usr/bin/env python3
> +#
> +# Copyright (C) - 2013 Jérémie Galarneau <jeremie.galarneau at efficios.com>
> +#
> +# This program is free software; you can redistribute it and/or modify it
> +# under the terms of the GNU General Public License, version 2 only, as
> +# published by the Free Software Foundation.
> +#
> +# This program is distributed in the hope that it will be useful, but WITHOUT
> +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
> +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
> +# more details.
> +#
> +# You should have received a copy of the GNU General Public License along with
> +# this program; if not, write to the Free Software Foundation, Inc., 51
> +# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> +
> +import uuid
> +import os
> +import subprocess
> +import shutil
> +import sys
> +import tempfile
> +
> +# Import lttng bindings generated in the current tree
> +lttng_bindings_path = os.path.dirname(os.path.abspath(__file__)) + "/"
> +for i in range(3):
> + lttng_bindings_path = os.path.dirname(lttng_bindings_path)
> +lttng_bindings_path = lttng_bindings_path + "/extras/bindings/swig/python"
> +lttng_bindings_libs_path = lttng_bindings_path + "/.libs"
> +sys.path.append(lttng_bindings_path)
> +sys.path.append(lttng_bindings_libs_path)
> +from lttng import *
> +
> +
> +class SessionInfo:
> + def __init__(self, handle, session_name, tmp_directory, channel_name):
> + self.handle = handle
> + self.name = session_name
> + self.tmp_directory = tmp_directory
> + self.trace_path = tmp_directory + "/" + session_name
> + self.channel_name = channel_name
> +
> +def bail(diag, session_info = None):
> + print("Bail out!")
> + print("#", diag)
> +
> + if session_info is not None:
> + stop_session(session_info, True)
> +
> + if os.path.exists(session_info.trace_path):
> + shutil.rmtree(session_info.trace_path)
> + exit(-1)
> +
> +def print_test_result(result, number, description):
> + result_string = None
> + if result is True:
> + result_string = "ok"
> + else:
> + result_string = "not ok"
> +
> + result_string += " {0} - {1}".format(number, description)
> + print(result_string)
> +
> +def enable_ust_tracepoint_event(session_info, event_name):
> + event = Event()
> + event.name = event_name
> + event.type = EVENT_TRACEPOINT
> + event.loglevel = EVENT_LOGLEVEL_ALL
> + res = enable_event(session_info.handle, event, session_info.channel_name)
> + if res < 0:
> + bail("Failed to enable userspace event " + event_name, session_info)
> +
> +def create_session():
> + dom = Domain()
> + dom.type = DOMAIN_UST
> +
> + session_name = str(uuid.uuid1())
> + tmp_directory = tempfile.mkdtemp()
> + trace_path = tmp_directory + "/" + session_name
> +
> + res = create(session_name, trace_path)
> + if res < 0:
> + bail("Failed to create tracing session.")
> +
> + channel = Channel()
> + channel.name = "channel0"
> + channel_set_default_attr(dom, channel.attr)
> +
> + han = Handle(session_name, dom)
> + res = enable_channel(han, channel)
> +
> + session_info = SessionInfo(han, session_name, tmp_directory, channel.name)
> + if res < 0:
> + bail("Failed to enable channel " + channel.name, session_info)
> + return session_info
> +
> +def start_session(session_info):
> + start(session_info.name)
> +
> +def stop_session(session_info, bailing = False):
> + # Workaround lttng-ctl outputing directly to stdout by spawning a subprocess.
> + lttng_binary_path = os.path.dirname(os.path.abspath(__file__)) + "/"
> + for i in range(3):
> + lttng_binary_path = os.path.dirname(lttng_binary_path)
> + lttng_binary_path = lttng_binary_path + "/src/bin/lttng/lttng"
> +
> + retcode = subprocess.call([lttng_binary_path, "stop", session_info.name], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
> + if retcode != 0 and not bailing:
> + bail("Unable to stop session " + session_info.name, session_info)
> + destroy(session_info.name)
More information about the lttng-dev
mailing list