1
1
import os
2
- import shutil
2
+ import selectors
3
3
import sys
4
4
import time
5
5
from subprocess import PIPE
6
6
from subprocess import Popen
7
- from tempfile import mkdtemp
8
7
9
8
10
9
def _launch (extra_env ):
@@ -21,44 +20,59 @@ def _launch(extra_env):
21
20
POLL_FREQ = 10
22
21
23
22
24
- def test_kernelapp_lifecycle ():
23
+ def test_kernelapp_lifecycle (request , tmpdir ):
25
24
# Check that 'jupyter kernel' starts and terminates OK.
26
- runtime_dir = mkdtemp ( )
27
- startup_dir = mkdtemp ( )
25
+ runtime_dir = str ( tmpdir . join ( "runtime" ). mkdir () )
26
+ startup_dir = str ( tmpdir . join ( "startup" ). mkdir () )
28
27
started = os .path .join (startup_dir , "started" )
29
- try :
30
- p = _launch (
31
- {
32
- "JUPYTER_RUNTIME_DIR" : runtime_dir ,
33
- "JUPYTER_CLIENT_TEST_RECORD_STARTUP_PRIVATE" : started ,
34
- }
35
- )
36
- # Wait for start
37
- for _ in range (WAIT_TIME * POLL_FREQ ):
38
- if os .path .isfile (started ):
39
- break
40
- time .sleep (1 / POLL_FREQ )
41
- else :
42
- raise AssertionError ("No started file created in {} seconds" .format (WAIT_TIME ))
28
+ p = _launch (
29
+ {
30
+ "JUPYTER_RUNTIME_DIR" : runtime_dir ,
31
+ "JUPYTER_CLIENT_TEST_RECORD_STARTUP_PRIVATE" : started ,
32
+ }
33
+ )
34
+ request .addfinalizer (p .terminate )
35
+
36
+ # Wait for start
37
+ for _ in range (WAIT_TIME * POLL_FREQ ):
38
+ if os .path .isfile (started ):
39
+ break
40
+ time .sleep (1 / POLL_FREQ )
41
+ else :
42
+ raise AssertionError ("No started file created in {} seconds" .format (WAIT_TIME ))
43
+
44
+ # Connection file should be there by now
45
+ for _ in range (WAIT_TIME * POLL_FREQ ):
46
+ files = os .listdir (runtime_dir )
47
+ if files :
48
+ break
49
+ time .sleep (1 / POLL_FREQ )
50
+ else :
51
+ raise AssertionError ("No connection file created in {} seconds" .format (WAIT_TIME ))
52
+
53
+ assert len (files ) == 1
54
+ cf = files [0 ]
55
+ assert cf .startswith ("kernel" )
56
+ assert cf .endswith (".json" )
43
57
44
- # Connection file should be there by now
45
- for _ in range (WAIT_TIME * POLL_FREQ ):
46
- files = os .listdir (runtime_dir )
47
- if files :
48
- break
49
- time .sleep (1 / POLL_FREQ )
50
- else :
51
- raise AssertionError ("No connection file created in {} seconds" .format (WAIT_TIME ))
52
- assert len (files ) == 1
53
- cf = files [0 ]
54
- assert cf .startswith ("kernel" )
55
- assert cf .endswith (".json" )
58
+ # pexpect-style wait-for-text with timeout
59
+ t = time .perf_counter ()
60
+ deadline = t + WAIT_TIME
61
+ remaining = WAIT_TIME
56
62
57
- # Send SIGTERM to shut down
58
- time .sleep (1 )
63
+ selector = selectors .DefaultSelector ()
64
+ selector .register (p .stderr , selectors .EVENT_READ )
65
+ stderr = ""
66
+ while remaining >= 0 and p .poll () is None :
67
+ events = selector .select (remaining )
68
+ if events :
69
+ stderr += p .stderr .readline ().decode ("utf8" , "replace" )
70
+ if cf in stderr :
71
+ break
72
+ remaining = deadline - time .perf_counter ()
73
+ if p .poll () is None :
59
74
p .terminate ()
60
- _ , stderr = p .communicate (timeout = WAIT_TIME )
61
- assert cf in stderr .decode ("utf-8" , "replace" )
62
- finally :
63
- shutil .rmtree (runtime_dir )
64
- shutil .rmtree (startup_dir )
75
+ # finish reading stderr
76
+ stderr += p .stderr .read ().decode ("utf8" , "replace" )
77
+ selector .close ()
78
+ assert cf in stderr
0 commit comments