Skip to content
  • Johannes Schindelin's avatar
    test-lib: introduce 'test_atexit' · 900721e1
    Johannes Schindelin authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    When running Apache, 'git daemon', or p4d, we want to kill them at the
    end of the test script, otherwise a leftover daemon process will keep
    its port open indefinitely, and thus will interfere with subsequent
    executions of the same test script.
    
    So far, we stop these daemon processes "manually", i.e.:
    
      - by registering functions or commands in the trap on EXIT to stop
        the daemon while preserving the last seen exit code before the
        trap (to deal with a failure when run with '--immediate' or with
        interrupts by ctrl-C),
    
      - and by invoking these functions/commands last thing before
        'test_done' (and sometimes restoring the test framework's default
        trap on EXIT, to prevent the daemons from being killed twice).
    
    On one hand, we do this inconsistently, e.g. 'git p4' tests invoke
    different functions in the trap on EXIT and in the last test before
    'test_done', and they neither restore the test framework's default trap
    on EXIT nor preserve the last seen exit code.  On the other hand, this
    is error prone, because, as shown in a previous patch in this series,
    any output from the cleanup commands in the trap on EXIT can prevent a
    proper cleanup when a test script run with '--verbose-log' and certain
    shells, notably 'dash', is interrupted.
    
    Let's introduce 'test_atexit', which is loosely modeled after
    'test_when_finished', but has a broader scope: rather than running the
    commands after the current test case, run them when the test script
    finishes, and also run them when the test is interrupted, or exits
    early in case of a failure while the '--immediate' option is in
    effect.
    
    When running the cleanup commands at the end of a successful test,
    then they will be run in 'test_done' before it removes the trash
    directory, i.e. the cleanup commands will still be able to access any
    pidfiles or socket files in there.  When running the cleanup commands
    after an interrupt or failure with '--immediate', then they will be
    run in the trap on EXIT.  In both cases they will be run in
    'test_eval_', i.e. both standard error and output of all cleanup
    commands will go where they should according to the '-v' or
    '--verbose-log' options, and thus won't cause any troubles when
    interrupting a test script run with '--verbose-log'.
    
    Signed-off-by: default avatarJohannes Schindelin <johannes.schindelin@gmx.de>
    Signed-off-by: default avatarSZEDER Gábor <szeder.dev@gmail.com>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    900721e1