t / t0210-trace2-normal.shon commit test-dir-iterator: do not assume errno values (9042140)
   1#!/bin/sh
   2
   3test_description='test trace2 facility (normal target)'
   4. ./test-lib.sh
   5
   6# Turn off any inherited trace2 settings for this test.
   7sane_unset GIT_TRACE2 GIT_TRACE2_PERF GIT_TRACE2_EVENT
   8sane_unset GIT_TRACE2_BRIEF
   9sane_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.
  14TTDIR="$GIT_BUILD_DIR/t/helper/" && export TTDIR
  15PATH="$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
  23V=$(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.
  35GIT_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
  55test_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
  69test_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
  83test_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
 102test_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
 116test_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
 134test_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
 150sane_unset GIT_TRACE2_BRIEF
 151
 152# Now test without environment variables and get all Trace2 settings
 153# from the global config.
 154
 155test_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
 171test_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
 189test_done