import os import sys import shutil import time from subprocess import Popen, PIPE from tempfile import mkdtemp def _launch(extra_env): env = os.environ.copy() env.update(extra_env) return Popen([sys.executable, '-c', 'from jupyter_client.kernelapp import main; main()'], env=env, stderr=PIPE) WAIT_TIME = 10 POLL_FREQ = 10 def test_kernelapp_lifecycle(): # Check that 'jupyter kernel' starts and terminates OK. runtime_dir = mkdtemp() startup_dir = mkdtemp() started = os.path.join(startup_dir, 'started') try: p = _launch({'JUPYTER_RUNTIME_DIR': runtime_dir, 'JUPYTER_CLIENT_TEST_RECORD_STARTUP_PRIVATE': started, }) # Wait for start for _ in range(WAIT_TIME * POLL_FREQ): if os.path.isfile(started): break time.sleep(1 / POLL_FREQ) else: raise AssertionError("No started file created in {} seconds" .format(WAIT_TIME)) # Connection file should be there by now files = os.listdir(runtime_dir) assert len(files) == 1 cf = files[0] assert cf.startswith('kernel') assert cf.endswith('.json') # Send SIGTERM to shut down p.terminate() _, stderr = p.communicate(timeout=WAIT_TIME) assert cf in stderr.decode('utf-8', 'replace') finally: shutil.rmtree(runtime_dir) shutil.rmtree(startup_dir)