tests/test-nointerrupt.t
author Manuel Jacob <me@manueljacob.de>
Mon, 11 Jul 2022 01:51:20 +0200
branchstable
changeset 49378 094a5fa3cf52
parent 48255 8c34edb1ad10
child 49446 8c75ae3f0eea
permissions -rw-r--r--
procutil: make stream detection in make_line_buffered more correct and strict In make_line_buffered(), we don’t want to wrap the stream if we know that lines get flushed to the underlying raw stream already. Previously, the heuristic was too optimistic. It assumed that any stream which is not an instance of io.BufferedIOBase doesn’t need wrapping. However, there are buffered streams that aren’t instances of io.BufferedIOBase, like Mercurial’s own winstdout. The new logic is different in two ways: First, only for the check, if unwraps any combination of WriteAllWrapper and winstdout. Second, it skips wrapping the stream only if it is an instance of io.RawIOBase (or already wrapped). If it is an instance of io.BufferedIOBase, it gets wrapped. In any other case, the function raises an exception. This ensures that, if an unknown stream is passed or we add another wrapper in the future, we don’t wrap the stream if it’s already line buffered or not wrap the stream if it’s not line buffered. In fact, this was already helpful during development of this change. Without it, I possibly would have forgot that WriteAllWrapper needs to be ignored for the check, leading to unnecessary wrapping if stdout is unbuffered. The alternative would have been to always wrap unknown streams. However, I don’t think that anyone would benefit from being less strict. We can expect streams from the standard library to be subclassing either io.RawIOBase or io.BufferedIOBase, so running Mercurial in the standard way should not regress by this change. Py2exe might replace sys.stdout and sys.stderr, but that currently breaks Mercurial anyway and also these streams don’t claim to be interactive, so this function is not called for them.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
47587
be496e3489b9 tests: blacklist a handful of test with `rhg` or `chg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47063
diff changeset
     1
#require no-windows no-rhg
be496e3489b9 tests: blacklist a handful of test with `rhg` or `chg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47063
diff changeset
     2
be496e3489b9 tests: blacklist a handful of test with `rhg` or `chg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47063
diff changeset
     3
XXX-RHG this test hangs if `hg` is really `rhg`. This was hidden by the use of
be496e3489b9 tests: blacklist a handful of test with `rhg` or `chg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47063
diff changeset
     4
`alias hg=rhg` by run-tests.py. With such alias removed, this test is revealed
be496e3489b9 tests: blacklist a handful of test with `rhg` or `chg`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47063
diff changeset
     5
buggy. This need to be resolved sooner than later.
39479
3ba87d5b9ad3 tests: disable test-nointerrupt on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 38656
diff changeset
     6
38526
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
     7
Dummy extension simulating unsafe long running command
47762
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
     8
  $ SYNC_FILE="$TESTTMP/sync-file"
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
     9
  $ export SYNC_FILE
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    10
  $ DONE_FILE="$TESTTMP/done-file"
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    11
  $ export DONE_FILE
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    12
  $ 
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    13
  $ cat > wait_ext.py <<EOF
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    14
  > import os
38526
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    15
  > import time
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    16
  > 
38656
531f5e933e49 tests: properly sort imports in test-nointerrupt.t
Augie Fackler <augie@google.com>
parents: 38526
diff changeset
    17
  > from mercurial.i18n import _
38526
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    18
  > from mercurial import registrar
47762
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    19
  > from mercurial import testing
38526
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    20
  > 
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    21
  > cmdtable = {}
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    22
  > command = registrar.command(cmdtable)
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    23
  > 
47762
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    24
  > @command(b'wait-signal', [], _(b'SYNC_FILE DONE_FILE'), norepo=True)
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    25
  > def sleep(ui, sync_file=b"$SYNC_FILE", done_file=b"$DONE_FILE", **opts):
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    26
  >     start = time.time()
41076
8ecb17b7f432 procutil: correct spelling of uninterruptable -> uninterruptible
Kyle Lippincott <spectral@google.com>
parents: 39479
diff changeset
    27
  >     with ui.uninterruptible():
47762
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    28
  >         testing.write_file(sync_file, b'%d' % os.getpid())
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    29
  >         testing.wait_file(done_file)
47805
8892f604e242 test-nointerrupt: make "sure" the handler "might" trigger (issue6558)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47762
diff changeset
    30
  >         # make sure we get rescheduled and the signal get a chance to be handled
8892f604e242 test-nointerrupt: make "sure" the handler "might" trigger (issue6558)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47762
diff changeset
    31
  >         time.sleep(0.1)
38526
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    32
  >         ui.warn(b"end of unsafe operation\n")
47762
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    33
  >     ui.warn(b"%d second(s) passed\n" % int(time.time() - start))
38526
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    34
  > EOF
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    35
47762
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    36
  $ cat > send-signal.sh << EOF
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    37
  > #!/bin/sh
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    38
  > SIG=\$1
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    39
  > if [ -z "\$SIG" ]; then
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    40
  >    echo "send-signal.sh requires one argument" >&2
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    41
  >    exit 1
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    42
  > fi
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    43
  > "$RUNTESTDIR/testlib/wait-on-file" 10 "$SYNC_FILE" || exit 2
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    44
  > kill -s \$SIG \`cat "$SYNC_FILE"\`
47805
8892f604e242 test-nointerrupt: make "sure" the handler "might" trigger (issue6558)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47762
diff changeset
    45
  > sleep 1
47762
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    46
  > touch "$DONE_FILE"
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    47
  > EOF
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    48
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    49
#if no-windows
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    50
  $ chmod +x send-signal.sh
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    51
#endif
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    52
38526
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    53
Kludge to emulate timeout(1) which is not generally available.
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    54
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    55
Set up repository
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    56
  $ hg init repo
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    57
  $ cd repo
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    58
  $ cat >> $HGRCPATH << EOF
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    59
  > [extensions]
47762
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    60
  > wait_ext = $TESTTMP/wait_ext.py
38526
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    61
  > EOF
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    62
47762
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    63
38526
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    64
Test ctrl-c
47762
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    65
  $ rm -f $SYNC_FILE $DONE_FILE
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    66
  $ sh -c "../send-signal.sh INT" &
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    67
  $ hg wait-signal
38526
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    68
  interrupted!
48255
8c34edb1ad10 backout: backed out changeset 6edc8800dbc3
Raphaël Gomès <rgomes@octobus.net>
parents: 48186
diff changeset
    69
  [255]
38526
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    70
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    71
  $ cat >> $HGRCPATH << EOF
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    72
  > [experimental]
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    73
  > nointerrupt = yes
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    74
  > EOF
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    75
47762
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    76
  $ rm -f $SYNC_FILE $DONE_FILE
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    77
  $ sh -c "../send-signal.sh INT" &
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    78
  $ hg wait-signal
38526
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    79
  interrupted!
48255
8c34edb1ad10 backout: backed out changeset 6edc8800dbc3
Raphaël Gomès <rgomes@octobus.net>
parents: 48186
diff changeset
    80
  [255]
38526
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    81
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    82
  $ cat >> $HGRCPATH << EOF
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    83
  > [experimental]
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    84
  > nointerrupt-interactiveonly = False
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    85
  > EOF
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    86
47762
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    87
  $ rm -f $SYNC_FILE $DONE_FILE
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    88
  $ sh -c "../send-signal.sh INT" &
f48a688a7044 test: remove `sleep` usage in `test-nointerrupt.t` (issue6271)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47587
diff changeset
    89
  $ hg wait-signal
38526
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    90
  shutting down cleanly
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    91
  press ^C again to terminate immediately (dangerous)
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    92
  end of unsafe operation
313a940d49a3 ui: add an uninterruptable context manager that can block SIGINT
Augie Fackler <augie@google.com>
parents:
diff changeset
    93
  interrupted!
48255
8c34edb1ad10 backout: backed out changeset 6edc8800dbc3
Raphaël Gomès <rgomes@octobus.net>
parents: 48186
diff changeset
    94
  [255]