Skip to content
This repository was archived by the owner on Jun 16, 2021. It is now read-only.

Commit 6155eb4

Browse files
committed
Ensure kernelspec dirs can be shared by providers
1 parent a956009 commit 6155eb4

File tree

1 file changed

+63
-35
lines changed

1 file changed

+63
-35
lines changed

remote_kernel_provider/tests/test_provider.py

+63-35
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,29 @@
1313
from ..lifecycle_manager import RemoteKernelLifecycleManager
1414

1515

16-
sample_kernel_json = {'argv': ['cat', '{kernel_id}', '{response_address}'],
17-
'display_name': 'Test kernel', }
16+
sample_kernel_json = {'argv': ['cat', '{kernel_id}', '{response_address}'], 'display_name': 'Test kernel', }
1817

19-
dummy_connection_info = {'stdin_port': 47557, 'ip': '172.16.18.82', 'control_port': 55288,
20-
'hb_port': 55562, 'signature_scheme': 'hmac-sha256',
21-
'key': 'e75863c2-4a8a-49b0-b6d2-9e23837d5bd1', 'comm_port': 36458,
22-
'kernel_name': '', 'shell_port': 58031, 'transport': 'tcp', 'iopub_port': 52229}
18+
foo_kernel_json = {'argv': ['cat', '{kernel_id}', '{response_address}'], 'display_name': 'Test foo kernel', }
2319

20+
bar_kernel_json = {'argv': ['cat', '{kernel_id}', '{response_address}'], 'display_name': 'Test bar kernel', }
21+
22+
foo_connection_info = {'stdin_port': 47557, 'ip': '172.16.18.82', 'control_port': 55288,
23+
'hb_port': 55562, 'signature_scheme': 'hmac-sha256',
24+
'key': 'e75863c2-4a8a-49b0-b6d2-9e23837d5bd1', 'comm_port': 36458,
25+
'kernel_name': '', 'shell_port': 58031, 'transport': 'tcp', 'iopub_port': 52229}
26+
27+
28+
def install_sample_kernel(kernels_dir,
29+
kernel_name='sample',
30+
kernel_file='kernel.json',
31+
json_content=sample_kernel_json):
2432

25-
def install_sample_kernel(kernels_dir, kernel_name='sample', kernel_file='kernel.json'):
2633
"""install a sample kernel in a kernels directory"""
2734
sample_kernel_dir = pjoin(kernels_dir, kernel_name)
28-
os.makedirs(sample_kernel_dir)
35+
os.makedirs(sample_kernel_dir, exist_ok=True)
2936
json_file = pjoin(sample_kernel_dir, kernel_file)
3037
with open(json_file, 'w') as f:
31-
json.dump(sample_kernel_json, f)
32-
return sample_kernel_dir
38+
json.dump(json_content, f)
3339

3440

3541
def is_uuid(uuid_to_test):
@@ -41,11 +47,11 @@ def is_uuid(uuid_to_test):
4147

4248

4349
def is_response_address(addr_to_test):
44-
return re.match(r"[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:[0-9]{4,5}$", addr_to_test) is not None
50+
return re.match(r"[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}:[0-9]{4,5}$", addr_to_test) is not None
4551

4652

47-
class DummyKernelLifecycleManager(RemoteKernelLifecycleManager):
48-
"""A dummy kernel provider for testing KernelFinder"""
53+
class FooKernelLifecycleManager(RemoteKernelLifecycleManager):
54+
"""A fake kernel provider for testing KernelFinder"""
4955
connection_info = None
5056

5157
def launch_process(self, kernel_cmd, **kwargs):
@@ -55,7 +61,7 @@ def launch_process(self, kernel_cmd, **kwargs):
5561
return self
5662

5763
def confirm_remote_startup(self):
58-
self.connection_info = dummy_connection_info
64+
self.connection_info = foo_connection_info
5965
return True
6066

6167
def shutdown_listener(self):
@@ -65,47 +71,69 @@ def kill(self):
6571
pass
6672

6773

68-
class DummyKernelProvider(RemoteKernelProviderBase):
69-
"""A dummy kernelspec provider subclass for testing"""
70-
id = 'dummy'
71-
kernel_file = 'dummy_kspec.json'
72-
lifecycle_manager_classes = ['remote_kernel_provider.tests.test_provider.DummyKernelLifecycleManager']
74+
class BarKernelLifecycleManager(FooKernelLifecycleManager):
75+
pass # Full inheritance from FooKernelLifecycleManager
76+
77+
78+
class FooKernelProvider(RemoteKernelProviderBase):
79+
"""A fake kernelspec provider subclass for testing"""
80+
id = 'foo'
81+
kernel_file = 'foo_kspec.json'
82+
lifecycle_manager_classes = ['remote_kernel_provider.tests.test_provider.FooKernelLifecycleManager']
83+
84+
85+
class BarKernelProvider(RemoteKernelProviderBase):
86+
"""A fake kernelspec provider subclass for testing"""
87+
id = 'bar'
88+
kernel_file = 'bar_kspec.json'
89+
lifecycle_manager_classes = ['remote_kernel_provider.tests.test_provider.BarKernelLifecycleManager']
7390

7491

7592
class RemoteKernelProviderTests(unittest.TestCase):
7693

7794
def setUp(self):
7895
self.env_patch = test_env()
7996
self.env_patch.start()
80-
self.sample_kernel_dir = install_sample_kernel(
81-
pjoin(paths.jupyter_data_dir(), 'kernels'))
82-
self.prov_sample1_kernel_dir = install_sample_kernel(
83-
pjoin(paths.jupyter_data_dir(), 'kernels'), 'dummy_kspec1', 'dummy_kspec.json')
84-
self.prov_sample2_kernel_dir = install_sample_kernel(
85-
pjoin(paths.jupyter_data_dir(), 'kernels'), 'dummy_kspec2', 'dummy_kspec.json')
97+
install_sample_kernel(pjoin(paths.jupyter_data_dir(), 'kernels'))
98+
install_sample_kernel(pjoin(paths.jupyter_data_dir(), 'kernels'),
99+
'foo_kspec', 'foo_kspec.json', foo_kernel_json)
100+
install_sample_kernel(pjoin(paths.jupyter_data_dir(), 'kernels'),
101+
'foo_kspec2', 'foo_kspec.json', foo_kernel_json)
86102

87-
self.kernel_finder = discovery.KernelFinder(providers=[DummyKernelProvider()])
103+
# This kspec overlaps with foo/foo_kspec. Will be located as bar/foo_kspec
104+
install_sample_kernel(pjoin(paths.jupyter_data_dir(), 'kernels'),
105+
'foo_kspec', 'bar_kspec.json', bar_kernel_json)
106+
107+
self.kernel_finder = discovery.KernelFinder(providers=[FooKernelProvider(),
108+
BarKernelProvider()])
88109

89110
def tearDown(self):
90111
self.env_patch.stop()
91112

92113
def test_find_remote_kernel_provider(self):
93-
dummy_kspecs = list(self.kernel_finder.find_kernels())
94-
assert len(dummy_kspecs) == 2
95-
96-
for name, spec in dummy_kspecs:
97-
assert name.startswith('dummy/dummy_kspec')
98-
assert spec['argv'] == sample_kernel_json['argv']
114+
fake_kspecs = list(self.kernel_finder.find_kernels())
115+
assert len(fake_kspecs) == 3
116+
117+
foo_kspecs = 0
118+
for name, spec in fake_kspecs:
119+
assert name.startswith('/foo_kspec', 3)
120+
assert spec['argv'] == foo_kernel_json['argv']
121+
if name.startswith('foo/'):
122+
foo_kspecs += 1
123+
assert spec['display_name'] == foo_kernel_json['display_name']
124+
else:
125+
assert spec['display_name'] == bar_kernel_json['display_name']
126+
assert foo_kspecs == 2
99127

100128
def test_launch_remote_kernel_provider(self):
101-
conn_info, manager = self.kernel_finder.launch('dummy/dummy_kspec1')
129+
conn_info, manager = self.kernel_finder.launch('foo/foo_kspec')
102130
assert isinstance(manager, RemoteKernelManager)
103-
assert conn_info == dummy_connection_info
131+
assert conn_info == foo_connection_info
104132
assert manager.kernel_id is not None
105133
assert is_uuid(manager.kernel_id)
106134

107135
manager.kill()
108136
assert manager.lifecycle_manager is not None
109-
assert isinstance(manager.lifecycle_manager, DummyKernelLifecycleManager)
137+
assert isinstance(manager.lifecycle_manager, FooKernelLifecycleManager)
110138
manager.cleanup()
111139
assert manager.lifecycle_manager is None

0 commit comments

Comments
 (0)