13909c1bfc04b7fe1d4c55168559240877a72e1a
[lttng-tools.git] / tests / regression / tools / crash / test_crash
1 #!/bin/bash
2 #
3 # Copyright (C) - 2015 Jonathan Rajotte <jonathan.rajotte-julien@efficios.com>
4 #
5 # This library is free software; you can redistribute it and/or modify it under
6 # the terms of the GNU Lesser General Public License as published by the Free
7 # Software Foundation; version 2.1 of the License.
8 #
9 # This library is distributed in the hope that it will be useful, but WITHOUT
10 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12 # details.
13 #
14 # You should have received a copy of the GNU Lesser General Public License
15 # along with this library; if not, write to the Free Software Foundation, Inc.,
16 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
18 TEST_DESC="LTTng-crash & shm testing"
19
20 CURDIR=$(dirname $0)/
21 TESTDIR=$CURDIR/../../../
22 CRASH_BIN="lttng-crash"
23
24 # Test app for ust event
25 TESTAPP_PATH="$TESTDIR/utils/testapp"
26 TESTAPP_NAME="gen-ust-events"
27 TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME"
28 NR_USEC_WAIT=0
29 NR_ITER=-1
30
31 # Temp file output
32 OUTPUT_DIR=$(mktemp -d)
33
34 NUM_TESTS=77
35
36 source $TESTDIR/utils/utils.sh
37
38 # Global declaration for simplification
39 LTTNG_CRASH=$TESTDIR/../src/bin/lttng-crash/$CRASH_BIN
40
41 # MUST set TESTDIR before calling those functions
42 plan_tests $NUM_TESTS
43
44 print_test_banner "$TEST_DESC"
45
46 function start_test_app()
47 {
48 local tmp_file=$(mktemp -u)
49
50 # Start application with a temporary file.
51 $TESTAPP_BIN $NR_ITER $NR_USEC_WAIT $tmp_file &
52 ret=$?
53 APPS_PID="${APPS_PID} ${!}"
54 ok $ret "Start application to trace"
55
56 # Wait for the application file to appear indicating that at least one
57 # tracepoint has been fired.
58 while [ ! -f "$tmp_file" ]; do
59 sleep 0.5
60 done
61 diag "Removing test app temporary file $tmp_file"
62 rm -rf $tmp_file
63 }
64
65 function stop_test_apps()
66 {
67 diag "Stopping $TESTAPP_NAME"
68 for p in ${APPS_PID}; do
69 diag "Stopping $p"
70 kill ${p} 2>/dev/null
71 wait ${p} 2>/dev/null
72 diag "Stopped $p"
73 done
74 APPS_PID=
75 }
76
77 function stop_test_app()
78 {
79 local pid="$1"
80 for p in ${pid}; do
81 diag "Stopping $p"
82 kill ${p} 2>/dev/null
83 wait ${p} 2>/dev/null
84 done
85 }
86
87 function verify_path_dont_exists()
88 {
89 local path=$1
90
91 while find $path -mindepth 1 -maxdepth 1 &>/dev/null ; do
92 sleep 2
93 done
94 return 0
95 }
96
97 function test_shm_path_per_pid()
98 {
99 diag "Shm: ust per-pid test"
100 local session_name=shm_path_per_pid
101 local channel_name=channel_per_pid
102 local shm_path=$(mktemp -d)
103
104 # Build up
105 start_lttng_sessiond
106 create_lttng_session_ok $session_name $OUTPUT_DIR "--shm-path $shm_path"
107 enable_ust_lttng_channel_ok $session_name $channel_name "--buffers-pid"
108
109 start_lttng_tracing_ok $session_name
110
111 diag "Shm: clean state"
112 file_count=$(find $shm_path -mindepth 1 -maxdepth 1 | wc -l)
113 test $file_count -eq "0"
114 ok $? "No file created on set-up"
115
116 # Look for per-pid folder structure
117 # Start first test app
118 diag "Shm: check folder creation and structure"
119
120 start_test_app
121 first_app_pid=$APPS_PID
122 shm_session_path=$(find $shm_path -mindepth 1 -maxdepth 1)
123
124 file_count=$(echo "$shm_session_path"| wc -l)
125 test $file_count -eq "1"
126 ok $? "Path $shm_session_path created on application creation"
127
128 first_pid_path=$(find $shm_session_path/ust/pid -mindepth 1 -maxdepth 1)
129 ok $? "Pid path exists: $first_pid_path"
130
131 file_count=$(find $shm_session_path/ust/pid -mindepth 1 -maxdepth 1 | wc -l)
132 test $file_count -eq "1"
133 ok $? "Expect 1 pid registration folder got $file_count"
134
135 # Check for buffer and metadata presence in ust/pid/appfolder
136 file_count=$(find $first_pid_path/ -mindepth 1 -maxdepth 1 | wc -l)
137 test $file_count -ne "0"
138 ok $? "Expect > 0 buffer and metadata files got $file_count"
139
140 # Start second application pid
141 diag "Shm: check basic creation of second ust application"
142
143 start_test_app
144 second_pid_path=$(find $shm_session_path/ust/pid -mindepth 1 -maxdepth 1)
145 ok $? "Pid path exist found $second_pid_path"
146
147 file_count=$(find $shm_session_path/ust/pid -mindepth 1 -maxdepth 1 | wc -l)
148 test $file_count -eq "2"
149 ok $? "Expect 2 pid registration folder got $file_count"
150
151 # Stop first test application and check for cleanup
152 stop_test_app "$first_app_pid"
153 verify_path_dont_exists "$first_pid_path"
154 ok $? "First pid cleanup"
155
156 # Stop all applications and check for full cleanup
157 stop_test_apps
158 verify_path_dont_exists "$shm_session_path"
159 ok $? "Full cleanup"
160
161 # Tear down
162 destroy_lttng_session_ok $session_name
163 stop_lttng_sessiond
164 rm -rf $shm_path
165 }
166
167 function test_shm_path_per_uid()
168 {
169 diag "Shm: ust per-uid test"
170 local session_name=shm_path_per_uid
171 local channel_name=channel_per_uid
172 local shm_path=$(mktemp -d)
173
174 # Build up
175 start_lttng_sessiond
176 create_lttng_session_ok $session_name $OUTPUT_DIR "--shm-path $shm_path"
177 enable_ust_lttng_channel_ok $session_name $channel_name "--buffers-uid"
178
179 start_lttng_tracing_ok $session_name
180
181 diag "Shm: test clean state"
182 file_count=$(find $shm_path -mindepth 1 -maxdepth 1 | wc -l)
183 test $file_count -eq "0"
184 ok $? "No files created on set-up"
185
186 # Look for per-pid folder structure
187 # Start first test app
188 diag "Shm: check folder creation and structure"
189
190 start_test_app
191 shm_session_path=$(find $shm_path -mindepth 1 -maxdepth 1)
192 file_count=$(echo "$shm_session_path"| wc -l)
193 test $file_count -eq "1"
194 ok $? "Path $shm_session_path created on application creation"
195
196 uid_path=$(find $shm_session_path/ust/uid -mindepth 1 -maxdepth 1)
197 ok $? "uid path exist found $uid_path"
198
199 file_count=$(find $shm_session_path/ust/uid -mindepth 1 -maxdepth 1 | wc -l)
200 test $file_count -eq "1"
201 ok $? "Expect 1 uid registration folder got $file_count"
202
203 # Stop all applications and check for uid presence
204 stop_test_apps
205 file_count=$(find $shm_session_path/ust/uid -mindepth 1 -maxdepth 1 | wc -l)
206 test $file_count -eq "1"
207 ok $? "Expect 1 uid registration folder got $file_count"
208
209 # Test full cleanup
210 destroy_lttng_session_ok $session_name
211 verify_path_dont_exists "$shm_session_path"
212 ok $? "Full cleanup"
213
214 stop_lttng_sessiond
215 rm -rf $shm_path
216 }
217
218 function test_lttng_crash()
219 {
220 diag "Lttng-crash: basic recuperation"
221 local session_name=crash_test
222 local channel_name=channel_crash
223 local shm_path=$(mktemp -d)
224 local shm_path_symlink=$(mktemp -d)
225 local event_name="tp:tptest"
226
227 # Create a session in snapshot mode to deactivate any use of consumerd
228 start_lttng_sessiond
229 create_lttng_session_ok $session_name $OUTPUT_DIR "--shm-path $shm_path --snapshot"
230 enable_ust_lttng_channel_ok $session_name $channel_name "--buffers-uid"
231 enable_ust_lttng_event_ok $session_name $event_name $channel_name
232 start_lttng_tracing_ok $session_name
233
234 # Generate 10 events
235 $TESTAPP_BIN 10 0
236 stop_lttng_tracing_ok
237
238 crash_recup_count=$($LTTNG_CRASH $shm_path | wc -l)
239 test $crash_recup_count -eq "10"
240 ok $? "Expect 10 recup event from buffers got $crash_recup_count"
241
242 # Test with symlink
243 cp -rs $shm_path/. $shm_path_symlink
244 crash_recup_count=$($LTTNG_CRASH $shm_path_symlink | wc -l)
245 test $crash_recup_count -eq "10"
246 ok $? "Expect 10 recup event from symlink buffers got $crash_recup_count"
247
248 # Tear down
249 destroy_lttng_session_ok $session_name
250 stop_lttng_sessiond
251 rm -rf $shm_path
252 rm -rf $shm_path_symlink
253 }
254
255 function test_lttng_crash_extraction()
256 {
257 diag "Lttng-crash: extraction to path"
258 local session_name=crash_test
259 local channel_name=channel_crash
260 local shm_path=$(mktemp -d)
261 local extraction_dir_path=$(mktemp -d)
262 local extraction_path=$extraction_dir_path/extract
263 local event_name="tp:tptest"
264
265 # Create a session in snapshot mode to deactivate any use of consumerd
266 start_lttng_sessiond
267 create_lttng_session_ok $session_name $OUTPUT_DIR "--shm-path $shm_path --snapshot"
268 enable_ust_lttng_channel_ok $session_name $channel_name "--buffers-uid"
269 enable_ust_lttng_event_ok $session_name $event_name $channel_name
270
271 start_lttng_tracing_ok $session_name
272 # Generate 10 events
273 $TESTAPP_BIN 10 0
274 stop_lttng_tracing_ok
275
276 $LTTNG_CRASH -x $extraction_path $shm_path
277 ok $? "Extraction of crashed buffers to path"
278
279 # Test extracted trace
280 trace_match_only $event_name 10 $extraction_path
281
282 # Tear down
283 destroy_lttng_session_ok $session_name
284 stop_lttng_sessiond
285 rm -rf $shm_path
286 rm -rf $extraction_dir_path
287 }
288
289 function test_shm_path_per_pid_sigint()
290 {
291 diag "Shm: ust per-pid test sigint"
292 local session_name=shm_path_per_pid
293 local channel_name=channel_per_pid
294 local shm_path=$(mktemp -d)
295 local num_files=0
296
297 # Build up
298 start_lttng_sessiond
299 create_lttng_session_ok $session_name $OUTPUT_DIR "--shm-path $shm_path"
300 enable_ust_lttng_channel_ok $session_name $channel_name "--buffers-pid"
301
302 start_lttng_tracing_ok $session_name
303
304 start_test_app
305 start_test_app
306 shm_session_path=$(find $shm_path -mindepth 1 -maxdepth 1)
307
308 # Stop sessiond with sigint
309 stop_lttng_sessiond SIGINT
310
311 # Looking for a full cleanup
312 verify_path_dont_exists "$shm_session_path"
313 ok $? "Full cleanup on sigint"
314
315 # Tear down
316 stop_test_apps
317 rm -rf $shm_path
318 }
319
320 function test_shm_path_per_uid_sigint()
321 {
322 diag "Shm: ust per-uid test sigint"
323 local session_name=shm_path_per_uid_sigint
324 local channel_name=channel_per_uid_sigint
325 local shm_path=$(mktemp -d)
326 local ret=0
327
328 # Build up
329 start_lttng_sessiond
330 create_lttng_session_ok $session_name $OUTPUT_DIR "--shm-path $shm_path"
331 enable_ust_lttng_channel_ok $session_name $channel_name "--buffers-uid"
332
333 start_lttng_tracing_ok $session_name
334
335 start_test_app
336 start_test_app
337 shm_session_path=$(find $shm_path -mindepth 1 -maxdepth 1)
338
339 # Test full cleanup on SIGINT
340 stop_lttng_sessiond SIGINT
341
342 # Looking for a full cleanup
343 verify_path_dont_exists "$shm_session_path"
344 ok $? "Full cleanup on sigint"
345
346 # Tear down
347 stop_test_apps
348 rm -rf $shm_path
349 }
350
351 function test_lttng_crash_extraction_sigkill()
352 {
353 diag "Lttng-crash: extraction with sigkill"
354 local session_name=crash_test
355 local channel_name=channel_crash
356 local shm_path=$(mktemp -d)
357 local extraction_dir_path=$(mktemp -d)
358 local extraction_path=$extraction_dir_path/extract
359 local event_name="tp:tptest"
360 local ret=0
361
362 start_lttng_sessiond
363 create_lttng_session_ok $session_name $OUTPUT_DIR "--shm-path $shm_path"
364 enable_ust_lttng_channel_ok $session_name $channel_name "--buffers-uid"
365 enable_ust_lttng_event_ok $session_name $event_name $channel_name
366 start_lttng_tracing_ok $session_name
367
368 # Generate 10 events
369 $TESTAPP_BIN 10 0
370
371 sigstop_lttng_sessiond
372 sigstop_lttng_consumerd
373
374 # Kill the consumers then sessiond with sigkill
375 stop_lttng_consumerd SIGKILL
376 stop_lttng_sessiond SIGKILL
377
378 $LTTNG_CRASH -x $extraction_path $shm_path
379 ret=$?
380 ok $ret "Extraction of crashed buffers to path $extraction_path"
381
382 # Test extracted trace
383 trace_match_only $event_name 10 $extraction_path
384
385 # Tear down
386 stop_test_apps
387 rm -rf $shm_path
388 rm -rf $extraction_dir_path
389 }
390
391 function interrupt_cleanup()
392 {
393 diag "*** Cleaning-up test ***"
394 stop_test_apps
395 stop_lttng_sessiond
396 exit 1
397 }
398
399 TESTS=(
400 test_shm_path_per_uid
401 test_shm_path_per_pid
402 test_shm_path_per_pid_sigint
403 test_shm_path_per_uid_sigint
404 test_lttng_crash
405 test_lttng_crash_extraction
406 test_lttng_crash_extraction_sigkill
407 )
408
409 trap interrupt_cleanup SIGTERM SIGINT
410
411 for fct_test in ${TESTS[@]};
412 do
413 ${fct_test}
414 if [ $? -ne 0 ]; then
415 break;
416 fi
417 done
418 rm -rf $OUTPUT_DIR
419
420 OUTPUT_DEST=/dev/null 2>&1
This page took 0.037307 seconds and 3 git commands to generate.