racetest: Show relevant details about storage state on failure
Suggested by @d-maurer. Example failure before this patch: Failure in test check_race_load_vs_external_invalidate (ZEO.tests.testZEO.BlobAdaptedFileStorageTests) Traceback (most recent call last): File "/usr/lib/python2.7/unittest/case.py", line 329, in run testMethod() File "/home/kirr/src/wendelin/z/ZODB/src/ZODB/tests/racetest.py", line 200, in check_race_load_vs_external_invalidate return self._check_race_load_vs_external_invalidate(T2ObjectsInc()) File "/home/kirr/src/wendelin/z/ZODB/src/ZODB/tests/util.py", line 400, in _ return f(*argv, **kw) File "/home/kirr/src/wendelin/z/ZODB/src/ZODB/tests/racetest.py", line 304, in _check_race_load_vs_external_invalidate self.fail([_ for _ in failure if _]) File "/usr/lib/python2.7/unittest/case.py", line 410, in fail raise self.failureException(msg) AssertionError: ['T3: obj1 (1) != obj2 (24)\n', 'T4: obj1 (1) != obj2 (24)\n', 'T5: obj1 (1) != obj2 (24)\n', 'T6: obj1 (1) != obj2 (24)\n', 'T7: obj1 (2) != obj2 (24)\n'] Example failure after this patch: Failure in test check_race_load_vs_external_invalidate (ZEO.tests.testZEO.BlobAdaptedFileStorageTests) Traceback (most recent call last): File "/usr/lib/python2.7/unittest/case.py", line 329, in run testMethod() File "/home/kirr/src/wendelin/z/ZODB/src/ZODB/tests/racetest.py", line 202, in check_race_load_vs_external_invalidate return self._check_race_load_vs_external_invalidate(T2ObjectsInc()) File "/home/kirr/src/wendelin/z/ZODB/src/ZODB/tests/util.py", line 400, in _ return f(*argv, **kw) File "/home/kirr/src/wendelin/z/ZODB/src/ZODB/tests/racetest.py", line 307, in _check_race_load_vs_external_invalidate self.fail('\n\n'.join([_ for _ in failure if _])) File "/usr/lib/python2.7/unittest/case.py", line 410, in fail raise self.failureException(msg) AssertionError: T0: obj1 (1) != obj2 (25) obj1._p_serial: 0x03ea4be4ea558066 obj2._p_serial: 0x03ea4be4eaac7077 zconn_at: 0x03ea4be4eaac7077 # approximated as max(serials) zstor.loadBefore(obj1, @zconn.at) -> serial: 0x03ea4be4ea558066 next_serial: None zstor.loadBefore(obj2, @zconn.at) -> serial: 0x03ea4be4eaac7077 next_serial: None zstor._cache.clear() zstor.loadBefore(obj1, @zconn.at) -> serial: 0x03ea4be4eaac7077 next_serial: None zstor.loadBefore(obj2, @zconn.at) -> serial: 0x03ea4be4eaac7077 next_serial: None T2: obj1 (1) != obj2 (25) obj1._p_serial: 0x03ea4be4ea558066 obj2._p_serial: 0x03ea4be4eaac7077 zconn_at: 0x03ea4be4eaac7077 # approximated as max(serials) zstor.loadBefore(obj1, @zconn.at) -> serial: 0x03ea4be4ea558066 next_serial: None zstor.loadBefore(obj2, @zconn.at) -> serial: 0x03ea4be4eaac7077 next_serial: None zstor._cache.clear() zstor.loadBefore(obj1, @zconn.at) -> serial: 0x03ea4be4eaac7077 next_serial: None zstor.loadBefore(obj2, @zconn.at) -> serial: 0x03ea4be4eaac7077 next_serial: None T3: obj1 (26) != obj2 (25) obj1._p_serial: 0x03ea4be4ec6af5cc obj2._p_serial: 0x03ea4be4eaac7077 zconn_at: 0x03ea4be4ec6af5cc # approximated as max(serials) zstor.loadBefore(obj1, @zconn.at) -> serial: 0x03ea4be4ec6af5cc next_serial: None zstor.loadBefore(obj2, @zconn.at) -> serial: 0x03ea4be4eaac7077 next_serial: 0x03ea4be4ec962b00 zstor._cache.clear() zstor.loadBefore(obj1, @zconn.at) -> serial: 0x03ea4be4ec6af5cc next_serial: 0x03ea4be4ec962b00 zstor.loadBefore(obj2, @zconn.at) -> serial: 0x03ea4be4ec6af5cc next_serial: 0x03ea4be4ec962b00
Showing
Please register or sign in to comment