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"""

Reply via email to