swig-py: Add test for repos.ParseFns3._close_dumpstream

* subversion/bindings/swig/python/tests/repository.py
  (DumpStreamParser.__init__): Add optional parameter stream
  (DumpStreamParser._close_dumpstream): New
  (DumpStreamParser.test_parse_fns3):
   Check if DumpStreamParser._close_dumpstream is invoked.

Patch by: jun66j5


git-svn-id: https://svn.apache.org/repos/asf/subversion/trunk@1912502 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/subversion/bindings/swig/python/tests/repository.py b/subversion/bindings/swig/python/tests/repository.py
index abf5d72..f1324ac 100644
--- a/subversion/bindings/swig/python/tests/repository.py
+++ b/subversion/bindings/swig/python/tests/repository.py
@@ -22,7 +22,7 @@
 from sys import version_info # For Python version check
 from io import BytesIO
 from svn import core, repos, fs, delta
-from svn.core import SubversionException
+from svn.core import SubversionException, Pool
 import utils
 
 class ChangeReceiver(delta.Editor):
@@ -40,9 +40,14 @@
     return textdelta_handler
 
 class DumpStreamParser(repos.ParseFns3):
-  def __init__(self):
+  def __init__(self, stream=None):
     repos.ParseFns3.__init__(self)
+    self.stream = stream
     self.ops = []
+  def _close_dumpstream(self):
+    if self.stream:
+      self.stream.close()
+      self.stream = None
   def magic_header_record(self, version, pool=None):
     self.ops.append((b"magic-header", version))
   def uuid_record(self, uuid, pool=None):
@@ -175,13 +180,14 @@
     def is_cancelled():
       self.cancel_calls += 1
       return None
+    pool = Pool()
+    subpool = Pool(pool)
     dump_path = os.path.join(os.path.dirname(sys.argv[0]),
         "trac/versioncontrol/tests/svnrepos.dump")
     stream = open(dump_path, 'rb')
-    dsp = DumpStreamParser()
-    ptr, baton = repos.make_parse_fns3(dsp)
+    dsp = DumpStreamParser(stream)
+    ptr, baton = repos.make_parse_fns3(dsp, subpool)
     repos.parse_dumpstream3(stream, ptr, baton, False, is_cancelled)
-    stream.close()
     self.assertEqual(self.cancel_calls, 76)
     expected_list = [
         (b"magic-header", 2),
@@ -226,6 +232,11 @@
     # the comparison list gets too long.
     self.assertEqual(dsp.ops[:len(expected_list)], expected_list)
 
+    # _close_dumpstream should be invoked after 'subpool' is destroyed
+    self.assertEqual(False, stream.closed)
+    del ptr, baton, subpool
+    self.assertEqual(True, stream.closed)
+
   def test_parse_fns3_invalid_set_fulltext(self):
     class DumpStreamParserSubclass(DumpStreamParser):
       def set_fulltext(self, node_baton):