summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorSamriddha9619 <sumitkumartripathi0@gmail.com>2025-12-08 22:11:31 +0530
committerJacob Walls <jacobtylerwalls@gmail.com>2025-12-18 17:53:24 -0500
commit73c987eb3b6a96300f7238dff32caf53cafe2098 (patch)
tree61788abc88d4cc70e259fac8623016a998e645ec /tests
parent4702b36120ea4c736d3f6b5595496f96e0021e46 (diff)
Fixed #36701 -- Fixed memory leak in ModelState.
Diffstat (limited to 'tests')
-rw-r--r--tests/model_regress/models.py4
-rw-r--r--tests/model_regress/test_state.py26
2 files changed, 30 insertions, 0 deletions
diff --git a/tests/model_regress/models.py b/tests/model_regress/models.py
index 350850393a..2af882f20f 100644
--- a/tests/model_regress/models.py
+++ b/tests/model_regress/models.py
@@ -45,6 +45,10 @@ class Worker(models.Model):
return self.name
+class WorkerProfile(models.Model):
+ worker = models.OneToOneField(Worker, on_delete=models.CASCADE)
+
+
class NonAutoPK(models.Model):
name = models.CharField(max_length=10, primary_key=True)
diff --git a/tests/model_regress/test_state.py b/tests/model_regress/test_state.py
index 8b0f087829..8abcc58382 100644
--- a/tests/model_regress/test_state.py
+++ b/tests/model_regress/test_state.py
@@ -1,7 +1,33 @@
+import gc
+
from django.db.models.base import ModelState, ModelStateFieldsCacheDescriptor
from django.test import SimpleTestCase
+from django.test.utils import garbage_collect
+
+from .models import Worker, WorkerProfile
class ModelStateTests(SimpleTestCase):
def test_fields_cache_descriptor(self):
self.assertIsInstance(ModelState.fields_cache, ModelStateFieldsCacheDescriptor)
+
+ def test_one_to_one_field_cycle_collection(self):
+ self.addCleanup(gc.set_debug, gc.get_debug())
+ gc.set_debug(gc.DEBUG_SAVEALL)
+
+ def clear_garbage():
+ del gc.garbage[:]
+
+ self.addCleanup(clear_garbage)
+
+ worker = Worker()
+ profile = WorkerProfile(worker=worker)
+ worker_id = id(worker)
+
+ del worker
+ del profile
+
+ garbage_collect()
+
+ leaked = [obj for obj in gc.garbage if id(obj) == worker_id]
+ self.assertEqual(leaked, [])