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 + "]");
+ }
+ });
+});