diff --git a/tests/containers.py b/tests/containers.py
index cb0edc9ddc82bc684c7bc81d39de58acf838a6a5..0ea3070cb52f7ba8d250933760603d97e5d5bc28 100755
--- a/tests/containers.py
+++ b/tests/containers.py
@@ -78,9 +78,11 @@ SteamOS 2 'brewmaster', Debian 8 'jessie', Ubuntu 14.04 'trusty'.
 """
 
 import contextlib
+import fcntl
 import logging
 import os
 import shutil
+import struct
 import subprocess
 import sys
 import tempfile
@@ -335,6 +337,7 @@ class TestContainers(BaseTest):
         scout: str,
         *,
         copy: bool = False,
+        gc: bool = True,
         locales: bool = False,
         only_prepare: bool = False
     ) -> None:
@@ -366,6 +369,9 @@ class TestContainers(BaseTest):
             if copy:
                 argv.extend(['--copy-runtime-into', temp])
 
+                if not gc:
+                    argv.append('--no-gc-runtimes')
+
             if only_prepare:
                 argv.append('--only-prepare')
             else:
@@ -378,9 +384,38 @@ class TestContainers(BaseTest):
                     os.path.join(self.artifacts, 'tmp', 'inside-scout.py'),
                 ])
 
-            with tee_file_and_stderr(
+            # Create directories representing previous runs of
+            # pressure-vessel-wrap, so that we can assert that they are
+            # GC'd (or not) as desired.
+
+            # Do not delete because its name does not start with tmp-
+            os.makedirs(os.path.join(temp, 'donotdelete'), exist_ok=True)
+            # Delete
+            os.makedirs(os.path.join(temp, 'tmp-deleteme'), exist_ok=True)
+            # Delete, and assert that it is recursive
+            os.makedirs(
+                os.path.join(temp, 'tmp-deleteme2', 'usr', 'lib'),
+                exist_ok=True,
+            )
+            # Do not delete because it has ./keep
+            os.makedirs(os.path.join(temp, 'tmp-keep', 'keep'), exist_ok=True)
+            # Do not delete because we will read-lock .ref
+            os.makedirs(os.path.join(temp, 'tmp-rlock'), exist_ok=True)
+            # Do not delete because we will write-lock .ref
+            os.makedirs(os.path.join(temp, 'tmp-wlock'), exist_ok=True)
+
+            with open(
+                os.path.join(temp, 'tmp-rlock', '.ref'), 'w+'
+            ) as rlock_writer, open(
+                os.path.join(temp, 'tmp-wlock', '.ref'), 'w'
+            ) as wlock_writer, tee_file_and_stderr(
                 os.path.join(artifacts, 'inside-scout.log')
             ) as tee:
+                lockdata = struct.pack('hhlli', fcntl.F_RDLCK, 0, 0, 0, 0)
+                fcntl.fcntl(rlock_writer.fileno(), fcntl.F_SETLKW, lockdata)
+                lockdata = struct.pack('hhlli', fcntl.F_WRLCK, 0, 0, 0, 0)
+                fcntl.fcntl(wlock_writer.fileno(), fcntl.F_SETLKW, lockdata)
+
                 completed = self.run_subprocess(
                     argv,
                     cwd=self.artifacts,
@@ -393,7 +428,29 @@ class TestContainers(BaseTest):
 
             if copy:
                 members = set(os.listdir(temp))
+
+                self.assertIn('.ref', members)
+                self.assertIn('donotdelete', members)
+                self.assertIn('tmp-keep', members)
+                self.assertIn('tmp-rlock', members)
+                self.assertIn('tmp-wlock', members)
+                if gc:
+                    self.assertNotIn('tmp-deleteme', members)
+                    self.assertNotIn('tmp-deleteme2', members)
+                else:
+                    # These would have been deleted if not for --no-gc-runtimes
+                    self.assertIn('tmp-deleteme', members)
+                    self.assertIn('tmp-deleteme2', members)
+
                 members.discard('.ref')
+                members.discard('donotdelete')
+                members.discard('tmp-deleteme')
+                members.discard('tmp-deleteme2')
+                members.discard('tmp-keep')
+                members.discard('tmp-rlock')
+                members.discard('tmp-wlock')
+                # After discarding those, there should be exactly one left:
+                # the one we just created
                 self.assertEqual(len(members), 1)
                 tree = os.path.join(temp, members.pop())
 
@@ -429,7 +486,7 @@ class TestContainers(BaseTest):
             )
 
         with self.subTest('copy'):
-            self._test_scout('scout_sysroot_copy', scout, copy=True)
+            self._test_scout('scout_sysroot_copy', scout, copy=True, gc=False)
 
         with self.subTest('transient'):
             self._test_scout('scout_sysroot', scout, locales=True)