Cleanup: tests: name all temporary files to better identify leakage
[lttng-tools.git] / tests / regression / tools / tracker / test_event_tracker
CommitLineData
ba5e8d0a
MD
1#!/bin/bash
2#
9d16b343
MJ
3# Copyright (C) 2013 Christian Babeux <christian.babeux@efficios.com>
4# Copyright (C) 2015-2018 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
ba5e8d0a 5#
9d16b343 6# SPDX-License-Identifier: GPL-2.0-only
ba5e8d0a
MD
7
8TEST_DESC="LTTng - Event traker test"
9
10CURDIR=$(dirname "$0")/
11TESTDIR="$CURDIR/../../.."
12TESTAPP_PATH="$TESTDIR/utils/testapp"
13TESTAPP_NAME="gen-ust-events"
14TESTAPP_KERNEL_NAME="gen-kernel-test-events"
15TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME"
16TESTAPP_KERNEL_BIN="$TESTAPP_PATH/$TESTAPP_KERNEL_NAME/$TESTAPP_KERNEL_NAME"
17SESSION_NAME="tracker"
18NR_ITER=100
19NUM_GLOBAL_TESTS=2
adce7589 20NUM_UST_TESTS=283
ba5e8d0a
MD
21NUM_KERNEL_TESTS=462
22NUM_TESTS=$((NUM_UST_TESTS+NUM_KERNEL_TESTS+NUM_GLOBAL_TESTS))
23
24NR_USEC_WAIT=0 #for UST gen events
25
26SCRIPT_UID="$(id -u)"
27SCRIPT_GID="$(id -g)"
28SCRIPT_USERNAME="$(id -un)"
29SCRIPT_GROUPNAME="$(id -gn)"
30
31CHILD_PID=-1
32WAIT_PATH=
33AFTER_FIRST_PATH=
34BEFORE_LAST_PATH=
35
36source $TESTDIR/utils/utils.sh
37
38function prepare_ust_app
39{
33e55711
FD
40 AFTER_FIRST_PATH=$(mktemp --tmpdir -u tmp.${FUNCNAME[0]}_sync_after_first.XXXXXX)
41 BEFORE_LAST_PATH=$(mktemp --tmpdir -u tmp.${FUNCNAME[0]}_sync_before_last.XXXXXX)
ba5e8d0a
MD
42
43 $TESTAPP_BIN -i $NR_ITER -w $NR_USEC_WAIT -a "$AFTER_FIRST_PATH" -b "$BEFORE_LAST_PATH" &
44 CHILD_PID=$!
45}
46
47function trace_ust_app
48{
49 touch "$BEFORE_LAST_PATH"
50 wait
51 ok $? "Traced application stopped."
52 rm "$BEFORE_LAST_PATH"
53 rm "$AFTER_FIRST_PATH"
54}
55
56function prepare_kernel_app
57{
33e55711 58 WAIT_PATH=$(mktemp --tmpdir -u "tmp.${FUNCNAME[0]}_wait_path.XXXXXX")
ba5e8d0a
MD
59
60 "$TESTAPP_KERNEL_BIN" "$WAIT_PATH" $NR_ITER &
61 CHILD_PID=$!
62}
63
64function trace_kernel_app
65{
66 touch "$WAIT_PATH"
67 wait
68 ok $? "Traced application stopped."
69 rm "$WAIT_PATH"
70}
71
72function test_event_tracker()
73{
74 local trace_path
75 local domain="$1"
76 local expect_event="$2"
77 local wildcard="$3"
78 local tracker="$4"
79 local channel=''
80
33e55711 81 trace_path=$(mktemp --tmpdir -d tmp.${FUNCNAME[0]}_trace_path.XXXXXX)
ba5e8d0a
MD
82
83 create_lttng_session_ok $SESSION_NAME "$trace_path"
84
85 if [ "$domain" = kernel ]; then
86 channel=chan
87 lttng_enable_kernel_channel 1 0 $SESSION_NAME $channel "--subbuf-size=8M --num-subbuf=4"
88 fi
89
90 enable_"$domain"_lttng_event_ok $SESSION_NAME "$wildcard" "$channel"
91
92 start_lttng_tracing_ok
93
94 lttng_track_"$domain"_ok "${tracker}"
95
96 prepare_"$domain"_app
97
98 trace_"$domain"_app
99
100 stop_lttng_tracing_ok
101 destroy_lttng_session_ok $SESSION_NAME
102
103 if [ "$expect_event" -eq 1 ]; then
104 trace_matches "$EVENT_NAME" $NR_ITER "$trace_path"
105 else
106 validate_trace_session_"$domain"_empty "$trace_path"
107 fi
108
109 rm -rf "$trace_path"
110}
111
112function test_event_vpid_tracker()
113{
114 local trace_path
115 local domain="$1"
116 local expect_event="$2"
117 local wildcard="$3"
118 local channel=''
119
33e55711 120 trace_path=$(mktemp --tmpdir -d tmp.${FUNCNAME[0]}_trace_path.XXXXXX)
ba5e8d0a
MD
121
122 create_lttng_session_ok $SESSION_NAME "$trace_path"
123
124 if [ "$domain" = kernel ]; then
125 channel=chan
126 lttng_enable_kernel_channel 1 0 $SESSION_NAME $channel "--subbuf-size=8M --num-subbuf=4"
127 fi
128
129 enable_"$domain"_lttng_event_ok $SESSION_NAME "$wildcard" "$channel"
130
131 prepare_"$domain"_app
132
133 start_lttng_tracing_ok
134
135 if [ "$expect_event" -eq 1 ]; then
136 lttng_track_"$domain"_ok "--vpid ${CHILD_PID}"
137 else
138 lttng_track_"$domain"_ok "--vpid $((CHILD_PID+1))"
139 fi
140
141 trace_"$domain"_app
142
143 stop_lttng_tracing_ok
144 destroy_lttng_session_ok $SESSION_NAME
145
146 if [ "$expect_event" -eq 1 ]; then
147 validate_trace "$EVENT_NAME" "$trace_path"
148 else
149 validate_trace_empty "$trace_path"
150 fi
151
152 rm -rf "$trace_path"
153}
154
155function test_event_pid_tracker()
156{
157 local trace_path
158 local domain="$1"
159 local expect_event="$2"
160 local wildcard="$3"
161 local channel=''
162
33e55711 163 trace_path=$(mktemp --tmpdir -d tmp.${FUNCNAME[0]}_trace_path.XXXXXX)
ba5e8d0a
MD
164
165 create_lttng_session_ok $SESSION_NAME "$trace_path"
166
167 if [ "$domain" = kernel ]; then
168 channel=chan
169 lttng_enable_kernel_channel 1 0 $SESSION_NAME $channel "--subbuf-size=8M --num-subbuf=4"
170 fi
171
172 enable_"$domain"_lttng_event_ok $SESSION_NAME "$wildcard" "$channel"
173
174 prepare_"$domain"_app
175
176 start_lttng_tracing_ok
177
178 if [ "$expect_event" -eq 1 ]; then
179 lttng_track_"$domain"_ok "--pid ${CHILD_PID}"
180 else
181 lttng_track_"$domain"_ok "--pid $((CHILD_PID+1))"
182 fi
183
184 trace_"$domain"_app
185
186 stop_lttng_tracing_ok
187 destroy_lttng_session_ok $SESSION_NAME
188
189 if [ "$expect_event" -eq 1 ]; then
190 validate_trace "$EVENT_NAME" "$trace_path"
191 else
192 validate_trace_empty "$trace_path"
193 fi
194
195 rm -rf "$trace_path"
196}
197
198
199function test_event_tracker_fail()
200{
201 local trace_path
202 local domain="$1"
203 local wildcard="$2"
204 local tracker="$3"
205
33e55711 206 trace_path=$(mktemp --tmpdir -d tmp.${FUNCNAME[0]}_trace_path.XXXXXX)
ba5e8d0a
MD
207
208 create_lttng_session_ok $SESSION_NAME "$trace_path"
209 enable_"$domain"_lttng_event_ok $SESSION_NAME "$wildcard"
210 lttng_track_"$domain"_fail "${tracker}"
211 destroy_lttng_session_ok $SESSION_NAME
212
213 rm -rf "$trace_path"
214}
215
216function test_event_track_untrack()
217{
218 local trace_path
219 local domain="$1"
220 local expect_event="$2"
221 local wildcard="$3"
222 local tracker="$4"
223 local channel=''
224
33e55711 225 trace_path=$(mktemp --tmpdir -d tmp.${FUNCNAME[0]}_trace_path.XXXXXX)
ba5e8d0a
MD
226
227 create_lttng_session_ok $SESSION_NAME "$trace_path"
228
229 if [ "$domain" = kernel ]; then
230 channel=chan
231 lttng_enable_kernel_channel 1 0 $SESSION_NAME $channel "--subbuf-size=8M --num-subbuf=4"
232 fi
233
234 enable_"$domain"_lttng_event_ok $SESSION_NAME "$wildcard" "$channel"
235
236 start_lttng_tracing_ok
237
238 lttng_track_"$domain"_ok "${tracker}"
239 lttng_untrack_"$domain"_ok "${tracker}"
240
241 prepare_"$domain"_app
242
243 trace_"$domain"_app
244
245 stop_lttng_tracing_ok
246 destroy_lttng_session_ok $SESSION_NAME
247
248 if [ "$expect_event" -eq 1 ]; then
249 trace_matches "$EVENT_NAME" $NR_ITER "$trace_path"
250 else
251 validate_trace_session_"$domain"_empty "$trace_path"
252 fi
253
254 rm -rf "$trace_path"
255}
256
257function test_event_vpid_track_untrack()
258{
259 local trace_path
260 local domain="$1"
261 local expect_event="$2"
262 local wildcard="$3"
263 local channel=''
264
33e55711 265 trace_path=$(mktemp --tmpdir -d tmp.${FUNCNAME[0]}_trace_path.XXXXXX)
ba5e8d0a
MD
266
267 create_lttng_session_ok $SESSION_NAME "$trace_path"
268
269 if [ "$domain" = kernel ]; then
270 channel=chan
271 lttng_enable_kernel_channel 1 0 $SESSION_NAME $channel "--subbuf-size=8M --num-subbuf=4"
272 fi
273
274 enable_"$domain"_lttng_event_ok $SESSION_NAME "$wildcard" "$channel"
275
276 prepare_"$domain"_app
277
278 start_lttng_tracing_ok
279
280 lttng_track_"$domain"_ok "--vpid ${CHILD_PID}"
281 lttng_untrack_"$domain"_ok "--vpid ${CHILD_PID}"
282
283 trace_"$domain"_app
284
285 stop_lttng_tracing_ok
286 destroy_lttng_session_ok $SESSION_NAME
287
288 if [ "$expect_event" -eq 1 ]; then
289 validate_trace "$EVENT_NAME" "$trace_path"
290 else
291 validate_trace_empty "$trace_path"
292 fi
293
294 rm -rf "$trace_path"
295}
296
297function test_event_pid_track_untrack()
298{
299 local trace_path
300 local domain="$1"
301 local expect_event="$2"
302 local wildcard="$3"
303 local channel=''
304
33e55711 305 trace_path=$(mktemp --tmpdir -d tmp.${FUNCNAME[0]}_trace_path.XXXXXX)
ba5e8d0a
MD
306
307 create_lttng_session_ok $SESSION_NAME "$trace_path"
308
309 if [ "$domain" = kernel ]; then
310 channel=chan
311 lttng_enable_kernel_channel 1 0 $SESSION_NAME $channel "--subbuf-size=8M --num-subbuf=4"
312 fi
313
314 enable_"$domain"_lttng_event_ok $SESSION_NAME "$wildcard" "$channel"
315
316 prepare_"$domain"_app
317
318 start_lttng_tracing_ok
319
320 lttng_track_"$domain"_ok "--pid ${CHILD_PID}"
321 lttng_untrack_"$domain"_ok "--pid ${CHILD_PID}"
322
323 trace_"$domain"_app
324
325 stop_lttng_tracing_ok
326 destroy_lttng_session_ok $SESSION_NAME
327
328 if [ "$expect_event" -eq 1 ]; then
329 validate_trace "$EVENT_NAME" "$trace_path"
330 else
331 validate_trace_empty "$trace_path"
332 fi
333
334 rm -rf "$trace_path"
335}
336
14d3fca9
JR
337function test_event_ust_vpid_untrack_snapshot()
338{
33e55711 339 local trace_path=$(mktemp --tmpdir -d tmp.${FUNCNAME[0]}_trace_path.XXXXXX)
14d3fca9
JR
340
341 diag "Test_event_ust_vpid_untrack_snapshot"
342
343 create_lttng_session_ok $SESSION_NAME "$trace_path" "--snapshot"
344
345 enable_ust_lttng_event_ok $SESSION_NAME "$EVENT_NAME"
346
347 prepare_ust_app
348
349 lttng_untrack_ust_ok "--vpid --all"
350
351 start_lttng_tracing_ok
352
353 trace_ust_app
354 lttng_snapshot_record $SESSION_NAME
355
356 stop_lttng_tracing_ok
357 destroy_lttng_session_ok $SESSION_NAME
358
359 snapshot_count=$(find "$trace_path" -name metadata | wc -l)
360 is "$snapshot_count" 0 "Number of snapshot is zero"
361
362 rm -rf "$trace_path"
363}
364
ba5e8d0a
MD
365# MUST set TESTDIR before calling those functions
366plan_tests $NUM_TESTS
367
368print_test_banner "$TEST_DESC"
369
370start_lttng_sessiond
371
372diag "Test UST tracker"
373
374if [ ! -x "$TESTAPP_BIN" ]; then
375 BAIL_OUT "No UST nevents binary detected."
376fi
377
378EVENT_NAME="tp:tptest"
379
adce7589
FD
380# Both ordering of tracker type and `--all` are valid.
381test_event_track_untrack ust 0 "${EVENT_NAME}" "--vgid --all"
382test_event_track_untrack ust 0 "${EVENT_NAME}" "--all --vgid"
383
ba5e8d0a
MD
384#vuid, vgid
385
386# non-matching
387test_event_tracker ust 0 "${EVENT_NAME}" "--vuid $((SCRIPT_UID+1))"
388test_event_tracker ust 0 "${EVENT_NAME}" "--vgid $((SCRIPT_GID+1))"
389test_event_tracker ust 0 "${EVENT_NAME}" "--vuid $((SCRIPT_UID+1)) --vgid $((SCRIPT_GID+1))"
390test_event_tracker ust 0 "${EVENT_NAME}" "--vuid $((SCRIPT_UID+1)) --vgid ${SCRIPT_GID}"
391test_event_tracker ust 0 "${EVENT_NAME}" "--vuid ${SCRIPT_UID} --vgid $((SCRIPT_GID+1))"
392test_event_track_untrack ust 0 "${EVENT_NAME}" "--vuid ${SCRIPT_UID}"
393test_event_track_untrack ust 0 "${EVENT_NAME}" "--vgid ${SCRIPT_GID}"
394test_event_track_untrack ust 0 "${EVENT_NAME}" "--vuid --all"
395test_event_track_untrack ust 0 "${EVENT_NAME}" "--vgid --all"
396
397# matching
398test_event_tracker ust 1 "${EVENT_NAME}" "--vuid ${SCRIPT_UID}"
399test_event_tracker ust 1 "${EVENT_NAME}" "--vgid ${SCRIPT_GID}"
400test_event_tracker ust 1 "${EVENT_NAME}" "--vuid ${SCRIPT_UID} --vgid ${SCRIPT_GID}"
401test_event_tracker ust 1 "${EVENT_NAME}" "--vuid ${SCRIPT_USERNAME}"
402test_event_tracker ust 1 "${EVENT_NAME}" "--vgid ${SCRIPT_GROUPNAME}"
403test_event_tracker ust 1 "${EVENT_NAME}" "--vuid ${SCRIPT_UID},$((SCRIPT_UID+1))"
404test_event_tracker ust 1 "${EVENT_NAME}" "--vgid ${SCRIPT_GID},$((SCRIPT_GID+1))"
405test_event_tracker ust 1 "${EVENT_NAME}" "--vuid ${SCRIPT_USERNAME},$((SCRIPT_UID+1))"
406test_event_tracker ust 1 "${EVENT_NAME}" "--vgid ${SCRIPT_GROUPNAME},$((SCRIPT_GID+1))"
407test_event_tracker ust 1 "${EVENT_NAME}" "--vuid --all"
408test_event_tracker ust 1 "${EVENT_NAME}" "--vgid --all"
409
410#fail
411test_event_tracker_fail ust "${EVENT_NAME}" "--vuid lttng_unexisting_user"
412test_event_tracker_fail ust "${EVENT_NAME}" "--vgid lttng_unexisting_group"
413
414
415#vpid
416
417#non-matching
418test_event_track_untrack ust 0 "${EVENT_NAME}" "--vpid --all"
419test_event_vpid_tracker ust 0 "${EVENT_NAME}"
420test_event_vpid_track_untrack ust 0 "${EVENT_NAME}"
421
422#matching
423test_event_tracker ust 1 "${EVENT_NAME}" "--vpid --all"
424test_event_vpid_tracker ust 1 "${EVENT_NAME}"
425
14d3fca9
JR
426#snapshot untrack vpid
427
428test_event_ust_vpid_untrack_snapshot
429
ba5e8d0a
MD
430#pid (backward compat)
431
432#non-matching
433test_event_pid_tracker ust 0 "${EVENT_NAME}"
434test_event_pid_track_untrack ust 0 "${EVENT_NAME}"
435test_event_track_untrack ust 0 "${EVENT_NAME}" "--pid --all" # backward compat
436
437#matching
438test_event_tracker ust 1 "${EVENT_NAME}" "--pid --all" # backward compat
439test_event_pid_tracker ust 1 "${EVENT_NAME}"
440
441if [ "$(id -u)" == "0" ]; then
442 isroot=1
443else
444 isroot=0
445fi
446
447skip $isroot "Root access is needed. Skipping all kernel tracker tests." $NUM_KERNEL_TESTS ||
448{
449 diag "Test kernel tracker"
450
451 modprobe lttng-test
452 ok $? "Loading lttng-test module"
453
454 EVENT_NAME="lttng_test_filter_event"
455
456 # vuid, vgid, vpid
457
458 # non-matching
459 test_event_tracker kernel 0 "${EVENT_NAME}" "--vuid $((SCRIPT_UID+1))"
460 test_event_tracker kernel 0 "${EVENT_NAME}" "--vgid $((SCRIPT_GID+1))"
461 test_event_tracker kernel 0 "${EVENT_NAME}" "--vuid $((SCRIPT_UID+1)) --vgid $((SCRIPT_GID+1))"
462 test_event_tracker kernel 0 "${EVENT_NAME}" "--vuid $((SCRIPT_UID+1)) --vgid ${SCRIPT_GID}"
463 test_event_tracker kernel 0 "${EVENT_NAME}" "--vuid ${SCRIPT_UID} --vgid $((SCRIPT_GID+1))"
464 test_event_track_untrack kernel 0 "${EVENT_NAME}" "--vuid ${SCRIPT_UID}"
465 test_event_track_untrack kernel 0 "${EVENT_NAME}" "--vgid ${SCRIPT_GID}"
466 test_event_track_untrack kernel 0 "${EVENT_NAME}" "--vuid --all"
467 test_event_track_untrack kernel 0 "${EVENT_NAME}" "--vgid --all"
468
469 # matching
470 test_event_tracker kernel 1 "${EVENT_NAME}" "--vuid ${SCRIPT_UID}"
471 test_event_tracker kernel 1 "${EVENT_NAME}" "--vgid ${SCRIPT_GID}"
472 test_event_tracker kernel 1 "${EVENT_NAME}" "--vuid ${SCRIPT_UID} --vgid ${SCRIPT_GID}"
473 test_event_tracker kernel 1 "${EVENT_NAME}" "--vuid ${SCRIPT_USERNAME}"
474 test_event_tracker kernel 1 "${EVENT_NAME}" "--vgid ${SCRIPT_GROUPNAME}"
475 test_event_tracker kernel 1 "${EVENT_NAME}" "--vuid ${SCRIPT_UID},$((SCRIPT_UID+1))"
476 test_event_tracker kernel 1 "${EVENT_NAME}" "--vgid ${SCRIPT_GID},$((SCRIPT_GID+1))"
477 test_event_tracker kernel 1 "${EVENT_NAME}" "--vuid ${SCRIPT_USERNAME},$((SCRIPT_UID+1))"
478 test_event_tracker kernel 1 "${EVENT_NAME}" "--vgid ${SCRIPT_GROUPNAME},$((SCRIPT_GID+1))"
479 test_event_tracker kernel 1 "${EVENT_NAME}" "--vuid --all"
480 test_event_tracker kernel 1 "${EVENT_NAME}" "--vgid --all"
481
482 #fail
483 test_event_tracker_fail kernel "${EVENT_NAME}" "--vuid lttng_unexisting_user"
484 test_event_tracker_fail kernel "${EVENT_NAME}" "--vgid lttng_unexisting_group"
485
486
487 #uid, gid
488
489 # non-matching
490 test_event_tracker kernel 0 "${EVENT_NAME}" "--uid $((SCRIPT_UID+1))"
491 test_event_tracker kernel 0 "${EVENT_NAME}" "--gid $((SCRIPT_GID+1))"
492 test_event_tracker kernel 0 "${EVENT_NAME}" "--uid $((SCRIPT_UID+1)) --gid $((SCRIPT_GID+1))"
493 test_event_tracker kernel 0 "${EVENT_NAME}" "--uid $((SCRIPT_UID+1)) --gid ${SCRIPT_GID}"
494 test_event_tracker kernel 0 "${EVENT_NAME}" "--uid ${SCRIPT_UID} --gid $((SCRIPT_GID+1))"
495 test_event_track_untrack kernel 0 "${EVENT_NAME}" "--uid ${SCRIPT_UID}"
496 test_event_track_untrack kernel 0 "${EVENT_NAME}" "--gid ${SCRIPT_GID}"
497 test_event_track_untrack kernel 0 "${EVENT_NAME}" "--uid --all"
498 test_event_track_untrack kernel 0 "${EVENT_NAME}" "--gid --all"
499
500 # matching
501 test_event_tracker kernel 1 "${EVENT_NAME}" "--uid ${SCRIPT_UID}"
502 test_event_tracker kernel 1 "${EVENT_NAME}" "--gid ${SCRIPT_GID}"
503 test_event_tracker kernel 1 "${EVENT_NAME}" "--uid ${SCRIPT_UID} --gid ${SCRIPT_GID}"
504 test_event_tracker kernel 1 "${EVENT_NAME}" "--uid ${SCRIPT_USERNAME}"
505 test_event_tracker kernel 1 "${EVENT_NAME}" "--gid ${SCRIPT_GROUPNAME}"
506 test_event_tracker kernel 1 "${EVENT_NAME}" "--uid ${SCRIPT_UID},$((SCRIPT_UID+1))"
507 test_event_tracker kernel 1 "${EVENT_NAME}" "--gid ${SCRIPT_GID},$((SCRIPT_GID+1))"
508 test_event_tracker kernel 1 "${EVENT_NAME}" "--uid ${SCRIPT_USERNAME},$((SCRIPT_UID+1))"
509 test_event_tracker kernel 1 "${EVENT_NAME}" "--gid ${SCRIPT_GROUPNAME},$((SCRIPT_GID+1))"
510
511 #fail
512 test_event_tracker_fail kernel "${EVENT_NAME}" "--uid lttng_unexisting_user"
513 test_event_tracker_fail kernel "${EVENT_NAME}" "--gid lttng_unexisting_group"
514
515
516 #vpid
517
518 #non-matching
519 test_event_track_untrack kernel 0 "${EVENT_NAME}" "--vpid --all"
520 test_event_vpid_tracker kernel 0 "${EVENT_NAME}"
521 test_event_vpid_track_untrack kernel 0 "${EVENT_NAME}"
522
523 #matching
524 test_event_tracker kernel 1 "${EVENT_NAME}" "--vpid --all"
525 test_event_vpid_tracker kernel 1 "${EVENT_NAME}"
526
527 #pid
528
529 #non-matching
530 test_event_pid_tracker kernel 0 "${EVENT_NAME}"
531 test_event_pid_track_untrack kernel 0 "${EVENT_NAME}"
532 test_event_track_untrack kernel 0 "${EVENT_NAME}" "--pid --all"
533
534 #matching
535 test_event_tracker kernel 1 "${EVENT_NAME}" "--pid --all"
536 test_event_pid_tracker kernel 1 "${EVENT_NAME}"
537
d0e263e7 538 modprobe --remove lttng-test
ba5e8d0a
MD
539 ok $? "Unloading lttng-test module"
540}
541
542stop_lttng_sessiond
This page took 0.046377 seconds and 4 git commands to generate.