Commit c00d94c7 authored by Kirill Smelkov's avatar Kirill Smelkov

X workaround lack of exception chaining on Python2 with xdefer

parent 49e73a6d
...@@ -33,7 +33,7 @@ from persistent import Persistent ...@@ -33,7 +33,7 @@ from persistent import Persistent
from persistent.timestamp import TimeStamp from persistent.timestamp import TimeStamp
from ZODB.utils import z64 from ZODB.utils import z64
import os, os.path, subprocess, threading import sys, os, os.path, subprocess, threading, inspect, traceback
from errno import EINVAL from errno import EINVAL
from golang import chan, func, defer, select from golang import chan, func, defer, select
from golang import context, sync, time from golang import context, sync, time
...@@ -76,6 +76,36 @@ def teardown_function(f): ...@@ -76,6 +76,36 @@ def teardown_function(f):
os.rmdir(testmntpt) os.rmdir(testmntpt)
# xdefer is like defer, but makes sure exception raised before deferred
# function is called is not lost.
#
# if deferred function raises exception itself - it prints previous exception to stderr.
#
# XXX xdefer is workaround for Python2 not having exception chanining (PEP 3134)
# without which, if e.g. tDB.close() raises exception, it prevents to see
# whether and which an assert in the test failed.
#
# XXX merge into defer?
def xdefer(f):
# hack - imitate as if defer called from under xdefer was called directly by caller func
fgo = inspect.currentframe().f_back.f_back
__goframe__ = fgo.f_locals['__goframe__']
_xdefer(f)
def _xdefer(f):
def _():
# call f, but print previous exception if f raises
exc_type, exc_value, exc_traceback = sys.exc_info()
try:
f()
except:
traceback.print_exception(exc_type, exc_value, exc_traceback)
raise
defer(_)
# ---- test join/autostart ---- # ---- test join/autostart ----
# test that zurl does not change from one open to another storage open. # test that zurl does not change from one open to another storage open.
...@@ -94,14 +124,14 @@ def test_join(): ...@@ -94,14 +124,14 @@ def test_join():
wcfs.join(zurl, autostart=False) wcfs.join(zurl, autostart=False)
wc = wcfs._start(zurl) wc = wcfs._start(zurl)
defer(wc.close) xdefer(wc.close)
assert wc.mountpoint == testmntpt assert wc.mountpoint == testmntpt
assert readfile(wc.mountpoint + "/.wcfs/zurl") == zurl assert readfile(wc.mountpoint + "/.wcfs/zurl") == zurl
assert os.path.isdir(wc.mountpoint + "/head") assert os.path.isdir(wc.mountpoint + "/head")
assert os.path.isdir(wc.mountpoint + "/head/bigfile") assert os.path.isdir(wc.mountpoint + "/head/bigfile")
wc2 = wcfs.join(zurl, autostart=False) wc2 = wcfs.join(zurl, autostart=False)
defer(wc2.close) xdefer(wc2.close)
assert wc2.mountpoint == wc.mountpoint assert wc2.mountpoint == wc.mountpoint
# test that join(autostart=y) works. # test that join(autostart=y) works.
...@@ -112,7 +142,7 @@ def test_join_autostart(): ...@@ -112,7 +142,7 @@ def test_join_autostart():
wcfs.join(zurl, autostart=False) wcfs.join(zurl, autostart=False)
wc = wcfs.join(zurl, autostart=True) wc = wcfs.join(zurl, autostart=True)
defer(wc.close) xdefer(wc.close)
assert wc.mountpoint == testmntpt assert wc.mountpoint == testmntpt
assert readfile(wc.mountpoint + "/.wcfs/zurl") == zurl assert readfile(wc.mountpoint + "/.wcfs/zurl") == zurl
assert os.path.isdir(wc.mountpoint + "/head") assert os.path.isdir(wc.mountpoint + "/head")
...@@ -764,12 +794,11 @@ def _expectPin(w, ctx, zf, expect): ...@@ -764,12 +794,11 @@ def _expectPin(w, ctx, zf, expect):
return reqv return reqv
# test_wcfs exercises wcfs functionality. # test_wcfs exercises wcfs functionality.
@func @func
def test_wcfs(): def test_wcfs():
t = tDB() t = tDB()
defer(t.close) xdefer(t.close)
t.root['!file'] = nonfile = Persistent() t.root['!file'] = nonfile = Persistent()
t.root['zfile'] = zf = ZBigFile(blksize) t.root['zfile'] = zf = ZBigFile(blksize)
...@@ -850,11 +879,7 @@ def test_wcfs(): ...@@ -850,11 +879,7 @@ def test_wcfs():
# XXX -> separate test? # XXX -> separate test?
w = t.openwatch() w = t.openwatch()
print('\n\nzzzzzzz\n\n') print('\n\nzzzzzzz\n\n')
try: assert w.sendReq(context.background(), b'bla bla') == ""
assert w.sendReq(context.background(), b'bla bla') == ""
except:
#import traceback; traceback.print_exc()
raise
# assert w closed # assert w closed
print('\n\n0000000\n\n') print('\n\n0000000\n\n')
...@@ -919,21 +944,17 @@ def test_wcfs(): ...@@ -919,21 +944,17 @@ def test_wcfs():
@func @func
def test_wcfs_invproto(): def test_wcfs_invproto():
# XXX temp debug # XXX temp debug
import sys, traceback
"""
def _(): def _():
print('BBB') print('BBB')
1/0 1/0
defer(_) xdefer(_)
"""
#raise RuntimeError('zzz') #raise RuntimeError('zzz')
try: print('\nAAA')
print('\nAAA') assert 1 == 2
assert 1 == 2
finally:
2/0
# ---- misc --- # ---- misc ---
...@@ -957,7 +978,7 @@ def tidtime(tid): ...@@ -957,7 +978,7 @@ def tidtime(tid):
@func @func
def test_tidtime_notrough(): def test_tidtime_notrough():
t = tDB() t = tDB()
defer(t.close) xdefer(t.close)
atprev = t.commit() atprev = t.commit()
for i in range(10): for i in range(10):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment