test-worker.t
165 lines
| 3.9 KiB
| text/troff
|
Tads3Lexer
/ tests / test-worker.t
David Soria Parra
|
r31696 | Test UI worker interaction | ||
$ cat > t.py <<EOF | ||||
> from __future__ import absolute_import, print_function | ||||
Gregory Szorc
|
r44575 | > import sys | ||
Jun Wu
|
r32114 | > import time | ||
David Soria Parra
|
r31696 | > from mercurial import ( | ||
Yuya Nishihara
|
r32041 | > error, | ||
Yuya Nishihara
|
r32337 | > registrar, | ||
David Soria Parra
|
r31696 | > ui as uimod, | ||
> worker, | ||||
> ) | ||||
Gregory Szorc
|
r44575 | > sys.unraisablehook = lambda x: None | ||
Yuya Nishihara
|
r32041 | > def abort(ui, args): | ||
> if args[0] == 0: | ||||
> # by first worker for test stability | ||||
Pulkit Goyal
|
r36200 | > raise error.Abort(b'known exception') | ||
Yuya Nishihara
|
r32041 | > return runme(ui, []) | ||
Yuya Nishihara
|
r32043 | > def exc(ui, args): | ||
> if args[0] == 0: | ||||
> # by first worker for test stability | ||||
> raise Exception('unknown exception') | ||||
> return runme(ui, []) | ||||
David Soria Parra
|
r31696 | > def runme(ui, args): | ||
> for arg in args: | ||||
Pulkit Goyal
|
r36200 | > ui.status(b'run\n') | ||
David Soria Parra
|
r31696 | > yield 1, arg | ||
Jun Wu
|
r32114 | > time.sleep(0.1) # easier to trigger killworkers code path | ||
Yuya Nishihara
|
r32041 | > functable = { | ||
Pulkit Goyal
|
r36200 | > b'abort': abort, | ||
> b'exc': exc, | ||||
> b'runme': runme, | ||||
Yuya Nishihara
|
r32041 | > } | ||
David Soria Parra
|
r31696 | > cmdtable = {} | ||
Yuya Nishihara
|
r32337 | > command = registrar.command(cmdtable) | ||
Pulkit Goyal
|
r36200 | > @command(b'test', [], b'hg test [COST] [FUNC]') | ||
> def t(ui, repo, cost=1.0, func=b'runme'): | ||||
David Soria Parra
|
r31696 | > cost = float(cost) | ||
Yuya Nishihara
|
r32041 | > func = functable[func] | ||
Pulkit Goyal
|
r36200 | > ui.status(b'start\n') | ||
Yuya Nishihara
|
r32041 | > runs = worker.worker(ui, cost, func, (ui,), range(8)) | ||
David Soria Parra
|
r31696 | > for n, i in runs: | ||
> pass | ||||
Pulkit Goyal
|
r36200 | > ui.status(b'done\n') | ||
David Soria Parra
|
r31696 | > EOF | ||
$ abspath=`pwd`/t.py | ||||
$ hg init | ||||
Run tests with worker enable by forcing a heigh cost | ||||
$ hg --config "extensions.t=$abspath" test 100000.0 | ||||
start | ||||
run | ||||
run | ||||
run | ||||
run | ||||
run | ||||
run | ||||
run | ||||
run | ||||
done | ||||
Run tests without worker by forcing a low cost | ||||
$ hg --config "extensions.t=$abspath" test 0.0000001 | ||||
start | ||||
run | ||||
run | ||||
run | ||||
run | ||||
run | ||||
run | ||||
run | ||||
run | ||||
done | ||||
Yuya Nishihara
|
r32041 | |||
Yuya Nishihara
|
r32061 | #if no-windows | ||
Yuya Nishihara
|
r32041 | Known exception should be caught, but printed if --traceback is enabled | ||
Jun Wu
|
r32114 | $ hg --config "extensions.t=$abspath" --config 'worker.numcpus=8' \ | ||
> test 100000.0 abort 2>&1 | ||||
Yuya Nishihara
|
r32041 | start | ||
abort: known exception | ||||
Yuya Nishihara
|
r32042 | [255] | ||
Yuya Nishihara
|
r32041 | |||
Jun Wu
|
r32114 | $ hg --config "extensions.t=$abspath" --config 'worker.numcpus=8' \ | ||
Martin von Zweigbergk
|
r46429 | > test 100000.0 abort --traceback 2>&1 | egrep '(WorkerError|Abort)' | ||
Gregory Szorc
|
r41662 | raise error.Abort(b'known exception') | ||
Denis Laxalde
|
r43720 | mercurial.error.Abort: known exception (py3 !) | ||
Martin von Zweigbergk
|
r46429 | raise error.WorkerError(status) | ||
Martin von Zweigbergk
|
r46515 | mercurial.error.WorkerError: 255 (py3 !) | ||
Yuya Nishihara
|
r32043 | |||
Traceback must be printed for unknown exceptions | ||||
Jun Wu
|
r32114 | $ hg --config "extensions.t=$abspath" --config 'worker.numcpus=8' \ | ||
Jun Wu
|
r32113 | > test 100000.0 exc 2>&1 | grep '^Exception' | ||
Exception: unknown exception | ||||
Yuya Nishihara
|
r32061 | |||
Jun Wu
|
r32112 | Workers should not do cleanups in all cases | ||
$ cat > $TESTTMP/detectcleanup.py <<EOF | ||||
> from __future__ import absolute_import | ||||
> import atexit | ||||
> import os | ||||
Gregory Szorc
|
r44575 | > import sys | ||
Jun Wu
|
r32112 | > import time | ||
Gregory Szorc
|
r44575 | > sys.unraisablehook = lambda x: None | ||
Jun Wu
|
r32112 | > oldfork = os.fork | ||
> count = 0 | ||||
> parentpid = os.getpid() | ||||
> def delayedfork(): | ||||
> global count | ||||
> count += 1 | ||||
> pid = oldfork() | ||||
> # make it easier to test SIGTERM hitting other workers when they have | ||||
> # not set up error handling yet. | ||||
> if count > 1 and pid == 0: | ||||
> time.sleep(0.1) | ||||
> return pid | ||||
> os.fork = delayedfork | ||||
> def cleanup(): | ||||
> if os.getpid() != parentpid: | ||||
> os.write(1, 'should never happen\n') | ||||
> atexit.register(cleanup) | ||||
> EOF | ||||
$ hg --config "extensions.t=$abspath" --config worker.numcpus=8 --config \ | ||||
> "extensions.d=$TESTTMP/detectcleanup.py" test 100000 abort | ||||
start | ||||
abort: known exception | ||||
[255] | ||||
Jan Alexander Steffens (heftig)
|
r44751 | Do not crash on partially read result | ||
$ cat > $TESTTMP/detecttruncated.py <<EOF | ||||
> from __future__ import absolute_import | ||||
> import os | ||||
> import sys | ||||
> import time | ||||
> sys.unraisablehook = lambda x: None | ||||
> oldwrite = os.write | ||||
> def splitwrite(fd, string): | ||||
> ret = oldwrite(fd, string[:9]) | ||||
> if ret == 9: | ||||
> time.sleep(0.1) | ||||
> ret += oldwrite(fd, string[9:]) | ||||
> return ret | ||||
> os.write = splitwrite | ||||
> EOF | ||||
$ hg --config "extensions.t=$abspath" --config worker.numcpus=8 --config \ | ||||
> "extensions.d=$TESTTMP/detecttruncated.py" test 100000.0 | ||||
start | ||||
run | ||||
run | ||||
run | ||||
run | ||||
run | ||||
run | ||||
run | ||||
run | ||||
done | ||||
Yuya Nishihara
|
r32061 | #endif | ||