54 lines
1.9 KiB
Python
54 lines
1.9 KiB
Python
"""Fast process-boundary checks; these do not establish Docker acceptance."""
|
|
import os
|
|
from pathlib import Path
|
|
import subprocess
|
|
import tempfile
|
|
import unittest
|
|
|
|
|
|
class BuildCleanupTest(unittest.TestCase):
|
|
def test_failed_verification_reclaims_its_container(self):
|
|
recipe = Path(__file__).resolve().parent
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
root = Path(directory)
|
|
docker = root / "docker"
|
|
docker.write_text('''#!/bin/sh
|
|
set -eu
|
|
case "$1 $2" in
|
|
'image inspect')
|
|
case "$*" in *--format*) printf 'sha256:fixture-image\\n';; *) exit 1;; esac;;
|
|
'image rm') :;;
|
|
'buildx create'|'buildx inspect'|'buildx build'|'buildx rm') :;;
|
|
'inspect --format') printf '4294967296 4294967296 100000 200000\\n';;
|
|
'run --rm')
|
|
name=unnamed
|
|
while [ "$#" -gt 0 ]; do
|
|
if [ "$1" = --name ]; then shift; name=$1; fi
|
|
shift
|
|
done
|
|
printf '%s' "$name" > "$CONTAINER_STATE"
|
|
exit 1;;
|
|
'rm --force')
|
|
test "$(cat "$CONTAINER_STATE")" = "$3"
|
|
rm "$CONTAINER_STATE";;
|
|
*) echo "Unexpected Docker operation: $*" >&2; exit 2;;
|
|
esac
|
|
''')
|
|
docker.chmod(0o755)
|
|
df = root / "df"
|
|
df.write_text("#!/bin/sh\nprintf 'Filesystem 1024-blocks Used Available Capacity Mounted\\nfixture 99999999 0 99999999 0%% /\\n'\n")
|
|
df.chmod(0o755)
|
|
state = root / "container-state"
|
|
result = subprocess.run(
|
|
["bash", str(recipe / "build.sh"), "--build", "--verify"],
|
|
env={**os.environ, "PATH": f"{root}:{os.environ['PATH']}",
|
|
"CONTAINER_STATE": str(state)},
|
|
capture_output=True, text=True, timeout=10,
|
|
)
|
|
self.assertNotEqual(result.returncode, 0, result.stdout)
|
|
self.assertFalse(state.exists(), "failed verifier left its container alive")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|