diff --git a/.cirrus.yml b/.cirrus.yml index 12c186a9d..0addaaf23 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -29,7 +29,7 @@ task: PYPREFIX: py27 install_script: | pkg install -y curl ${PYTHON_PKG} ${PYPREFIX}-pip - ${PYTHON} -m pip install setuptools-rust + ${PYTHON} -m pip install setuptools-rust pytest curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain nightly . $HOME/.cargo/env build_script: | @@ -37,3 +37,7 @@ task: . $HOME/.cargo/env cd bindings/python ${PYTHON} setup.py install + test_script: | + . $HOME/.cargo/env + cd bindings/python + ${PYTHON} setup.py test diff --git a/bindings/python/setup.py b/bindings/python/setup.py index fcfd3862b..3fa5e2093 100644 --- a/bindings/python/setup.py +++ b/bindings/python/setup.py @@ -22,7 +22,7 @@ def run(self): import subprocess import sys - errno = subprocess.call([sys.executable, '-m', 'pytest', 'tests']) + errno = subprocess.call(['pytest', '-v', 'tests']) raise SystemExit(errno) setup_requires = ['setuptools-rust>=0.10.1'] diff --git a/bindings/python/tests/test_jail.py b/bindings/python/tests/test_jail.py new file mode 100644 index 000000000..92fe14a01 --- /dev/null +++ b/bindings/python/tests/test_jail.py @@ -0,0 +1,63 @@ +import pytest + +from jail import StoppedJail, RunningJail, Jls + + +def start_stop(s): + j = s.start() + j.stop() + +def test_start_stop_jail(benchmark): + s = StoppedJail('/rescue') + + benchmark(start_stop, s) + + +def get_hostname(j): + return j.parameters['host.hostname'] + +def test_get_parameter(benchmark): + s = StoppedJail('/rescue', parameters={'host.hostname': 'test'}) + j = s.start() + hostname = benchmark(get_hostname, j) + assert hostname == 'test' + j.stop() + + +def spawn_hello_world(j): + child = j.spawn(['/echo', 'hello world']) + child.wait() + +def test_spawn(benchmark): + s = StoppedJail('/rescue') + j = s.start() + benchmark(spawn_hello_world, j) + j.stop() + + +import subprocess +def popen_hello_world(j): + child = subprocess.Popen(['/echo', 'hello world'], preexec_fn=lambda: j.attach()) + child.wait() + +def test_popen(benchmark): + s = StoppedJail('/rescue') + j = s.start() + benchmark(popen_hello_world, j) + j.stop() + +def jls_jids(): + return set(j.jid for j in Jls()) + +def test_jls(benchmark): + # start 100 jails + s = StoppedJail('/rescue') + started = [s.start() for _ in range(100)] + started_jids = set(j.jid for j in started) + + jids = benchmark(jls_jids) + + for r in started: + r.stop(); + + assert started_jids <= jids