t0211: demonstrate missing 'def_param' events for certain commands

Some Git commands fail to emit 'def_param' events for interesting config and environment variable settings. Add unit tests to demonstrate this. Most commands are considered "builtin" and are based upon git.c. These typically do emit 'def_param' events. Exceptions are some of the "query" commands, the "run-dashed" mechanism, and alias handling. Commands built from remote-curl.c (instead of git.c), such as "git-remote-https", do not emit 'def_param' events. Likewise, "git-http-fetch" is built http-fetch.c and does not emit them. Signed-off-by: Jeff Hostetler <jeffhostetler@github.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff Hostetler committed Mar 7, 2024 at 15:22 UTC 0c1c3c861eacc7e27e627c80cc081ec7c00c743d
1 file changed +231
t/t0211-trace2-perf.sh
+231
@@ -287,4 +287,235 @@ test_expect_success 'unsafe URLs are redacted by default' '
287 grep "d0|main|def_param|.*|remote.origin.url:https://user:pwd@example.com" actual
288 '
289
290 +# Confirm that the requested command produces a "cmd_name" and a
291 +# set of "def_param" events.
292 +#
293 +try_simple () {
294 + test_when_finished "rm prop.perf actual" &&
295 +
296 + cmd=$1 &&
297 + cmd_name=$2 &&
298 +
299 + test_config_global "trace2.configParams" "cfg.prop.*" &&
300 + test_config_global "trace2.envvars" "ENV_PROP_FOO,ENV_PROP_BAR" &&
301 +
302 + test_config_global "cfg.prop.foo" "red" &&
303 +
304 + ENV_PROP_FOO=blue \
305 + GIT_TRACE2_PERF="$(pwd)/prop.perf" \
306 + $cmd &&
307 + perl "$TEST_DIRECTORY/t0211/scrub_perf.perl" <prop.perf >actual &&
308 + grep "d0|main|cmd_name|.*|$cmd_name" actual &&
309 + grep "d0|main|def_param|.*|cfg.prop.foo:red" actual &&
310 + grep "d0|main|def_param|.*|ENV_PROP_FOO:blue" actual
311 +}
312 +
313 +# Representative mainstream builtin Git command dispatched
314 +# in run_builtin() in git.c
315 +#
316 +test_expect_success 'expect def_params for normal builtin command' '
317 + try_simple "git version" "version"
318 +'
319 +
320 +# Representative query command dispatched in handle_options()
321 +# in git.c
322 +#
323 +test_expect_failure 'expect def_params for query command' '
324 + try_simple "git --man-path" "_query_"
325 +'
326 +
327 +# remote-curl.c does not use the builtin setup in git.c, so confirm
328 +# that executables built from remote-curl.c emit def_params.
329 +#
330 +# Also tests the dashed-command handling where "git foo" silently
331 +# spawns "git-foo". Make sure that both commands should emit
332 +# def_params.
333 +#
334 +# Pass bogus arguments to remote-https and allow the command to fail
335 +# because we don't actually have a remote to fetch from. We just want
336 +# to see the run-dashed code run an executable built from
337 +# remote-curl.c rather than git.c. Confirm that we get def_param
338 +# events from both layers.
339 +#
340 +test_expect_failure 'expect def_params for remote-curl and _run_dashed_' '
341 + test_when_finished "rm prop.perf actual" &&
342 +
343 + test_config_global "trace2.configParams" "cfg.prop.*" &&
344 + test_config_global "trace2.envvars" "ENV_PROP_FOO,ENV_PROP_BAR" &&
345 +
346 + test_config_global "cfg.prop.foo" "red" &&
347 +
348 + test_might_fail env \
349 + ENV_PROP_FOO=blue \
350 + GIT_TRACE2_PERF="$(pwd)/prop.perf" \
351 + git remote-http x y &&
352 +
353 + perl "$TEST_DIRECTORY/t0211/scrub_perf.perl" <prop.perf >actual &&
354 +
355 + grep "d0|main|cmd_name|.*|_run_dashed_" actual &&
356 + grep "d0|main|def_param|.*|cfg.prop.foo:red" actual &&
357 + grep "d0|main|def_param|.*|ENV_PROP_FOO:blue" actual &&
358 +
359 + grep "d1|main|cmd_name|.*|remote-curl" actual &&
360 + grep "d1|main|def_param|.*|cfg.prop.foo:red" actual &&
361 + grep "d1|main|def_param|.*|ENV_PROP_FOO:blue" actual
362 +'
363 +
364 +# Similarly, `git-http-fetch` is not built from git.c so do a
365 +# trivial fetch so that the main git.c run-dashed code spawns
366 +# an executable built from http-fetch.c. Confirm that we get
367 +# def_param events from both layers.
368 +#
369 +test_expect_failure 'expect def_params for http-fetch and _run_dashed_' '
370 + test_when_finished "rm prop.perf actual" &&
371 +
372 + test_config_global "trace2.configParams" "cfg.prop.*" &&
373 + test_config_global "trace2.envvars" "ENV_PROP_FOO,ENV_PROP_BAR" &&
374 +
375 + test_config_global "cfg.prop.foo" "red" &&
376 +
377 + test_might_fail env \
378 + ENV_PROP_FOO=blue \
379 + GIT_TRACE2_PERF="$(pwd)/prop.perf" \
380 + git http-fetch --stdin file:/// <<-EOF &&
381 + EOF
382 +
383 + perl "$TEST_DIRECTORY/t0211/scrub_perf.perl" <prop.perf >actual &&
384 +
385 + grep "d0|main|cmd_name|.*|_run_dashed_" actual &&
386 + grep "d0|main|def_param|.*|cfg.prop.foo:red" actual &&
387 + grep "d0|main|def_param|.*|ENV_PROP_FOO:blue" actual &&
388 +
389 + grep "d1|main|cmd_name|.*|http-fetch" actual &&
390 + grep "d1|main|def_param|.*|cfg.prop.foo:red" actual &&
391 + grep "d1|main|def_param|.*|ENV_PROP_FOO:blue" actual
392 +'
393 +
394 +# Historically, alias expansion explicitly emitted the def_param
395 +# events (independent of whether the command was a builtin, a Git
396 +# command or arbitrary shell command) so that it wasn't dependent
397 +# upon the unpeeling of the alias. Let's make sure that we preserve
398 +# the net effect.
399 +#
400 +test_expect_success 'expect def_params during git alias expansion' '
401 + test_when_finished "rm prop.perf actual" &&
402 +
403 + test_config_global "trace2.configParams" "cfg.prop.*" &&
404 + test_config_global "trace2.envvars" "ENV_PROP_FOO,ENV_PROP_BAR" &&
405 +
406 + test_config_global "cfg.prop.foo" "red" &&
407 +
408 + test_config_global "alias.xxx" "version" &&
409 +
410 + ENV_PROP_FOO=blue \
411 + GIT_TRACE2_PERF="$(pwd)/prop.perf" \
412 + git xxx &&
413 +
414 + perl "$TEST_DIRECTORY/t0211/scrub_perf.perl" <prop.perf >actual &&
415 +
416 + # "git xxx" is first mapped to "git-xxx" and the child will fail.
417 + grep "d0|main|cmd_name|.*|_run_dashed_ (_run_dashed_)" actual &&
418 +
419 + # We unpeel that and substitute "version" into "xxx" (giving
420 + # "git version") and update the cmd_name event.
421 + grep "d0|main|cmd_name|.*|_run_git_alias_ (_run_dashed_/_run_git_alias_)" actual &&
422 +
423 + # These def_param events could be associated with either of the
424 + # above cmd_name events. It does not matter.
425 + grep "d0|main|def_param|.*|cfg.prop.foo:red" actual &&
426 + grep "d0|main|def_param|.*|ENV_PROP_FOO:blue" actual &&
427 +
428 + # The "git version" child sees a different cmd_name hierarchy.
429 + # Also test the def_param (only for completeness).
430 + grep "d1|main|cmd_name|.*|version (_run_dashed_/_run_git_alias_/version)" actual &&
431 + grep "d1|main|def_param|.*|cfg.prop.foo:red" actual &&
432 + grep "d1|main|def_param|.*|ENV_PROP_FOO:blue" actual
433 +'
434 +
435 +test_expect_success 'expect def_params during shell alias expansion' '
436 + test_when_finished "rm prop.perf actual" &&
437 +
438 + test_config_global "trace2.configParams" "cfg.prop.*" &&
439 + test_config_global "trace2.envvars" "ENV_PROP_FOO,ENV_PROP_BAR" &&
440 +
441 + test_config_global "cfg.prop.foo" "red" &&
442 +
443 + test_config_global "alias.xxx" "!git version" &&
444 +
445 + ENV_PROP_FOO=blue \
446 + GIT_TRACE2_PERF="$(pwd)/prop.perf" \
447 + git xxx &&
448 +
449 + perl "$TEST_DIRECTORY/t0211/scrub_perf.perl" <prop.perf >actual &&
450 +
451 + # "git xxx" is first mapped to "git-xxx" and the child will fail.
452 + grep "d0|main|cmd_name|.*|_run_dashed_ (_run_dashed_)" actual &&
453 +
454 + # We unpeel that and substitute "git version" for "git xxx" (as a
455 + # shell command. Another cmd_name event is emitted as we unpeel.
456 + grep "d0|main|cmd_name|.*|_run_shell_alias_ (_run_dashed_/_run_shell_alias_)" actual &&
457 +
458 + # These def_param events could be associated with either of the
459 + # above cmd_name events. It does not matter.
460 + grep "d0|main|def_param|.*|cfg.prop.foo:red" actual &&
461 + grep "d0|main|def_param|.*|ENV_PROP_FOO:blue" actual &&
462 +
463 + # We get the following only because we used a git command for the
464 + # shell command. In general, it could have been a shell script and
465 + # we would see nothing.
466 + #
467 + # The child knows the cmd_name hierarchy so it includes it.
468 + grep "d1|main|cmd_name|.*|version (_run_dashed_/_run_shell_alias_/version)" actual &&
469 + grep "d1|main|def_param|.*|cfg.prop.foo:red" actual &&
470 + grep "d1|main|def_param|.*|ENV_PROP_FOO:blue" actual
471 +'
472 +
473 +test_expect_failure 'expect def_params during nested git alias expansion' '
474 + test_when_finished "rm prop.perf actual" &&
475 +
476 + test_config_global "trace2.configParams" "cfg.prop.*" &&
477 + test_config_global "trace2.envvars" "ENV_PROP_FOO,ENV_PROP_BAR" &&
478 +
479 + test_config_global "cfg.prop.foo" "red" &&
480 +
481 + test_config_global "alias.xxx" "yyy" &&
482 + test_config_global "alias.yyy" "version" &&
483 +
484 + ENV_PROP_FOO=blue \
485 + GIT_TRACE2_PERF="$(pwd)/prop.perf" \
486 + git xxx &&
487 +
488 + perl "$TEST_DIRECTORY/t0211/scrub_perf.perl" <prop.perf >actual &&
489 +
490 + # "git xxx" is first mapped to "git-xxx" and try to spawn "git-xxx"
491 + # and the child will fail.
492 + grep "d0|main|cmd_name|.*|_run_dashed_ (_run_dashed_)" actual &&
493 + grep "d0|main|child_start|.*|.* class:dashed argv:\[git-xxx\]" actual &&
494 +
495 + # We unpeel that and substitute "yyy" into "xxx" (giving "git yyy")
496 + # and spawn "git-yyy" and the child will fail.
497 + grep "d0|main|alias|.*|alias:xxx argv:\[yyy\]" actual &&
498 + grep "d0|main|cmd_name|.*|_run_dashed_ (_run_dashed_/_run_dashed_)" actual &&
499 + grep "d0|main|child_start|.*|.* class:dashed argv:\[git-yyy\]" actual &&
500 +
501 + # We unpeel that and substitute "version" into "xxx" (giving
502 + # "git version") and update the cmd_name event.
503 + grep "d0|main|alias|.*|alias:yyy argv:\[version\]" actual &&
504 + grep "d0|main|cmd_name|.*|_run_git_alias_ (_run_dashed_/_run_dashed_/_run_git_alias_)" actual &&
505 +
506 + # These def_param events could be associated with any of the
507 + # above cmd_name events. It does not matter.
508 + grep "d0|main|def_param|.*|cfg.prop.foo:red" actual >actual.matches &&
509 + grep "d0|main|def_param|.*|ENV_PROP_FOO:blue" actual &&
510 +
511 + # However, we do not want them repeated each time we unpeel.
512 + test_line_count = 1 actual.matches &&
513 +
514 + # The "git version" child sees a different cmd_name hierarchy.
515 + # Also test the def_param (only for completeness).
516 + grep "d1|main|cmd_name|.*|version (_run_dashed_/_run_dashed_/_run_git_alias_/version)" actual &&
517 + grep "d1|main|def_param|.*|cfg.prop.foo:red" actual &&
518 + grep "d1|main|def_param|.*|ENV_PROP_FOO:blue" actual
519 +'
520 +
521 test_done