ruby/test/test_s2i.py
2021-11-23 13:19:17 +00:00

84 lines
2.5 KiB
Python

#!/usr/bin/python3
import logging
import os
import time
from conu import DockerBackend, S2IDockerImage, Probe, DockerRunBuilder
import pytest
image_name = os.environ.get("IMAGE_NAME", "ruby").split(":")[0]
image_tag = os.environ.get("IMAGE_NAME", "ruby").split(":")[1]
test_dir = os.path.abspath(os.path.dirname(__file__))
puma_app_path = os.path.join(test_dir, "puma-test-app")
rack_app_path = os.path.join(test_dir, "rack-test-app")
app_paths = [
puma_app_path,
rack_app_path
]
backend = DockerBackend(logging_level=logging.DEBUG)
@pytest.fixture(scope="module", params=app_paths)
def app(request):
i = S2IDockerImage(image_name, tag=image_tag)
app_name = os.path.basename(request.param)
app = i.extend(request.param, app_name)
yield app
pass
app.rmi()
class TestSuite:
def test_s2i_apps(self, app):
c = app.run_via_binary()
try:
c.wait_for_port(8080)
assert c.is_port_open(8080)
response = c.http_request("/", port="8080")
assert response.ok
output = c.execute(["bash", "-c", "ruby --version"])[0]
expected = "ruby %s." % os.environ["VERSION"]
assert expected in output.decode("utf-8")
finally:
c.stop()
c.wait()
# debugging
print(list(c.logs()))
c.delete()
def test_invoking_container(self):
image = backend.ImageClass(image_name, tag=image_tag)
c = image.run_via_binary(DockerRunBuilder(command=["bash", "-c", "ruby --version"]))
try:
c.wait()
logs = list(c.logs())[0].decode("utf-8")
finally:
c.stop()
c.wait()
c.delete()
assert "ruby " in logs
if os.environ.get("VERSION", None):
assert os.environ["VERSION"] in logs
def test_usage(self):
i = S2IDockerImage(image_name, tag=image_tag)
c = i.run_via_binary()
def logs_received():
return len(list(c.logs())) > 0
try:
c.wait()
# even after waiting there is still a race in journal logging driver
Probe(timeout=10, pause=0.05, count=20, fnc=logs_received).run()
logs = [x.decode("utf-8") for x in c.logs()]
logs = "\n".join(logs).strip()
usage = i.usage()
# FIXME: workaround: `docker logs` can't handle logs like these: '\n\n\n'
assert logs.replace("\n", "") == usage.replace("\n", "")
finally:
c.delete()