From 0a1e365ed1ea1832dcf58e0b3fc934ad2d4c757a Mon Sep 17 00:00:00 2001 From: Itamar Turner-Trauring Date: Wed, 29 Jul 2020 14:46:49 -0400 Subject: [PATCH] Tests for gcutil. --- src/allmydata/test/test_iputil.py | 33 ++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/allmydata/test/test_iputil.py b/src/allmydata/test/test_iputil.py index c6caed7f9..06ab13f39 100644 --- a/src/allmydata/test/test_iputil.py +++ b/src/allmydata/test/test_iputil.py @@ -14,6 +14,7 @@ if PY2: from builtins import filter, map, zip, ascii, chr, hex, input, next, oct, open, pow, round, super, bytes, dict, int, list, object, range, str, max, min # noqa: F401 import re, errno, subprocess, os, socket +import gc from twisted.trial import unittest @@ -21,7 +22,7 @@ from tenacity import retry, stop_after_attempt from foolscap.api import Tub -from allmydata.util import iputil +from allmydata.util import iputil, gcutil import allmydata.test.common_py3 as testutil from allmydata.util.namespace import Namespace @@ -228,3 +229,33 @@ class ListenOnUsed(unittest.TestCase): s.close() port2 = iputil.listenOnUnused(tub, port) self.assertEqual(port, port2) + + +class GcUtil(unittest.TestCase): + """Tests for allmydata.util.gcutil, which is used only by listenOnUnused.""" + + def test_gc_after_allocations(self): + """The resource tracker triggers allocations every 26 allocations.""" + collections = [] + self.patch(gc, "collect", lambda: collections.append(1)) + for _ in range(2): + for _ in range(25): + gcutil.fileDescriptorResource.allocate() + self.assertEqual(len(collections), 0) + gcutil.fileDescriptorResource.allocate() + self.assertEqual(len(collections), 1) + del collections[:] + + def test_release_delays_gc(self): + """Releasing a file descriptor resource delays GC collection.""" + collections = [] + self.patch(gc, "collect", lambda: collections.append(1)) + for _ in range(2): + gcutil.fileDescriptorResource.allocate() + for _ in range(3): + gcutil.fileDescriptorResource.release() + for _ in range(25): + gcutil.fileDescriptorResource.allocate() + self.assertEqual(len(collections), 0) + gcutil.fileDescriptorResource.allocate() + self.assertEqual(len(collections), 1)