kernel.js 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. //
  2. // Kernel tests
  3. //
  4. casper.notebook_test(function () {
  5. // test that the kernel is running
  6. this.then(function () {
  7. this.test.assert(this.kernel_running(), 'kernel is running');
  8. });
  9. // test list
  10. this.thenEvaluate(function () {
  11. IPython._kernels = null;
  12. IPython.notebook.kernel.list(function (data) {
  13. IPython._kernels = data;
  14. });
  15. });
  16. this.waitFor(function () {
  17. return this.evaluate(function () {
  18. return IPython._kernels !== null;
  19. });
  20. });
  21. this.then(function () {
  22. var num_kernels = this.evaluate(function () {
  23. return IPython._kernels.length;
  24. });
  25. this.test.assertEquals(num_kernels, 1, 'one kernel running');
  26. });
  27. // test get_info
  28. var kernel_info = this.evaluate(function () {
  29. return {
  30. name: IPython.notebook.kernel.name,
  31. id: IPython.notebook.kernel.id
  32. };
  33. });
  34. this.thenEvaluate(function () {
  35. IPython._kernel_info = null;
  36. IPython.notebook.kernel.get_info(function (data) {
  37. IPython._kernel_info = data;
  38. });
  39. });
  40. this.waitFor(function () {
  41. return this.evaluate(function () {
  42. return IPython._kernel_info !== null;
  43. });
  44. });
  45. this.then(function () {
  46. var new_kernel_info = this.evaluate(function () {
  47. return IPython._kernel_info;
  48. });
  49. this.test.assertEquals(kernel_info.name, new_kernel_info.name, 'kernel: name correct');
  50. this.test.assertEquals(kernel_info.id, new_kernel_info.id, 'kernel: id correct');
  51. });
  52. // test interrupt
  53. this.thenEvaluate(function () {
  54. IPython._interrupted = false;
  55. IPython.notebook.kernel.interrupt(function () {
  56. IPython._interrupted = true;
  57. });
  58. });
  59. this.waitFor(function () {
  60. return this.evaluate(function () {
  61. return IPython._interrupted;
  62. });
  63. });
  64. this.then(function () {
  65. var interrupted = this.evaluate(function () {
  66. return IPython._interrupted;
  67. });
  68. this.test.assert(interrupted, 'kernel was interrupted');
  69. });
  70. // test restart
  71. this.thenEvaluate(function () {
  72. IPython.notebook.kernel.restart();
  73. });
  74. this.waitFor(this.kernel_disconnected);
  75. this.wait_for_kernel_ready();
  76. this.then(function () {
  77. this.test.assert(this.kernel_running(), 'kernel restarted');
  78. });
  79. // test reconnect
  80. this.thenEvaluate(function () {
  81. IPython.notebook.kernel.stop_channels();
  82. });
  83. this.waitFor(this.kernel_disconnected);
  84. this.thenEvaluate(function () {
  85. IPython.notebook.kernel.reconnect();
  86. });
  87. this.wait_for_kernel_ready();
  88. this.then(function () {
  89. this.test.assert(this.kernel_running(), 'kernel reconnected');
  90. });
  91. // test kernel_info_request
  92. this.evaluate(function () {
  93. IPython.notebook.kernel.kernel_info(
  94. function(msg){
  95. IPython._kernel_info_response = msg;
  96. });
  97. });
  98. this.waitFor(
  99. function () {
  100. return this.evaluate(function(){
  101. return IPython._kernel_info_response;
  102. });
  103. });
  104. this.then(function () {
  105. var kernel_info_response = this.evaluate(function(){
  106. return IPython._kernel_info_response;
  107. });
  108. this.test.assertTrue( kernel_info_response.msg_type === 'kernel_info_reply', 'Kernel info request return kernel_info_reply');
  109. this.test.assertTrue( kernel_info_response.content !== undefined, 'Kernel_info_reply is not undefined');
  110. });
  111. // test kill
  112. this.thenEvaluate(function () {
  113. IPython.notebook.kernel.kill();
  114. });
  115. this.waitFor(this.kernel_disconnected);
  116. this.then(function () {
  117. this.test.assert(!this.kernel_running(), 'kernel is not running');
  118. });
  119. // test start
  120. var url, base_url;
  121. this.then(function () {
  122. base_url = this.evaluate(function () {
  123. return IPython.notebook.base_url;
  124. });
  125. url = this.evaluate(function () {
  126. return IPython.notebook.kernel.start();
  127. });
  128. });
  129. this.then(function () {
  130. this.test.assertEquals(url, base_url + "api/kernels", "start url is correct");
  131. });
  132. this.wait_for_kernel_ready();
  133. this.then(function () {
  134. this.test.assert(this.kernel_running(), 'kernel is running');
  135. });
  136. // test start with parameters
  137. this.thenEvaluate(function () {
  138. IPython.notebook.kernel.kill();
  139. });
  140. this.waitFor(this.kernel_disconnected);
  141. this.then(function () {
  142. url = this.evaluate(function () {
  143. return IPython.notebook.kernel.start({foo: "bar"});
  144. });
  145. });
  146. this.then(function () {
  147. this.test.assertEquals(url, base_url + "api/kernels?foo=bar", "start url with params is correct");
  148. });
  149. this.wait_for_kernel_ready();
  150. this.then(function () {
  151. this.test.assert(this.kernel_running(), 'kernel is running');
  152. });
  153. // check for events in kill/start cycle
  154. this.event_test(
  155. 'kill/start',
  156. [
  157. 'kernel_killed.Kernel',
  158. 'kernel_starting.Kernel',
  159. 'kernel_created.Kernel',
  160. 'kernel_connected.Kernel',
  161. 'kernel_ready.Kernel'
  162. ],
  163. function () {
  164. this.thenEvaluate(function () {
  165. IPython.notebook.kernel.kill();
  166. });
  167. this.waitFor(this.kernel_disconnected);
  168. this.thenEvaluate(function () {
  169. IPython.notebook.kernel.start();
  170. });
  171. }
  172. );
  173. // wait for any last idle/busy messages to be handled
  174. this.wait_for_kernel_ready();
  175. // check for events in disconnect/connect cycle
  176. this.event_test(
  177. 'reconnect',
  178. [
  179. 'kernel_reconnecting.Kernel',
  180. 'kernel_connected.Kernel',
  181. ],
  182. function () {
  183. this.thenEvaluate(function () {
  184. IPython.notebook.kernel.stop_channels();
  185. IPython.notebook.kernel.reconnect(1);
  186. });
  187. }
  188. );
  189. // wait for any last idle/busy messages to be handled
  190. this.wait_for_kernel_ready();
  191. // check for events in the restart cycle
  192. this.event_test(
  193. 'restart',
  194. [
  195. 'kernel_restarting.Kernel',
  196. 'kernel_created.Kernel',
  197. 'kernel_connected.Kernel',
  198. 'kernel_ready.Kernel'
  199. ],
  200. function () {
  201. this.thenEvaluate(function () {
  202. IPython.notebook.kernel.restart();
  203. });
  204. }
  205. );
  206. // wait for any last idle/busy messages to be handled
  207. this.wait_for_kernel_ready();
  208. // check for events in the interrupt cycle
  209. this.event_test(
  210. 'interrupt',
  211. [
  212. 'kernel_interrupting.Kernel',
  213. 'kernel_busy.Kernel',
  214. 'kernel_idle.Kernel'
  215. ],
  216. function () {
  217. this.thenEvaluate(function () {
  218. IPython.notebook.kernel.interrupt();
  219. });
  220. }
  221. );
  222. this.wait_for_kernel_ready();
  223. // check for events after ws close
  224. this.event_test(
  225. 'ws_closed_ok',
  226. [
  227. 'kernel_disconnected.Kernel',
  228. 'kernel_reconnecting.Kernel',
  229. 'kernel_connected.Kernel',
  230. 'kernel_busy.Kernel',
  231. 'kernel_idle.Kernel'
  232. ],
  233. function () {
  234. this.thenEvaluate(function () {
  235. IPython.notebook.kernel._ws_closed("", false);
  236. });
  237. }
  238. );
  239. // wait for any last idle/busy messages to be handled
  240. this.wait_for_kernel_ready();
  241. // check for events after ws close (error)
  242. this.event_test(
  243. 'ws_closed_error',
  244. [
  245. 'kernel_disconnected.Kernel',
  246. 'kernel_connection_failed.Kernel',
  247. 'kernel_reconnecting.Kernel',
  248. 'kernel_connected.Kernel',
  249. 'kernel_busy.Kernel',
  250. 'kernel_idle.Kernel'
  251. ],
  252. function () {
  253. this.thenEvaluate(function () {
  254. IPython.notebook.kernel._ws_closed("", true);
  255. });
  256. }
  257. );
  258. // wait for any last idle/busy messages to be handled
  259. this.wait_for_kernel_ready();
  260. // start the kernel back up
  261. this.thenEvaluate(function () {
  262. IPython.notebook.kernel.restart();
  263. });
  264. this.waitFor(this.kernel_running);
  265. this.wait_for_kernel_ready();
  266. // test handling of autorestarting messages
  267. this.event_test(
  268. 'autorestarting',
  269. [
  270. 'kernel_restarting.Kernel',
  271. 'kernel_autorestarting.Kernel',
  272. ],
  273. function () {
  274. this.thenEvaluate(function () {
  275. var cell = IPython.notebook.get_cell(0);
  276. cell.set_text('import os\n' + 'os._exit(1)');
  277. cell.execute();
  278. });
  279. }
  280. );
  281. this.wait_for_kernel_ready();
  282. // test handling of failed restart
  283. this.event_test(
  284. 'failed_restart',
  285. [
  286. 'kernel_restarting.Kernel',
  287. 'kernel_autorestarting.Kernel',
  288. 'kernel_dead.Kernel'
  289. ],
  290. function () {
  291. this.thenEvaluate(function () {
  292. var cell = IPython.notebook.get_cell(0);
  293. cell.set_text("import os\n" +
  294. "from IPython.kernel.connect import get_connection_file\n" +
  295. "with open(get_connection_file(), 'w') as f:\n" +
  296. " f.write('garbage')\n" +
  297. "os._exit(1)");
  298. cell.execute();
  299. });
  300. },
  301. // need an extra-long timeout, because it needs to try
  302. // restarting the kernel 5 times!
  303. 20000
  304. );
  305. });