diff --git a/IPython/html/static/services/kernels/js/kernel.js b/IPython/html/static/services/kernels/js/kernel.js index b18d16d0f..322424f43 100644 --- a/IPython/html/static/services/kernels/js/kernel.js +++ b/IPython/html/static/services/kernels/js/kernel.js @@ -394,6 +394,7 @@ define([ error : utils.log_ajax_error, }; $.ajax(utils.url_join_encode(this.kernel_url), settings); + this.stop_channels(); } }; diff --git a/IPython/html/static/services/sessions/js/session.js b/IPython/html/static/services/sessions/js/session.js index 07339e70a..c86c9754e 100644 --- a/IPython/html/static/services/sessions/js/session.js +++ b/IPython/html/static/services/sessions/js/session.js @@ -80,6 +80,7 @@ define([ error : utils.log_ajax_error, }; this.kernel.running = false; + this.kernel.stop_channels(); var url = utils.url_join_encode(this.base_url, 'api/sessions', this.id); $.ajax(url, settings); }; diff --git a/IPython/html/tests/services/kernel.js b/IPython/html/tests/services/kernel.js index bcbda9e22..4ff1eeec9 100644 --- a/IPython/html/tests/services/kernel.js +++ b/IPython/html/tests/services/kernel.js @@ -1,12 +1,12 @@ // -// Miscellaneous javascript tests +// Kernel tests // casper.notebook_test(function () { this.evaluate(function () { IPython.notebook.kernel.kernel_info( function(msg){ - IPython._kernel_info_response = msg; + IPython._kernel_info_response = msg; }) }); @@ -24,5 +24,41 @@ casper.notebook_test(function () { this.test.assertTrue( kernel_info_response.msg_type === 'kernel_info_reply', 'Kernel info request return kernel_info_reply'); this.test.assertTrue( kernel_info_response.content !== undefined, 'Kernel_info_reply is not undefined'); }); - + + this.thenEvaluate(function () { + var kernel = IPython.notebook.session.kernel; + IPython._channels = [ + kernel.shell_channel, + kernel.iopub_channel, + kernel.stdin_channel + ]; + kernel.kill(); + }); + + this.waitFor(function () { + return this.evaluate(function(){ + for (var i=0; i < IPython._channels.length; i++) { + var ws = IPython._channels[i]; + if (ws.readyState !== ws.CLOSED) { + return false; + } + } + return true; + }); + }); + + this.then(function () { + var states = this.evaluate(function() { + var states = []; + for (var i = 0; i < IPython._channels.length; i++) { + states.push(IPython._channels[i].readyState); + } + return states; + }); + + for (var i = 0; i < states.length; i++) { + this.test.assertEquals(states[i], WebSocket.CLOSED, + "Kernel.kill closes websockets[" + i + "]"); + } + }); }); diff --git a/IPython/html/tests/services/session.js b/IPython/html/tests/services/session.js new file mode 100644 index 000000000..af066cfe4 --- /dev/null +++ b/IPython/html/tests/services/session.js @@ -0,0 +1,43 @@ + +// +// Tests for the Session object +// + +casper.notebook_test(function () { + this.evaluate(function () { + var kernel = IPython.notebook.session.kernel; + IPython._channels = [ + kernel.shell_channel, + kernel.iopub_channel, + kernel.stdin_channel + ]; + IPython.notebook.session.delete(); + }); + + this.waitFor(function () { + return this.evaluate(function(){ + for (var i=0; i < IPython._channels.length; i++) { + var ws = IPython._channels[i]; + if (ws.readyState !== ws.CLOSED) { + return false; + } + } + return true; + }); + }); + + this.then(function () { + var states = this.evaluate(function() { + var states = []; + for (var i = 0; i < IPython._channels.length; i++) { + states.push(IPython._channels[i].readyState); + } + return states; + }); + + for (var i = 0; i < states.length; i++) { + this.test.assertEquals(states[i], WebSocket.CLOSED, + "Session.delete closes websockets[" + i + "]"); + } + }); +});