On 2024/09/26 10:59, Yasuhito FUTATSUKI wrote:
> On 2024/09/26 7:43, Yasuhito FUTATSUKI wrote:
>> On 2024/09/26 6:43, Yasuhito FUTATSUKI wrote:
>>> However, if weakref for 'handler' object might still remain after
>>> the last strong reference is cleared, this test is incomplete and
>>> it should rewrite to a test based on sys.getrefcount().
>>
>> Or ensure that weakref is cleared by gc.
> I'm sorry, it is not correct. With gc.collect(), even there exists
> circular references, objects are cleared if those aren't refered
> by others.
>
> So the patch below breaks the tests themselves.
I rewrote those test by using sys.getrefcount() instead of weakref.ref()
Cheers,
--
Yasuhito FUTATSUKI <futat...@yf.bsdclub.org>
Index: subversion/bindings/swig/python/tests/repository.py
===================================================================
--- subversion/bindings/swig/python/tests/repository.py (revision 1920850)
+++ subversion/bindings/swig/python/tests/repository.py (working copy)
@@ -18,7 +18,7 @@
# under the License.
#
#
-import unittest, setup_path, os, sys, weakref
+import unittest, setup_path, os, sys
from sys import version_info # For Python version check
from io import BytesIO
from svn import core, repos, fs, delta
@@ -262,7 +262,7 @@ class SubversionRepositoryTestCase(unittest.TestCa
"trac/versioncontrol/tests/svnrepos.dump")
stream = open(dump_path, 'rb')
dsp = DumpStreamParser(stream, subpool)
- dsp_ref = weakref.ref(dsp)
+ dsp_refc = sys.getrefcount(dsp)
ptr, baton = repos.make_parse_fns3(dsp, subpool)
repos.parse_dumpstream3(stream, ptr, baton, False, is_cancelled)
self.assertEqual(self.cancel_calls, 76)
@@ -311,10 +311,11 @@ class SubversionRepositoryTestCase(unittest.TestCa
# _close_dumpstream should be invoked after 'baton' is removed.
self.assertEqual(False, stream.closed)
- del ptr, baton, subpool, dsp
+ del ptr, baton, subpool
self.assertEqual(True, stream.closed)
# Issue SVN-4918
- self.assertEqual(None, dsp_ref())
+ self.assertEqual(dsp_refc, sys.getrefcount(dsp))
+ del dsp
def test_parse_fns3_invalid_set_fulltext(self):
class DumpStreamParserSubclass(DumpStreamParser):
@@ -333,7 +334,7 @@ class SubversionRepositoryTestCase(unittest.TestCa
def test_parse_fns3_apply_textdelta_handler_refcount(self):
handler = lambda node_baton: None
- handler_ref = weakref.ref(handler)
+ handler_refc = sys.getrefcount(handler)
class ParseFns3(repos.ParseFns3):
def __init__(self, handler):
@@ -354,9 +355,10 @@ class SubversionRepositoryTestCase(unittest.TestCa
del ptr, baton, stream
self.assertIn('apply_textdelta', parser.called)
- self.assertNotEqual(None, handler_ref())
- del parser, handler, subpool, ParseFns3
- self.assertEqual(None, handler_ref())
+ self.assertNotEqual(handler_refc, sys.getrefcount(handler))
+ del parser, subpool, ParseFns3
+ self.assertEqual(handler_refc, sys.getrefcount(handler))
+ del handler
def test_get_logs(self):
"""Test scope of get_logs callbacks"""
@@ -412,17 +414,18 @@ class SubversionRepositoryTestCase(unittest.TestCa
subpool = Pool(pool)
root = fs.revision_root(self.fs, self.rev, subpool)
editor = repos.ChangeCollector(self.fs, root, subpool)
- editor_ref = weakref.ref(editor)
+ editor_refc = sys.getrefcount(editor)
e_ptr, e_baton = delta.make_editor(editor, subpool)
repos.replay(root, e_ptr, e_baton, subpool)
fs.close_root(root)
del root
- self.assertNotEqual(None, editor_ref())
+ self.assertNotEqual(editor_refc, sys.getrefcount(editor))
- del e_ptr, e_baton, editor
+ del e_ptr, e_baton
del subpool
- self.assertEqual(None, editor_ref())
+ self.assertEqual(editor_refc, sys.getrefcount(editor))
+ del editor
def test_replay_batons_refcounts(self):
"""Issue SVN-4917: check ref-count of batons created and used in
callbacks"""
@@ -456,7 +459,7 @@ class SubversionRepositoryTestCase(unittest.TestCa
def test_delta_editor_apply_textdelta_handler_refcount(self):
handler = lambda textdelta: None
- handler_ref = weakref.ref(handler)
+ handler_refc = sys.getrefcount(handler)
class Editor(delta.Editor):
def __init__(self, handler):
@@ -475,10 +478,11 @@ class SubversionRepositoryTestCase(unittest.TestCa
del e_ptr, e_baton
self.assertIn('apply_textdelta', editor.called)
- self.assertNotEqual(None, handler_ref())
- del root, editor, handler, Editor
+ self.assertNotEqual(handler_refc, sys.getrefcount(handler))
+ del root, editor, Editor
del subpool
- self.assertEqual(None, handler_ref())
+ self.assertEqual(handler_refc, sys.getrefcount(handler))
+ del handler
def test_retrieve_and_change_rev_prop(self):
"""Test playing with revprops"""