self = <hypothesis.core.StateForActualGivenExecution object at 0x7f6aa40a4518>
data = ConjectureData(INTERESTING, 24 bytes, frozen)
def _execute_once_for_engine(self, data):
"""Wrapper around ``execute_once`` that intercepts test failure
exceptions and single-test control exceptions, and turns them into
appropriate method calls to `data` instead.
This allows the engine to assume that any exception other than
``StopTest`` must be a fatal error, and should stop the entire engine.
"""
try:
> result = self.execute_once(data)
.tox/py3/lib/python3.7/site-packages/hypothesis/core.py:656:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <hypothesis.core.StateForActualGivenExecution object at 0x7f6aa40a4518>
data = ConjectureData(INTERESTING, 24 bytes, frozen), print_example = False
is_final = False, expected_failure = None
def execute_once(
self, data, print_example=False, is_final=False, expected_failure=None
):
"""Run the test function once, using ``data`` as input.
If the test raises an exception, it will propagate through to the
caller of this method. Depending on its type, this could represent
an ordinary test failure, or a fatal error, or a control exception.
If this method returns normally, the test might have passed, or
it might have placed ``data`` in an unsuccessful state and then
swallowed the corresponding control exception.
"""
data.is_find = self.is_find
text_repr = [None]
if self.settings.deadline is None:
test = self.test
else:
@proxies(self.test)
def test(*args, **kwargs):
self.__test_runtime = None
initial_draws = len(data.draw_times)
start = perf_counter()
result = self.test(*args, **kwargs)
finish = perf_counter()
internal_draw_time = sum(data.draw_times[initial_draws:])
runtime = datetime.timedelta(
seconds=finish - start - internal_draw_time
)
self.__test_runtime = runtime
current_deadline = self.settings.deadline
if not is_final:
current_deadline = (current_deadline // 4) * 5
if runtime >= current_deadline:
raise DeadlineExceeded(runtime, self.settings.deadline)
return result
def run(data):
# Set up dynamic context needed by a single test run.
with local_settings(self.settings):
with deterministic_PRNG():
with BuildContext(data, is_final=is_final):
# Generate all arguments to the test function.
args, kwargs = data.draw(self.search_strategy)
if expected_failure is not None:
text_repr[0] = arg_string(test, args, kwargs)
if print_example or current_verbosity() >= Verbosity.verbose:
output = StringIO()
printer = RepresentationPrinter(output)
if print_example:
printer.text("Falsifying example:")
else:
printer.text("Trying example:")
if self.print_given_args:
printer.text(" ")
printer.text(test.__name__)
with printer.group(indent=4, open="(", close=""):
printer.break_()
for v in args:
printer.pretty(v)
# We add a comma unconditionally because
# generated arguments will always be
# kwargs, so there will always be more
# to come.
printer.text(",")
printer.breakable()
# We need to make sure to print these in the argument order for
# Python 2 and older versionf of Python 3.5. In modern versions
# this isn't an issue because kwargs is ordered.
arg_order = {
v: i
for i, v in enumerate(
getfullargspec(self.test).args
)
}
for i, (k, v) in enumerate(
sorted(
kwargs.items(),
key=lambda t: (
arg_order.get(t[0], float("inf")),
t[0],
),
)
):
printer.text(k)
printer.text("=")
printer.pretty(v)
printer.text(",")
if i + 1 < len(kwargs):
printer.breakable()
printer.break_()
printer.text(")")
printer.flush()
report(output.getvalue())
return test(*args, **kwargs)
# Run the test function once, via the executor hook.
# In most cases this will delegate straight to `run(data)`.
> result = self.test_runner(data, run)
.tox/py3/lib/python3.7/site-packages/hypothesis/core.py:611:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
data = ConjectureData(INTERESTING, 24 bytes, frozen)
function = <function StateForActualGivenExecution.execute_once.<locals>.run at 0x7f69efa5a048>
def default_new_style_executor(data, function):
> return function(data)
.tox/py3/lib/python3.7/site-packages/hypothesis/executors.py:52:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
data = ConjectureData(INTERESTING, 24 bytes, frozen)
def run(data):
# Set up dynamic context needed by a single test run.
with local_settings(self.settings):
with deterministic_PRNG():
with BuildContext(data, is_final=is_final):
# Generate all arguments to the test function.
args, kwargs = data.draw(self.search_strategy)
if expected_failure is not None:
text_repr[0] = arg_string(test, args, kwargs)
if print_example or current_verbosity() >= Verbosity.verbose:
output = StringIO()
printer = RepresentationPrinter(output)
if print_example:
printer.text("Falsifying example:")
else:
printer.text("Trying example:")
if self.print_given_args:
printer.text(" ")
printer.text(test.__name__)
with printer.group(indent=4, open="(", close=""):
printer.break_()
for v in args:
printer.pretty(v)
# We add a comma unconditionally because
# generated arguments will always be
# kwargs, so there will always be more
# to come.
printer.text(",")
printer.breakable()
# We need to make sure to print these in the argument order for
# Python 2 and older versionf of Python 3.5. In modern versions
# this isn't an issue because kwargs is ordered.
arg_order = {
v: i
for i, v in enumerate(
getfullargspec(self.test).args
)
}
for i, (k, v) in enumerate(
sorted(
kwargs.items(),
key=lambda t: (
arg_order.get(t[0], float("inf")),
t[0],
),
)
):
printer.text(k)
printer.text("=")
printer.pretty(v)
printer.text(",")
if i + 1 < len(kwargs):
printer.breakable()
printer.break_()
printer.text(")")
printer.flush()
report(output.getvalue())
> return test(*args, **kwargs)
.tox/py3/lib/python3.7/site-packages/hypothesis/core.py:607:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
swh_storage = <swh.storage.validate.ValidatingProxyStorage object at 0x7f6aa4128be0>
branch_name = b'v'
branch_target = SnapshotBranch(target=b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', target_type=<TargetType.CONTENT: 'content'>)
@given(branch_name=branch_names(), branch_target=branch_targets(only_objects=True))
> def test_snapshot_large(swh_storage, branch_name, branch_target): # noqa
.tox/py3/lib/python3.7/site-packages/swh/storage/tests/algos/test_snapshot.py:25:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
args = (<swh.storage.validate.ValidatingProxyStorage object at 0x7f6aa4128be0>, b'v', SnapshotBranch(target=b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', target_type=<TargetType.CONTENT: 'content'>))
kwargs = {}, initial_draws = 1, start = 1636662.227651956
@proxies(self.test)
def test(*args, **kwargs):
self.__test_runtime = None
initial_draws = len(data.draw_times)
start = perf_counter()
> result = self.test(*args, **kwargs)
.tox/py3/lib/python3.7/site-packages/hypothesis/core.py:531:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
swh_storage = <swh.storage.validate.ValidatingProxyStorage object at 0x7f6aa4128be0>
branch_name = b'v'
branch_target = {'target': b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', 'target_type': 'content'}
@given(branch_name=branch_names(), branch_target=branch_targets(only_objects=True))
def test_snapshot_large(swh_storage, branch_name, branch_target): # noqa
branch_target = branch_target.to_dict()
snapshot = {
"branches": {b"%s%05d" % (branch_name, i): branch_target for i in range(10000)}
}
snapshot["id"] = identifier_to_bytes(snapshot_identifier(snapshot))
> swh_storage.snapshot_add([snapshot])
.tox/py3/lib/python3.7/site-packages/swh/storage/tests/algos/test_snapshot.py:33:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <swh.storage.validate.ValidatingProxyStorage object at 0x7f6aa4128be0>
snapshots = [Snapshot(branches={b'v00000': SnapshotBranch(target=b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0...arget_type=<TargetType.CONTENT: 'content'>)}, id=b'$V\xb5\x06\xca\xc7\x1e~\x8c\xfc\xe7\xc7Z\x82\x93\xc8\xc6\x0cv\xca')]
def snapshot_add(self, snapshots: Iterable[Dict]) -> Dict:
with convert_validation_exceptions():
snapshots = [Snapshot.from_dict(s) for s in snapshots]
> return self.storage.snapshot_add(snapshots)
.tox/py3/lib/python3.7/site-packages/swh/storage/validate.py:90:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <swh.storage.in_memory.InMemoryStorage object at 0x7f6aa41356a0>
snapshots = <generator object InMemoryStorage.snapshot_add.<locals>.<genexpr> at 0x7f69f0725b88>
def snapshot_add(self, snapshots: Iterable[Snapshot]) -> Dict:
count = 0
snapshots = (snap for snap in snapshots if snap.id not in self._snapshots)
for snapshot in snapshots:
> self.journal_writer.snapshot_add([snapshot])
.tox/py3/lib/python3.7/site-packages/swh/storage/in_memory.py:538:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <swh.storage.writer.JournalWriter object at 0x7f6aa40a4898>
snapshots = [Snapshot(branches={b'v00000': SnapshotBranch(target=b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0...arget_type=<TargetType.CONTENT: 'content'>)}, id=b'$V\xb5\x06\xca\xc7\x1e~\x8c\xfc\xe7\xc7Z\x82\x93\xc8\xc6\x0cv\xca')]
def snapshot_add(self, snapshots: Iterable[Snapshot]) -> None:
> self.write_additions("snapshot", snapshots)
.tox/py3/lib/python3.7/site-packages/swh/storage/writer.py:76:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <swh.storage.writer.JournalWriter object at 0x7f6aa40a4898>
obj_type = 'snapshot'
values = [Snapshot(branches={b'v00000': SnapshotBranch(target=b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0...arget_type=<TargetType.CONTENT: 'content'>)}, id=b'$V\xb5\x06\xca\xc7\x1e~\x8c\xfc\xe7\xc7Z\x82\x93\xc8\xc6\x0cv\xca')]
def write_additions(self, obj_type, values) -> None:
if self.journal:
> self.journal.write_additions(obj_type, values)
.tox/py3/lib/python3.7/site-packages/swh/storage/writer.py:47:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <swh.journal.writer.inmemory.InMemoryJournalWriter object at 0x7f69ff8632e8>
object_type = 'snapshot'
objects = [Snapshot(branches={b'v00000': SnapshotBranch(target=b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0...arget_type=<TargetType.CONTENT: 'content'>)}, id=b'$V\xb5\x06\xca\xc7\x1e~\x8c\xfc\xe7\xc7Z\x82\x93\xc8\xc6\x0cv\xca')]
def write_additions(self, object_type: str, objects: List[ModelObject]) -> None:
for object_ in objects:
> self.write_addition(object_type, object_)
.tox/py3/lib/python3.7/site-packages/swh/journal/writer/inmemory.py:32:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <swh.journal.writer.inmemory.InMemoryJournalWriter object at 0x7f69ff8632e8>
object_type = 'snapshot'
object_ = Snapshot(branches={b'v00000': SnapshotBranch(target=b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00...target_type=<TargetType.CONTENT: 'content'>)}, id=b'$V\xb5\x06\xca\xc7\x1e~\x8c\xfc\xe7\xc7Z\x82\x93\xc8\xc6\x0cv\xca')
def write_addition(self, object_type: str, object_: ModelObject) -> None:
assert isinstance(object_, BaseModel)
> self.objects.append((object_type, object_))
.tox/py3/lib/python3.7/site-packages/swh/journal/writer/inmemory.py:26:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <ListProxy object, typeid 'list' at 0x7f6aa46f1ac8>
args = (('snapshot', Snapshot(branches={b'v00000': SnapshotBranch(target=b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x...get_type=<TargetType.CONTENT: 'content'>)}, id=b'$V\xb5\x06\xca\xc7\x1e~\x8c\xfc\xe7\xc7Z\x82\x93\xc8\xc6\x0cv\xca')),)
kwds = {}
> ???
<string>:2:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <ListProxy object, typeid 'list' at 0x7f6aa46f1ac8>
methodname = 'append'
args = (('snapshot', Snapshot(branches={b'v00000': SnapshotBranch(target=b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x...get_type=<TargetType.CONTENT: 'content'>)}, id=b'$V\xb5\x06\xca\xc7\x1e~\x8c\xfc\xe7\xc7Z\x82\x93\xc8\xc6\x0cv\xca')),)
kwds = {}
def _callmethod(self, methodname, args=(), kwds={}):
'''
Try to call a method of the referrent and return a copy of the result
'''
try:
conn = self._tls.connection
except AttributeError:
util.debug('thread %r does not own a connection',
threading.current_thread().name)
self._connect()
conn = self._tls.connection
> conn.send((self._id, methodname, args, kwds))
/usr/lib/python3.7/multiprocessing/managers.py:795:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <multiprocessing.connection.Connection object at 0x7f69f7c22c88>
obj = ('7f6abc425408', 'append', (('snapshot', Snapshot(branches={b'v00000': SnapshotBranch(target=b'\x00\x00\x00\x00\x00\x0...ype=<TargetType.CONTENT: 'content'>)}, id=b'$V\xb5\x06\xca\xc7\x1e~\x8c\xfc\xe7\xc7Z\x82\x93\xc8\xc6\x0cv\xca')),), {})
def send(self, obj):
"""Send a (picklable) object"""
self._check_closed()
self._check_writable()
> self._send_bytes(_ForkingPickler.dumps(obj))
/usr/lib/python3.7/multiprocessing/connection.py:206:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <multiprocessing.connection.Connection object at 0x7f69f7c22c88>
buf = <memory at 0x7f6a000aa648>
def _send_bytes(self, buf):
n = len(buf)
# For wire compatibility with 3.2 and lower
header = struct.pack("!i", n)
if n > 16384:
# The payload is large so Nagle's algorithm won't be triggered
# and we'd better avoid the cost of concatenation.
> self._send(header)
/usr/lib/python3.7/multiprocessing/connection.py:397:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <multiprocessing.connection.Connection object at 0x7f69f7c22c88>
buf = b'\x00\x05\xf1\xe1', write = <built-in function write>
def _send(self, buf, write=_write):
remaining = len(buf)
while True:
> n = write(self._handle, buf)
E BrokenPipeError: [Errno 32] Broken pipe
/usr/lib/python3.7/multiprocessing/connection.py:368: BrokenPipeError
During handling of the above exception, another exception occurred:
swh_storage = <swh.storage.validate.ValidatingProxyStorage object at 0x7f6aa4128be0>
@given(branch_name=branch_names(), branch_target=branch_targets(only_objects=True))
> def test_snapshot_large(swh_storage, branch_name, branch_target): # noqa
.tox/py3/lib/python3.7/site-packages/swh/storage/tests/algos/test_snapshot.py:25:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
.tox/py3/lib/python3.7/site-packages/hypothesis/core.py:708: in _execute_once_for_engine
data.mark_interesting((type(e), filename, lineno))
.tox/py3/lib/python3.7/site-packages/hypothesis/internal/conjecture/data.py:1060: in mark_interesting
self.conclude_test(Status.INTERESTING, interesting_origin)
.tox/py3/lib/python3.7/site-packages/hypothesis/internal/conjecture/data.py:1056: in conclude_test
self.freeze()
.tox/py3/lib/python3.7/site-packages/hypothesis/internal/conjecture/data.py:984: in freeze
self.observer.conclude_test(self.status, self.interesting_origin)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <hypothesis.internal.conjecture.datatree.TreeRecordingObserver object at 0x7f69ef7e8b00>
status = Status.INTERESTING
interesting_origin = (<class 'BrokenPipeError'>, '/usr/lib/python3.7/multiprocessing/connection.py', 368)
def conclude_test(self, status, interesting_origin):
"""Says that ``status`` occurred at node ``node``. This updates the
node if necessary and checks for consistency."""
if status == Status.OVERRUN:
return
i = self.__index_in_current_node
node = self.__current_node
if i < len(node.values) or isinstance(node.transition, Branch):
inconsistent_generation()
new_transition = conclusion(status, interesting_origin)
if node.transition is not None and node.transition != new_transition:
# As an, I'm afraid, horrible bodge, we deliberately ignore flakiness
# where tests go from interesting to valid, because it's much easier
# to produce good error messages for these further up the stack.
if isinstance(node.transition, Conclusion) and (
node.transition.status != Status.INTERESTING
or new_transition.status != Status.VALID
):
raise Flaky(
"Inconsistent test results! Test case was %r on first run but %r on second"
> % (node.transition, new_transition)
)
E hypothesis.errors.Flaky: Inconsistent test results! Test case was Conclusion(status=Status.INTERESTING, interesting_origin=(<class 'EOFError'>, '/usr/lib/python3.7/multiprocessing/connection.py', 383)) on first run but Conclusion(status=Status.INTERESTING, interesting_origin=(<class 'BrokenPipeError'>, '/usr/lib/python3.7/multiprocessing/connection.py', 368)) on second
.tox/py3/lib/python3.7/site-packages/hypothesis/internal/conjecture/datatree.py:422: Flaky
TEST RESULT
TEST RESULT
- Run At
- Jun 3 2020, 12:37 PM