|
4 | 4 | import sys |
5 | 5 | import time |
6 | 6 |
|
| 7 | +from requests import HTTPError |
7 | 8 | from traitlets.config import Config |
8 | 9 |
|
9 | 10 | from tornado.httpclient import HTTPRequest |
@@ -234,3 +235,49 @@ class KernelFilterTest(NotebookTestBase): |
234 | 235 | # Sanity check verifying that the configurable was properly set. |
235 | 236 | def test_config(self): |
236 | 237 | self.assertEqual(self.notebook.kernel_manager.allowed_message_types, ['kernel_info_request']) |
| 238 | + |
| 239 | + |
| 240 | +class KernelCullingTest(NotebookTestBase): |
| 241 | + """Test kernel culling """ |
| 242 | + |
| 243 | + @classmethod |
| 244 | + def get_argv(cls): |
| 245 | + argv = super(KernelCullingTest, cls).get_argv() |
| 246 | + |
| 247 | + # Enable culling with 2s timeout and 1s intervals |
| 248 | + argv.extend(['--MappingKernelManager.cull_idle_timeout=2', |
| 249 | + '--MappingKernelManager.cull_interval=1', |
| 250 | + '--MappingKernelManager.cull_connected=False']) |
| 251 | + return argv |
| 252 | + |
| 253 | + def setUp(self): |
| 254 | + self.kern_api = KernelAPI(self.request, |
| 255 | + base_url=self.base_url(), |
| 256 | + headers=self.auth_headers(), |
| 257 | + ) |
| 258 | + |
| 259 | + def tearDown(self): |
| 260 | + for k in self.kern_api.list().json(): |
| 261 | + self.kern_api.shutdown(k['id']) |
| 262 | + |
| 263 | + def test_culling(self): |
| 264 | + kid = self.kern_api.start().json()['id'] |
| 265 | + ws = self.kern_api.websocket(kid) |
| 266 | + model = self.kern_api.get(kid).json() |
| 267 | + self.assertEqual(model['connections'], 1) |
| 268 | + assert not self.get_cull_status(kid) # connected, should not be culled |
| 269 | + ws.close() |
| 270 | + assert self.get_cull_status(kid) # not connected, should be culled |
| 271 | + |
| 272 | + def get_cull_status(self, kid): |
| 273 | + culled = False |
| 274 | + for i in range(15): # Need max of 3s to ensure culling timeout exceeded |
| 275 | + try: |
| 276 | + self.kern_api.get(kid) |
| 277 | + except HTTPError as e: |
| 278 | + assert e.response.status_code == 404 |
| 279 | + culled = True |
| 280 | + break |
| 281 | + else: |
| 282 | + time.sleep(0.2) |
| 283 | + return culled |
0 commit comments