Merge branch 'en/fill-directory-fixes-more'
[git] / t / t0210-trace2-normal.sh
1 #!/bin/sh
2
3 test_description='test trace2 facility (normal target)'
4 . ./test-lib.sh
5
6 # Turn off any inherited trace2 settings for this test.
7 sane_unset GIT_TRACE2 GIT_TRACE2_PERF GIT_TRACE2_EVENT
8 sane_unset GIT_TRACE2_BRIEF
9 sane_unset GIT_TRACE2_CONFIG_PARAMS
10
11 # Add t/helper directory to PATH so that we can use a relative
12 # path to run nested instances of test-tool.exe (see 004child).
13 # This helps with HEREDOC comparisons later.
14 TTDIR="$GIT_BUILD_DIR/t/helper/" && export TTDIR
15 PATH="$TTDIR:$PATH" && export PATH
16
17 # Warning: use of 'test_cmp' may run test-tool.exe and/or git.exe
18 # Warning: to do the actual diff/comparison, so the HEREDOCs here
19 # Warning: only cover our actual calls to test-tool and/or git.
20 # Warning: So you may see extra lines in artifact files when
21 # Warning: interactively debugging.
22
23 V=$(git version | sed -e 's/^git version //') && export V
24
25 # There are multiple trace2 targets: normal, perf, and event.
26 # Trace2 events will/can be written to each active target (subject
27 # to whatever filtering that target decides to do).
28 # This script tests the normal target in isolation.
29 #
30 # Defer setting GIT_TRACE2 until the actual command line we want to test
31 # because hidden git and test-tool commands run by the test harness
32 # can contaminate our output.
33
34 # Enable "brief" feature which turns off "<clock> <file>:<line> " prefix.
35 GIT_TRACE2_BRIEF=1 && export GIT_TRACE2_BRIEF
36
37 # Basic tests of the trace2 normal stream.  Since this stream is used
38 # primarily with printf-style debugging/tracing, we do limited testing
39 # here.
40 #
41 # We do confirm the following API features:
42 # [] the 'version <v>' event
43 # [] the 'start <argv>' event
44 # [] the 'cmd_name <name>' event
45 # [] the 'exit <time> code:<code>' event
46 # [] the 'atexit <time> code:<code>' event
47 #
48 # Fields of the form _FIELD_ are tokens that have been replaced (such
49 # as the elapsed time).
50
51 # Verb 001return
52 #
53 # Implicit return from cmd_<verb> function propagates <code>.
54
55 test_expect_success 'normal stream, return code 0' '
56         test_when_finished "rm trace.normal actual expect" &&
57         GIT_TRACE2="$(pwd)/trace.normal" test-tool trace2 001return 0 &&
58         perl "$TEST_DIRECTORY/t0210/scrub_normal.perl" <trace.normal >actual &&
59         cat >expect <<-EOF &&
60                 version $V
61                 start _EXE_ trace2 001return 0
62                 cmd_name trace2 (trace2)
63                 exit elapsed:_TIME_ code:0
64                 atexit elapsed:_TIME_ code:0
65         EOF
66         test_cmp expect actual
67 '
68
69 test_expect_success 'normal stream, return code 1' '
70         test_when_finished "rm trace.normal actual expect" &&
71         test_must_fail env GIT_TRACE2="$(pwd)/trace.normal" test-tool trace2 001return 1 &&
72         perl "$TEST_DIRECTORY/t0210/scrub_normal.perl" <trace.normal >actual &&
73         cat >expect <<-EOF &&
74                 version $V
75                 start _EXE_ trace2 001return 1
76                 cmd_name trace2 (trace2)
77                 exit elapsed:_TIME_ code:1
78                 atexit elapsed:_TIME_ code:1
79         EOF
80         test_cmp expect actual
81 '
82
83 test_expect_success 'automatic filename' '
84         test_when_finished "rm -r traces actual expect" &&
85         mkdir traces &&
86         GIT_TRACE2="$(pwd)/traces" test-tool trace2 001return 0 &&
87         perl "$TEST_DIRECTORY/t0210/scrub_normal.perl" <"$(ls traces/*)" >actual &&
88         cat >expect <<-EOF &&
89                 version $V
90                 start _EXE_ trace2 001return 0
91                 cmd_name trace2 (trace2)
92                 exit elapsed:_TIME_ code:0
93                 atexit elapsed:_TIME_ code:0
94         EOF
95         test_cmp expect actual
96 '
97
98 # Verb 002exit
99 #
100 # Explicit exit(code) from within cmd_<verb> propagates <code>.
101
102 test_expect_success 'normal stream, exit code 0' '
103         test_when_finished "rm trace.normal actual expect" &&
104         GIT_TRACE2="$(pwd)/trace.normal" test-tool trace2 002exit 0 &&
105         perl "$TEST_DIRECTORY/t0210/scrub_normal.perl" <trace.normal >actual &&
106         cat >expect <<-EOF &&
107                 version $V
108                 start _EXE_ trace2 002exit 0
109                 cmd_name trace2 (trace2)
110                 exit elapsed:_TIME_ code:0
111                 atexit elapsed:_TIME_ code:0
112         EOF
113         test_cmp expect actual
114 '
115
116 test_expect_success 'normal stream, exit code 1' '
117         test_when_finished "rm trace.normal actual expect" &&
118         test_must_fail env GIT_TRACE2="$(pwd)/trace.normal" test-tool trace2 002exit 1 &&
119         perl "$TEST_DIRECTORY/t0210/scrub_normal.perl" <trace.normal >actual &&
120         cat >expect <<-EOF &&
121                 version $V
122                 start _EXE_ trace2 002exit 1
123                 cmd_name trace2 (trace2)
124                 exit elapsed:_TIME_ code:1
125                 atexit elapsed:_TIME_ code:1
126         EOF
127         test_cmp expect actual
128 '
129
130 # Verb 003error
131 #
132 # To the above, add multiple 'error <msg>' events
133
134 test_expect_success 'normal stream, error event' '
135         test_when_finished "rm trace.normal actual expect" &&
136         GIT_TRACE2="$(pwd)/trace.normal" test-tool trace2 003error "hello world" "this is a test" &&
137         perl "$TEST_DIRECTORY/t0210/scrub_normal.perl" <trace.normal >actual &&
138         cat >expect <<-EOF &&
139                 version $V
140                 start _EXE_ trace2 003error '\''hello world'\'' '\''this is a test'\''
141                 cmd_name trace2 (trace2)
142                 error hello world
143                 error this is a test
144                 exit elapsed:_TIME_ code:0
145                 atexit elapsed:_TIME_ code:0
146         EOF
147         test_cmp expect actual
148 '
149
150 sane_unset GIT_TRACE2_BRIEF
151
152 # Now test without environment variables and get all Trace2 settings
153 # from the global config.
154
155 test_expect_success 'using global config, normal stream, return code 0' '
156         test_when_finished "rm trace.normal actual expect" &&
157         test_config_global trace2.normalBrief 1 &&
158         test_config_global trace2.normalTarget "$(pwd)/trace.normal" &&
159         test-tool trace2 001return 0 &&
160         perl "$TEST_DIRECTORY/t0210/scrub_normal.perl" <trace.normal >actual &&
161         cat >expect <<-EOF &&
162                 version $V
163                 start _EXE_ trace2 001return 0
164                 cmd_name trace2 (trace2)
165                 exit elapsed:_TIME_ code:0
166                 atexit elapsed:_TIME_ code:0
167         EOF
168         test_cmp expect actual
169 '
170
171 test_expect_success 'using global config with include' '
172         test_when_finished "rm trace.normal actual expect real.gitconfig" &&
173         test_config_global trace2.normalBrief 1 &&
174         test_config_global trace2.normalTarget "$(pwd)/trace.normal" &&
175         mv "$(pwd)/.gitconfig" "$(pwd)/real.gitconfig" &&
176         test_config_global include.path "$(pwd)/real.gitconfig" &&
177         test-tool trace2 001return 0 &&
178         perl "$TEST_DIRECTORY/t0210/scrub_normal.perl" <trace.normal >actual &&
179         cat >expect <<-EOF &&
180                 version $V
181                 start _EXE_ trace2 001return 0
182                 cmd_name trace2 (trace2)
183                 exit elapsed:_TIME_ code:0
184                 atexit elapsed:_TIME_ code:0
185         EOF
186         test_cmp expect actual
187 '
188
189 test_done