Refactor: test: wrapper for destroy_lttng_session
[lttng-tools.git] / tests / regression / ust / fork / test_fork.py
CommitLineData
37bd6c8e
JG
1#!/usr/bin/env python3
2#
3# Copyright (C) - 2013 Jérémie Galarneau <jeremie.galarneau@efficios.com>
4#
5# This program is free software; you can redistribute it and/or modify it
6# under the terms of the GNU General Public License, version 2 only, as
7# published by the Free Software Foundation.
8#
9# This program is distributed in the hope that it will be useful, but WITHOUT
10# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12# more details.
13#
14# You should have received a copy of the GNU General Public License along with
15# this program; if not, write to the Free Software Foundation, Inc., 51
16# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17
18import os
19import subprocess
20import re
21import shutil
22import sys
23
24test_path = os.path.dirname(os.path.abspath(__file__)) + "/"
25test_utils_path = test_path
26for i in range(4):
27 test_utils_path = os.path.dirname(test_utils_path)
28test_utils_path = test_utils_path + "/utils"
29sys.path.append(test_utils_path)
30from test_utils import *
31
32
33NR_TESTS = 6
34current_test = 1
35print("1..{0}".format(NR_TESTS))
36
37# Check if a sessiond is running... bail out if none found.
38if session_daemon_alive() == 0:
39 bail("No sessiond running. Please make sure you are running this test with the \"run\" shell script and verify that the lttng tools are properly installed.")
40
41session_info = create_session()
42enable_ust_tracepoint_event(session_info, "ust_tests_fork*")
43start_session(session_info)
44
45fork_process = subprocess.Popen([test_path + "fork", test_path + "fork2"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
46
47if sys.version_info >= (3, 3):
48 try:
49 fork_process.wait(5)
50 except TimeoutExpired:
51 fork_process.kill()
52 bail("Failed to run fork test application (time out)", session_info)
53else:
54 fork_process.wait()
55
56parent_pid = -1
57child_pid = -1
58for line in fork_process.stdout:
59 line = line.decode('utf-8').replace("\n", "")
60 match = re.search(r"child_pid (\d+)", line)
61 if match:
62 child_pid = match.group(1)
63 match = re.search(r"parent_pid (\d+)", line)
64 if match:
65 parent_pid = match.group(1)
66
67print_test_result(fork_process.returncode == 0, current_test, "Fork test application exited normally")
68current_test += 1
69
70stop_session(session_info)
71
72# Check both events (normal exit and suicide messages) are present in the resulting trace
73try:
74 babeltrace_process = subprocess.Popen(["babeltrace", session_info.trace_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
75except FileNotFoundError:
76 bail("Could not open babeltrace. Please make sure it is installed.", session_info)
77
78event_lines = []
79for event_line in babeltrace_process.stdout:
80 event_line = event_line.decode('utf-8').replace("\n", "")
81 if re.search(r"warning", event_line) is not None or re.search(r"error", event_line) is not None:
82 print( "# " + event_line )
83 else:
84 event_lines.append(event_line)
85
86babeltrace_process.wait()
87
88print_test_result(babeltrace_process.returncode == 0, current_test, "Resulting trace is readable")
89current_test += 1
90
91if babeltrace_process.returncode != 0:
92 bail("Unreadable trace; can't proceed with analysis.", session_info)
93
94event_before_fork = False
95event_after_fork_parent = False
96event_after_fork_child = False
97event_after_exec = False
98
99for event_line in event_lines:
100 match = re.search(r".*pid = (\d+)", event_line)
101 if match is not None:
102 event_pid = match.group(1)
103 else:
104 continue
105
106 if re.search(r"before_fork", event_line):
107 event_before_fork = (event_pid == parent_pid)
108 if re.search(r"after_fork_parent", event_line):
109 event_after_fork_parent = (event_pid == parent_pid)
110 if re.search(r"after_fork_child", event_line):
111 event_after_fork_child = (event_pid == child_pid)
112 if re.search(r"after_exec", event_line):
113 event_after_exec = (event_pid == child_pid)
114
115print_test_result(event_before_fork, current_test, "before_fork event logged by parent process found in trace")
116current_test += 1
117print_test_result(event_after_fork_parent, current_test, "after_fork_parent event logged by parent process found in trace")
118current_test += 1
119print_test_result(event_after_fork_child, current_test, "after_fork_child event logged by child process found in trace")
120current_test += 1
121print_test_result(event_after_exec, current_test, "after_exec event logged by child process found in trace")
122current_test += 1
123
124shutil.rmtree(session_info.tmp_directory)
This page took 0.029686 seconds and 4 git commands to generate.