##// END OF EJS Templates
use single WebSocket connection for all channels...
use single WebSocket connection for all channels multiplex on a 'channel' key in message, rather than separate websockets. Unlike zmq, there aren't different message patterns that require the channels to be separate. Reduces FD count by factor of 3 and connection complexity in js.

File last commit:

r18740:67db9d08
r19824:17ebfc54
Show More
kernel.js
323 lines | 9.5 KiB | application/javascript | JavascriptLexer
Matthias BUSSONNIER
add kernel test
r14718
//
MinRK
JS: close WebSockets when killing kernels...
r17640 // Kernel tests
Matthias BUSSONNIER
add kernel test
r14718 //
casper.notebook_test(function () {
Jessica B. Hamrick
Add some more kernel tests
r18212 // test that the kernel is running
Jessica B. Hamrick
Fix kernel and session tests
r18210 this.then(function () {
Jessica B. Hamrick
Add some more kernel tests
r18212 this.test.assert(this.kernel_running(), 'kernel is running');
Jessica B. Hamrick
Fix kernel and session tests
r18210 });
Jessica B. Hamrick
Add some more kernel tests
r18212 // test list
this.thenEvaluate(function () {
IPython._kernels = null;
IPython.notebook.kernel.list(function (data) {
IPython._kernels = data;
});
});
this.waitFor(function () {
return this.evaluate(function () {
return IPython._kernels !== null;
});
});
this.then(function () {
var num_kernels = this.evaluate(function () {
return IPython._kernels.length;
});
this.test.assertEquals(num_kernels, 1, 'one kernel running');
});
// test get_info
var kernel_info = this.evaluate(function () {
return {
name: IPython.notebook.kernel.name,
id: IPython.notebook.kernel.id
};
});
this.thenEvaluate(function () {
IPython._kernel_info = null;
IPython.notebook.kernel.get_info(function (data) {
IPython._kernel_info = data;
});
});
this.waitFor(function () {
return this.evaluate(function () {
return IPython._kernel_info !== null;
});
});
this.then(function () {
var new_kernel_info = this.evaluate(function () {
return IPython._kernel_info;
});
this.test.assertEquals(kernel_info.name, new_kernel_info.name, 'kernel: name correct');
this.test.assertEquals(kernel_info.id, new_kernel_info.id, 'kernel: id correct');
});
// test interrupt
this.thenEvaluate(function () {
IPython._interrupted = false;
IPython.notebook.kernel.interrupt(function () {
IPython._interrupted = true;
});
});
this.waitFor(function () {
return this.evaluate(function () {
return IPython._interrupted;
});
});
this.then(function () {
var interrupted = this.evaluate(function () {
return IPython._interrupted;
});
this.test.assert(interrupted, 'kernel was interrupted');
});
// test restart
this.thenEvaluate(function () {
IPython.notebook.kernel.restart();
});
Jessica B. Hamrick
Better way to wait inbetween tests
r18232 this.waitFor(this.kernel_disconnected);
this.wait_for_kernel_ready();
Jessica B. Hamrick
Add some more kernel tests
r18212 this.then(function () {
this.test.assert(this.kernel_running(), 'kernel restarted');
});
// test reconnect
this.thenEvaluate(function () {
IPython.notebook.kernel.stop_channels();
});
Jessica B. Hamrick
Better way to wait inbetween tests
r18232 this.waitFor(this.kernel_disconnected);
Jessica B. Hamrick
Add some more kernel tests
r18212 this.thenEvaluate(function () {
IPython.notebook.kernel.reconnect();
});
Jessica B. Hamrick
Better way to wait inbetween tests
r18232 this.wait_for_kernel_ready();
Jessica B. Hamrick
Add some more kernel tests
r18212 this.then(function () {
this.test.assert(this.kernel_running(), 'kernel reconnected');
});
// test kernel_info_request
Matthias BUSSONNIER
add kernel test
r14718 this.evaluate(function () {
IPython.notebook.kernel.kernel_info(
function(msg){
MinRK
JS: close WebSockets when killing kernels...
r17640 IPython._kernel_info_response = msg;
Jessica B. Hamrick
Fix kernel and session tests
r18210 });
Matthias BUSSONNIER
add kernel test
r14718 });
this.waitFor(
function () {
return this.evaluate(function(){
return IPython._kernel_info_response;
});
});
Matthias BUSSONNIER
fix js formatting
r14719 this.then(function () {
Matthias BUSSONNIER
typo
r14722 var kernel_info_response = this.evaluate(function(){
Matthias BUSSONNIER
fix js formatting
r14719 return IPython._kernel_info_response;
Matthias BUSSONNIER
add kernel test
r14718 });
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');
Matthias BUSSONNIER
fix js formatting
r14719 });
Jessica B. Hamrick
Add some more kernel tests
r18212
// test kill
MinRK
JS: close WebSockets when killing kernels...
r17640 this.thenEvaluate(function () {
Jessica B. Hamrick
Fix kernel and session tests
r18210 IPython.notebook.kernel.kill();
MinRK
JS: close WebSockets when killing kernels...
r17640 });
Jessica B. Hamrick
Better way to wait inbetween tests
r18232 this.waitFor(this.kernel_disconnected);
MinRK
JS: close WebSockets when killing kernels...
r17640 this.then(function () {
Jessica B. Hamrick
Fix kernel and session tests
r18210 this.test.assert(!this.kernel_running(), 'kernel is not running');
MinRK
JS: close WebSockets when killing kernels...
r17640 });
Jessica B. Hamrick
Add some more kernel tests
r18212
// test start
var url;
this.then(function () {
url = this.evaluate(function () {
return IPython.notebook.kernel.start();
});
});
this.then(function () {
this.test.assertEquals(url, "/api/kernels", "start url is correct");
});
Jessica B. Hamrick
Better way to wait inbetween tests
r18232 this.wait_for_kernel_ready();
Jessica B. Hamrick
Add some more kernel tests
r18212 this.then(function () {
this.test.assert(this.kernel_running(), 'kernel is running');
});
// test start with parameters
this.thenEvaluate(function () {
IPython.notebook.kernel.kill();
});
Jessica B. Hamrick
Better way to wait inbetween tests
r18232 this.waitFor(this.kernel_disconnected);
Jessica B. Hamrick
Add some more kernel tests
r18212 this.then(function () {
url = this.evaluate(function () {
return IPython.notebook.kernel.start({foo: "bar"});
});
});
this.then(function () {
this.test.assertEquals(url, "/api/kernels?foo=bar", "start url with params is correct");
});
Jessica B. Hamrick
Better way to wait inbetween tests
r18232 this.wait_for_kernel_ready();
Jessica B. Hamrick
Add some more kernel tests
r18212 this.then(function () {
this.test.assert(this.kernel_running(), 'kernel is running');
});
Jessica B. Hamrick
Add tests for events
r18223
// check for events in kill/start cycle
this.event_test(
'kill/start',
[
Jessica B. Hamrick
Rename all status_event to kernel_event
r18238 'kernel_killed.Kernel',
Jessica B. Hamrick
Add status_ready.Kernel event and rename status_started to status_created
r18230 'kernel_created.Kernel',
Jessica B. Hamrick
Rename all status_event to kernel_event
r18238 'kernel_connected.Kernel',
'kernel_starting.Kernel',
'kernel_ready.Kernel'
Jessica B. Hamrick
Add tests for events
r18223 ],
function () {
this.thenEvaluate(function () {
IPython.notebook.kernel.kill();
});
this.waitFor(this.kernel_disconnected);
this.thenEvaluate(function () {
IPython.notebook.kernel.start();
});
}
);
// wait for any last idle/busy messages to be handled
Jessica B. Hamrick
Better way to wait inbetween tests
r18232 this.wait_for_kernel_ready();
Jessica B. Hamrick
Add tests for events
r18223
// check for events in disconnect/connect cycle
this.event_test(
'reconnect',
[
Jessica B. Hamrick
Rename all status_event to kernel_event
r18238 'kernel_reconnecting.Kernel',
'kernel_connected.Kernel',
Jessica B. Hamrick
Add tests for events
r18223 ],
function () {
this.thenEvaluate(function () {
IPython.notebook.kernel.stop_channels();
IPython.notebook.kernel.reconnect(1);
});
}
);
// wait for any last idle/busy messages to be handled
Jessica B. Hamrick
Better way to wait inbetween tests
r18232 this.wait_for_kernel_ready();
Jessica B. Hamrick
Add tests for events
r18223
// check for events in the restart cycle
this.event_test(
'restart',
[
Jessica B. Hamrick
Rename all status_event to kernel_event
r18238 'kernel_restarting.Kernel',
Jessica B. Hamrick
Add status_ready.Kernel event and rename status_started to status_created
r18230 'kernel_created.Kernel',
Jessica B. Hamrick
Rename all status_event to kernel_event
r18238 'kernel_connected.Kernel',
'kernel_starting.Kernel',
'kernel_ready.Kernel'
Jessica B. Hamrick
Add tests for events
r18223 ],
function () {
this.thenEvaluate(function () {
IPython.notebook.kernel.restart();
});
}
);
// wait for any last idle/busy messages to be handled
Jessica B. Hamrick
Better way to wait inbetween tests
r18232 this.wait_for_kernel_ready();
Jessica B. Hamrick
Add tests for events
r18223
// check for events in the interrupt cycle
this.event_test(
'interrupt',
[
Jessica B. Hamrick
Rename all status_event to kernel_event
r18238 'kernel_interrupting.Kernel',
'kernel_busy.Kernel',
'kernel_idle.Kernel'
Jessica B. Hamrick
Add tests for events
r18223 ],
function () {
this.thenEvaluate(function () {
IPython.notebook.kernel.interrupt();
});
}
);
Jessica B. Hamrick
Better way to wait inbetween tests
r18232 this.wait_for_kernel_ready();
Jessica B. Hamrick
Add tests for events
r18223
// check for events after ws close
this.event_test(
'ws_closed_ok',
[
Jessica B. Hamrick
Rename all status_event to kernel_event
r18238 'kernel_disconnected.Kernel',
'kernel_reconnecting.Kernel',
'kernel_connected.Kernel',
'kernel_busy.Kernel',
'kernel_idle.Kernel'
Jessica B. Hamrick
Add tests for events
r18223 ],
function () {
this.thenEvaluate(function () {
IPython.notebook.kernel._ws_closed("", false);
});
}
);
// wait for any last idle/busy messages to be handled
Jessica B. Hamrick
Better way to wait inbetween tests
r18232 this.wait_for_kernel_ready();
Jessica B. Hamrick
Add tests for events
r18223
// check for events after ws close (error)
this.event_test(
'ws_closed_error',
[
Jessica B. Hamrick
Rename all status_event to kernel_event
r18238 'kernel_disconnected.Kernel',
Min RK
add events to ws_closed_error in kernel.js
r18733 'kernel_connection_failed.Kernel',
'kernel_reconnecting.Kernel',
'kernel_connected.Kernel',
'kernel_busy.Kernel',
'kernel_idle.Kernel'
Jessica B. Hamrick
Add tests for events
r18223 ],
function () {
this.thenEvaluate(function () {
IPython.notebook.kernel._ws_closed("", true);
});
}
);
Min RK
wait for kernel_ready after ws_closed_error
r18740 // wait for any last idle/busy messages to be handled
this.wait_for_kernel_ready();
Jessica B. Hamrick
Test for autorestart and failed autorestart
r18233
// start the kernel back up
this.thenEvaluate(function () {
IPython.notebook.kernel.restart();
});
this.waitFor(this.kernel_running);
this.wait_for_kernel_ready();
// test handling of autorestarting messages
this.event_test(
'autorestarting',
[
Jessica B. Hamrick
Rename all status_event to kernel_event
r18238 'kernel_restarting.Kernel',
'kernel_autorestarting.Kernel',
Jessica B. Hamrick
Test for autorestart and failed autorestart
r18233 ],
function () {
this.thenEvaluate(function () {
var cell = IPython.notebook.get_cell(0);
cell.set_text('import os\n' + 'os._exit(1)');
cell.execute();
});
}
);
this.wait_for_kernel_ready();
// test handling of failed restart
this.event_test(
'failed_restart',
[
Jessica B. Hamrick
Rename all status_event to kernel_event
r18238 'kernel_restarting.Kernel',
'kernel_autorestarting.Kernel',
Jessica B. Hamrick
Test for autorestart and failed autorestart
r18233 'kernel_dead.Kernel'
],
function () {
this.thenEvaluate(function () {
var cell = IPython.notebook.get_cell(0);
cell.set_text("import os\n" +
"from IPython.kernel.connect import get_connection_file\n" +
"with open(get_connection_file(), 'w') as f:\n" +
" f.write('garbage')\n" +
"os._exit(1)");
cell.execute();
});
},
// need an extra-long timeout, because it needs to try
// restarting the kernel 5 times!
20000
);
Matthias BUSSONNIER
add kernel test
r14718 });