From 2e4711c611896ae6490d3fa3f8d0c506f2ff3673 Mon Sep 17 00:00:00 2001
From: Adam Johnson <me@adamj.eu>
Date: Fri, 21 May 2021 10:36:37 +0100
Subject: [PATCH] Made SerializeMixin check lockfile attr at import time.

---
 django/test/testcases.py                |  7 +++++--
 tests/test_utils/test_serializemixin.py | 21 +++++++++++++++++++++
 2 files changed, 26 insertions(+), 2 deletions(-)
 create mode 100644 tests/test_utils/test_serializemixin.py

diff --git a/django/test/testcases.py b/django/test/testcases.py
index 53508cdb8a..ec5363b4ea 100644
--- a/django/test/testcases.py
+++ b/django/test/testcases.py
@@ -1624,12 +1624,15 @@ class SerializeMixin:
     """
     lockfile = None
 
-    @classmethod
-    def setUpClass(cls):
+    def __init_subclass__(cls, /, **kwargs):
+        super().__init_subclass__(**kwargs)
         if cls.lockfile is None:
             raise ValueError(
                 "{}.lockfile isn't set. Set it to a unique value "
                 "in the base class.".format(cls.__name__))
+
+    @classmethod
+    def setUpClass(cls):
         cls._lockfile = open(cls.lockfile)
         locks.lock(cls._lockfile, locks.LOCK_EX)
         super().setUpClass()
diff --git a/tests/test_utils/test_serializemixin.py b/tests/test_utils/test_serializemixin.py
new file mode 100644
index 0000000000..662ba71ca0
--- /dev/null
+++ b/tests/test_utils/test_serializemixin.py
@@ -0,0 +1,21 @@
+from django.test import SimpleTestCase
+from django.test.testcases import SerializeMixin
+
+
+class TestSerializeMixin(SimpleTestCase):
+    def test_init_without_lockfile(self):
+        msg = (
+            "ExampleTests.lockfile isn't set. Set it to a unique value in the "
+            "base class."
+        )
+        with self.assertRaisesMessage(ValueError, msg):
+            class ExampleTests(SerializeMixin, SimpleTestCase):
+                pass
+
+
+class TestSerializeMixinUse(SerializeMixin, SimpleTestCase):
+    lockfile = __file__
+
+    def test_usage(self):
+        # Running this test ensures that the lock/unlock functions have passed.
+        pass