fix: bound HTTP2 soak resources and cleanup
This commit is contained in:
65
scripts/verifyHTTP2_test.py
Normal file
65
scripts/verifyHTTP2_test.py
Normal file
@@ -0,0 +1,65 @@
|
||||
"""Regression checks for stress-container cleanup on failure and interruption."""
|
||||
|
||||
import contextlib
|
||||
import importlib.util
|
||||
import io
|
||||
from pathlib import Path
|
||||
import signal
|
||||
import subprocess
|
||||
import sys
|
||||
import unittest
|
||||
from unittest.mock import patch
|
||||
|
||||
|
||||
spec = importlib.util.spec_from_file_location("http2Runner", Path(__file__).with_name("verifyHTTP2.py"))
|
||||
runner = importlib.util.module_from_spec(spec)
|
||||
spec.loader.exec_module(runner)
|
||||
|
||||
|
||||
class CleanupTests(unittest.TestCase):
|
||||
def testFailedRunsCleanUpOnlyTheirOwnContainer(self):
|
||||
failures = (
|
||||
subprocess.TimeoutExpired("docker", 1),
|
||||
KeyboardInterrupt(),
|
||||
subprocess.CompletedProcess([], 7),
|
||||
)
|
||||
for failure in failures:
|
||||
with self.subTest(failure=type(failure).__name__):
|
||||
calls = []
|
||||
original_handlers = {sig: signal.getsignal(sig) for sig in (signal.SIGTERM, signal.SIGHUP)}
|
||||
|
||||
def execute(command, **kwargs):
|
||||
calls.append(command)
|
||||
if command[1] == "run":
|
||||
if isinstance(failure, BaseException):
|
||||
raise failure
|
||||
return failure
|
||||
return subprocess.CompletedProcess(command, 0, "", "")
|
||||
|
||||
with patch.object(sys, "argv", ["verifyHTTP2.py", "--duration", "1s"]), \
|
||||
patch.object(runner.shutil, "which", return_value="/fake/docker"), \
|
||||
patch.object(runner.subprocess, "run", side_effect=execute), \
|
||||
contextlib.redirect_stdout(io.StringIO()):
|
||||
with self.assertRaises(SystemExit) as raised:
|
||||
runner.main()
|
||||
self.assertNotEqual(raised.exception.code, 0)
|
||||
name = calls[0][calls[0].index("--name") + 1]
|
||||
self.assertEqual(calls[1:], [["/fake/docker", "rm", "--force", name]])
|
||||
self.assertEqual(original_handlers, {sig: signal.getsignal(sig) for sig in original_handlers})
|
||||
|
||||
def testCleanupFailureIsNotReportedAsPass(self):
|
||||
results = [
|
||||
subprocess.CompletedProcess([], 0),
|
||||
subprocess.CompletedProcess([], 1, "", "Cannot connect to the Docker daemon"),
|
||||
]
|
||||
with patch.object(sys, "argv", ["verifyHTTP2.py", "--duration", "1s"]), \
|
||||
patch.object(runner.shutil, "which", return_value="/fake/docker"), \
|
||||
patch.object(runner.subprocess, "run", side_effect=results), \
|
||||
contextlib.redirect_stdout(io.StringIO()) as output:
|
||||
with self.assertRaisesRegex(SystemExit, "Could not clean up"):
|
||||
runner.main()
|
||||
self.assertNotIn("PASS", output.getvalue())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user