浏览代码

Update kernel tests

Steven Silvester 8 年之前
父节点
当前提交
036677a603

+ 2 - 1
packages/services/test/config.json

@@ -1,4 +1,5 @@
 {
     "foo": "bar",
-    "terminalsAvailable": "True"
+    "terminalsAvailable": "True",
+    "baseUrl": "http://localhost:8888"
 }

+ 1483 - 1483
packages/services/test/src/kernel/kernel.spec.ts

@@ -202,1488 +202,1488 @@ describe('kernel', () => {
 
   });
 
-  describe('Kernel.connectTo()', () => {
-
-    it('should reuse an exisiting kernel', (done) => {
-      let id = uuid();
-      tester.runningKernels = [{ name: 'foo', id }];
-      Kernel.connectTo(id).then(k => {
-        kernel = k;
-        Kernel.connectTo(id).then(newKernel => {
-          expect(newKernel.name).to.be(kernel.name);
-          expect(newKernel.id).to.be(kernel.id);
-          newKernel.dispose();
-          done();
-        });
-      });
-    });
-
-    it('should connect to a running kernel if given kernel options', (done) => {
-      let id = uuid();
-      tester.runningKernels = [{ name: KERNEL_OPTIONS.name, id }];
-      Kernel.connectTo(id).then(k => {
-        kernel = k;
-        expect(kernel.name).to.be(KERNEL_OPTIONS.name);
-        expect(kernel.id).to.be(id);
-        done();
-      }).catch(done);
-    });
-
-    it('should accept server settings', (done) => {
-      let id = uuid();
-      tester.runningKernels = [{ name: KERNEL_OPTIONS.name, id }];
-      Kernel.connectTo(id, serverSettings).then(k => {
-        kernel = k;
-        expect(kernel.name).to.be(KERNEL_OPTIONS.name);
-        expect(kernel.id).to.be(id);
-        done();
-      }).catch(done);
-    });
-
-    it('should fail if no running kernel available', (done) => {
-      let id = uuid();
-      tester.onRequest = () => {
-        tester.respond(400, { });
-      };
-      let kernelPromise = Kernel.connectTo(id);
-      expectFailure(kernelPromise, done, 'No running kernel with id: ' + id);
-    });
-
-  });
-
-  describe('Kernel.shutdown()', () => {
-
-    it('should shut down a kernel by id', (done) => {
-      Kernel.shutdown('foo').then(done, done);
-    });
-
-    it('should handle a 404 error', (done) => {
-      tester.onRequest = () => {
-        tester.respond(404, { });
-      };
-      Kernel.shutdown('foo').then(done, done);
-    });
-
-  });
-
-  describe('Kernel.IKernel', () => {
-
-    beforeEach((done) => {
-      Kernel.startNew().then(k => {
-        kernel = k;
-        return kernel.ready;
-      }).then(() => {
-        done();
-      }).catch(done);
-    });
-
-    context('#terminated', () => {
-
-      it('should be emitted when the kernel is shut down', (done) => {
-        kernel.terminated.connect((sender, args) => {
-          expect(sender).to.be(kernel);
-          expect(args).to.be(void 0);
-          done();
-        });
-        kernel.shutdown();
-      });
-
-    });
-
-    context('#statusChanged', () => {
-
-      it('should be a signal following the Kernel status', (done) => {
-        kernel.statusChanged.connect(() => {
-          if (kernel.status === 'busy') {
-            done();
-          }
-        });
-        tester.sendStatus('busy');
-      });
-
-    });
-
-    context('#iopubMessage', () => {
-
-      it('should be emitted for an iopub message', (done) => {
-        kernel.iopubMessage.connect((k, msg) => {
-          expect(msg.header.msg_type).to.be('status');
-          done();
-        });
-        let msg = KernelMessage.createMessage({
-          msgType: 'status',
-          channel: 'iopub',
-          session: kernel.clientId
-        }) as KernelMessage.IStatusMsg;
-        msg.content.execution_state = 'idle';
-        msg.parent_header = msg.header;
-        tester.send(msg);
-      });
-
-      it('should be emitted regardless of the sender', (done) => {
-        kernel.iopubMessage.connect((k, msg) => {
-          expect(msg.header.msg_type).to.be('status');
-          done();
-        });
-        let msg = KernelMessage.createMessage({
-          msgType: 'status',
-          channel: 'iopub',
-          session: 'baz'
-        }) as KernelMessage.IStatusMsg;
-        msg.content.execution_state = 'idle';
-        msg.parent_header = msg.header;
-        tester.send(msg);
-      });
-
-    });
-
-    context('#unhandledMessage', () => {
-
-      it('should be emitted for an unhandled message', (done) => {
-        kernel.unhandledMessage.connect((k, msg) => {
-          expect(msg.header.msg_type).to.be('foo');
-          done();
-        });
-        let msg = KernelMessage.createShellMessage({
-          msgType: 'foo',
-          channel: 'shell',
-          session: kernel.clientId
-        });
-        msg.parent_header = msg.header;
-        tester.send(msg);
-      });
-
-      it('should not be emitted for an iopub signal', () => {
-        let called = false;
-        kernel.unhandledMessage.connect((k, msg) => {
-          called = true;
-        });
-        let msg = KernelMessage.createMessage({
-          msgType: 'status',
-          channel: 'iopub',
-          session: kernel.clientId
-        }) as KernelMessage.IStatusMsg;
-        msg.content.execution_state = 'idle';
-        msg.parent_header = msg.header;
-        tester.send(msg);
-        expect(called).to.be(false);
-      });
-
-      it('should not be emitted for a different client session', () => {
-        let called = false;
-        kernel.unhandledMessage.connect((k, msg) => {
-          called = true;
-        });
-        let msg = KernelMessage.createShellMessage({
-          msgType: 'foo',
-          channel: 'shell',
-          session: 'baz'
-        });
-        msg.parent_header = msg.header;
-        tester.send(msg);
-        expect(called).to.be(false);
-      });
-
-    });
-
-    context('#id', () => {
-
-      it('should be a string', () => {
-        expect(typeof kernel.id).to.be('string');
-      });
-
-    });
-
-    context('#name', () => {
-
-      it('should be a string', () => {
-        expect(typeof kernel.name).to.be('string');
-      });
-
-    });
-
-    context('#model', () => {
-
-      it('should be an IModel', () => {
-        let model = kernel.model;
-        expect(typeof model.name).to.be('string');
-        expect(typeof model.id).to.be('string');
-      });
-
-    });
-
-    context('#username', () => {
-
-      it('should be a string', () => {
-        expect(typeof kernel.username).to.be('string');
-      });
-
-    });
-
-    context('#serverSettings', () => {
-
-      it('should be the server settings', () => {
-        expect(kernel.serverSettings.baseUrl).to.be(PageConfig.getBaseUrl());
-      });
-
-    });
-
-    context('#clientId', () => {
-
-      it('should be a string', () => {
-        expect(typeof kernel.clientId).to.be('string');
-      });
-    });
-
-    context('#status', () => {
-
-      it('should get an idle status', (done) => {
-        kernel.statusChanged.connect(() => {
-          if (kernel.status === 'idle') {
-            done();
-          }
-        });
-        tester.sendStatus('idle');
-      });
-
-      it('should get a restarting status', (done) => {
-        kernel.statusChanged.connect(() => {
-          if (kernel.status === 'restarting') {
-            done();
-          }
-        });
-        tester.sendStatus('restarting');
-      });
-
-      it('should get a busy status', (done) => {
-        kernel.statusChanged.connect(() => {
-          if (kernel.status === 'busy') {
-            done();
-          }
-        });
-        tester.sendStatus('busy');
-      });
-
-      it('should get a reconnecting status', (done) => {
-        kernel.statusChanged.connect(() => {
-          if (kernel.status === 'reconnecting') {
-            done();
-          }
-        });
-        tester.close();
-      });
-
-      it('should get a dead status', (done) => {
-        kernel.statusChanged.connect(() => {
-          if (kernel.status === 'dead') {
-            done();
-          }
-        });
-        tester.sendStatus('dead');
-      });
-
-      it('should handle an invalid status', (done) => {
-        kernel.statusChanged.connect(() => {
-          if (kernel.status === 'idle') {
-            done();
-          }
-        });
-        tester.sendStatus('celebrating');
-        tester.sendStatus('idle');
-      });
-    });
-
-    context('#info', () => {
-
-      it('should get the kernel info', () => {
-        return kernel.ready.then(() => {
-          let name = kernel.info.language_info.name;
-          expect(name).to.be(EXAMPLE_KERNEL_INFO.language_info.name);
-        });
-      });
-
-    });
-
-    context('#getSpec()', () => {
-
-      it('should resolve with the spec', () => {
-        return kernel.getSpec().then(spec => {
-          expect(spec.language).to.be('python');
-        });
-      });
-
-    });
-
-    context('#isReady', () => {
-
-      it('should test whether the kernel is ready', () => {
-        return kernel.shutdown().then (() => {
-          return Kernel.startNew();
-        }).then(k => {
-          kernel = k;
-          expect(kernel.isReady).to.be(false);
-          return kernel.ready;
-        }).then(() => {
-          expect(kernel.isReady).to.be(true);
-        });
-      });
-    });
-
-    context('#ready', () => {
-
-      it('should resolve when the kernel is ready', () => {
-        return kernel.ready;
-      });
-
-    });
-
-    context('#isDisposed', () => {
-
-      it('should be true after we dispose of the kernel', () => {
-        expect(kernel.isDisposed).to.be(false);
-        kernel.dispose();
-        expect(kernel.isDisposed).to.be(true);
-      });
-
-      it('should be safe to call multiple times', () => {
-        expect(kernel.isDisposed).to.be(false);
-        expect(kernel.isDisposed).to.be(false);
-        kernel.dispose();
-        expect(kernel.isDisposed).to.be(true);
-        expect(kernel.isDisposed).to.be(true);
-      });
-    });
-
-    context('#dispose()', () => {
-
-      it('should dispose of the resources held by the kernel', () => {
-        let future = kernel.requestExecute({ code: 'foo' });
-        let comm = kernel.connectToComm('foo');
-        expect(future.isDisposed).to.be(false);
-        expect(comm.isDisposed).to.be(false);
-        kernel.dispose();
-        expect(future.isDisposed).to.be(true);
-        expect(comm.isDisposed).to.be(true);
-      });
-
-      it('should be safe to call twice', () => {
-        let future = kernel.requestExecute({ code: 'foo' });
-        let comm = kernel.connectToComm('foo');
-        expect(future.isDisposed).to.be(false);
-        expect(comm.isDisposed).to.be(false);
-        kernel.dispose();
-        expect(future.isDisposed).to.be(true);
-        expect(comm.isDisposed).to.be(true);
-        expect(kernel.isDisposed).to.be(true);
-        kernel.dispose();
-        expect(future.isDisposed).to.be(true);
-        expect(comm.isDisposed).to.be(true);
-        expect(kernel.isDisposed).to.be(true);
-      });
-    });
-
-    context('#sendShellMessage()', () => {
-
-      it('should send a message to the kernel', (done) => {
-        let options: KernelMessage.IOptions = {
-          msgType: 'custom',
-          channel: 'shell',
-          username: kernel.username,
-          session: kernel.clientId
-        };
-        let msg = KernelMessage.createShellMessage(options);
-        kernel.sendShellMessage(msg, true);
-        tester.onMessage((msg) => {
-          expect(msg.header.msg_type).to.be('custom');
-          done();
-        });
-      });
-
-      it('should send a binary message', (done) => {
-        let options: KernelMessage.IOptions = {
-          msgType: 'custom',
-          channel: 'shell',
-          username: kernel.username,
-          session: kernel.clientId
-        };
-        let encoder = new TextEncoder('utf8');
-        let data = encoder.encode('hello');
-        let msg = KernelMessage.createShellMessage(options, {}, {}, [data, data.buffer]);
-        kernel.sendShellMessage(msg, true);
-
-        tester.onMessage((msg: any) => {
-          let decoder = new TextDecoder('utf8');
-          let item = msg.buffers[0] as DataView;
-          expect(decoder.decode(item)).to.be('hello');
-          done();
-        });
-      });
-
-      it('should fail if the kernel is dead', (done) => {
-        let options: KernelMessage.IOptions = {
-          msgType: 'custom',
-          channel: 'shell',
-          username: kernel.username,
-          session: kernel.clientId
-        };
-        let msg = KernelMessage.createShellMessage(options);
-        tester.sendStatus('dead');
-        kernel.statusChanged.connect(() => {
-          try {
-            kernel.sendShellMessage(msg, true);
-          } catch (err) {
-            expect(err.message).to.be('Kernel is dead');
-            done();
-          }
-        });
-      });
-
-      it('should handle out of order messages', (done) => {
-        let options: KernelMessage.IOptions = {
-          msgType: 'custom',
-          channel: 'shell',
-          username: kernel.username,
-          session: kernel.clientId
-        };
-        let msg = KernelMessage.createShellMessage(options);
-        let future = kernel.sendShellMessage(msg, true);
-        let newMsg: KernelMessage.IMessage;
-
-        tester.onMessage((msg) => {
-          // trigger onDone
-          options.msgType = 'status';
-          options.channel = 'iopub';
-          newMsg = KernelMessage.createMessage(options, { execution_state: 'idle' });
-          newMsg.parent_header = msg.header;
-          tester.send(newMsg);
-
-          future.onIOPub = () => {
-            options.msgType = 'custom';
-            options.channel = 'shell';
-            newMsg = KernelMessage.createShellMessage(options);
-            newMsg.parent_header = msg.header;
-            tester.send(newMsg);
-          };
-
-          future.onDone = () => {
-            done();
-          };
-        });
-      });
-    });
-
-    context('#interrupt()', () => {
-
-      it('should interrupt and resolve with a valid server response', (done) => {
-        kernel.interrupt().then(() => { done(); });
-      });
-
-      it('should throw an error for an invalid response', (done) => {
-        tester.onRequest = () => {
-          tester.respond(200,  { id: kernel.id, name: kernel.name });
-        };
-        let interrupt = kernel.interrupt();
-        expectAjaxError(interrupt, done, 'Invalid Status: 200');
-      });
-
-      it('should throw an error for an error response', (done) => {
-        tester.onRequest = () => {
-          tester.respond(500, { });
-        };
-        let interrupt = kernel.interrupt();
-        expectFailure(interrupt, done, '');
-      });
-
-      it('should fail if the kernel is dead', (done) => {
-        tester.sendStatus('dead');
-        kernel.statusChanged.connect(() => {
-          if (kernel.status === 'dead') {
-            expectFailure(kernel.interrupt(), done, 'Kernel is dead');
-          }
-        });
-      });
-    });
-
-    context('#restart()', () => {
-
-      it('should restart and resolve with a valid server response', (done) => {
-        kernel.restart().then(() => { done(); });
-      });
-
-      it('should fail if the kernel does not restart', (done) => {
-        tester.onRequest = () => {
-          tester.respond(500, {});
-        };
-        let restart = kernel.restart();
-        expectFailure(restart, done, '');
-      });
-
-      it('should throw an error for an invalid response', (done) => {
-        tester.onRequest = () => {
-          tester.respond(205, { id: kernel.id, name: kernel.name });
-        };
-        let restart = kernel.restart();
-        expectAjaxError(restart, done, 'Invalid Status: 205');
-      });
-
-      it('should throw an error for an error response', (done) => {
-        tester.onRequest = () => {
-          tester.respond(500, { });
-        };
-        let restart = kernel.restart();
-        expectFailure(restart, done, '');
-      });
-
-      it('should throw an error for an invalid id', (done) => {
-        tester.onRequest = () => {
-          tester.respond(200, { });
-        };
-        let restart = kernel.restart();
-        expectFailure(restart, done);
-      });
-
-      it('should dispose of existing comm and future objects', (done) => {
-        let comm = kernel.connectToComm('test');
-        let future = kernel.requestExecute({ code: 'foo' });
-        tester.runningKernels = [{ id: kernel.id, name: kernel.name }];
-        kernel.restart().then(() => {
-          expect(comm.isDisposed).to.be(true);
-          expect(future.isDisposed).to.be(true);
-          done();
-        });
-      });
-
-    });
-
-    describe('#reconnect()', () => {
-
-      it('should reconnect the websocket', (done) => {
-        kernel.ready.then(() => {
-          return kernel.reconnect();
-        }).then(() => {
-          done();
-        }).catch(done);
-      });
-
-      it("should emit a `'reconnecting'` status", (done) => {
-        let called = false;
-        kernel.ready.then(() => {
-          return kernel.reconnect();
-        }).then(() => {
-          expect(called).to.be(true);
-          done();
-        }).catch(done);
-        kernel.statusChanged.connect(() => {
-          if (kernel.status === 'reconnecting') {
-            called = true;
-          }
-        });
-      });
-
-    });
-
-    context('#shutdown()', () => {
-
-      it('should shut down and resolve with a valid server response', (done) => {
-        kernel.shutdown().then(() => { done(); });
-      });
-
-      it('should throw an error for an invalid response', (done) => {
-        tester.onRequest = () => {
-          tester.respond(200, { id: uuid(), name: KERNEL_OPTIONS.name });
-        };
-        let shutdown = kernel.shutdown();
-        expectAjaxError(shutdown, done, 'Invalid Status: 200');
-      });
-
-      it('should handle a 404 error', (done) => {
-        tester.onRequest = () => {
-          tester.respond(404, { });
-        };
-        kernel.shutdown().then(done, done);
-      });
-
-      it('should throw an error for an error response', (done) => {
-        tester.onRequest = () => {
-          tester.respond(500, { });
-        };
-        let shutdown = kernel.shutdown();
-        expectFailure(shutdown, done, '');
-      });
-
-      it('should fail if the kernel is dead', (done) => {
-        tester.sendStatus('dead');
-        kernel.statusChanged.connect(() => {
-          if (kernel.status === 'dead') {
-            expectFailure(kernel.shutdown(), done, 'Kernel is dead');
-          }
-        });
-      });
-
-      it('should dispose of all kernel instances', (done) => {
-        let kernel2: Kernel.IKernel;
-        Kernel.connectTo(kernel.id).then(k => {
-          kernel2 = k;
-          return kernel.shutdown();
-        }).then(() => {
-          expect(kernel2.isDisposed).to.be(true);
-          done();
-        }).catch(done);
-      });
-
-    });
-
-    context('#requestKernelInfo()', () => {
-
-      it('should resolve the promise', (done) => {
-        // resolved by KernelTester
-        kernel.requestKernelInfo().then((msg) => {
-          let name = msg.content.language_info.name;
-          expect(name).to.be(EXAMPLE_KERNEL_INFO.language_info.name);
-          done();
-        });
-      });
-    });
-
-    context('#requestComplete()', () => {
-
-      it('should resolve the promise', (done) => {
-        let options: KernelMessage.ICompleteRequest = {
-          code: 'hello',
-          cursor_pos: 4
-        };
-        tester.onMessage((msg) => {
-          expect(msg.header.msg_type).to.be('complete_request');
-          msg.parent_header = msg.header;
-          tester.send(msg);
-        });
-        kernel.requestComplete(options).then(() => { done(); });
-      });
-
-      it('should reject the promise if the kernel is dead', (done) => {
-        let options: KernelMessage.ICompleteRequest = {
-          code: 'hello',
-          cursor_pos: 4
-        };
-        tester.sendStatus('dead');
-        kernel.statusChanged.connect(() => {
-          if (kernel.status === 'dead') {
-            let promise = kernel.requestComplete(options);
-            expectFailure(promise, done, 'Kernel is dead');
-          }
-        });
-      });
-    });
-
-    context('#requestInspect()', () => {
-
-      it('should resolve the promise', (done) => {
-        let options: KernelMessage.IInspectRequest = {
-          code: 'hello',
-          cursor_pos: 4,
-          detail_level: 0
-        };
-        tester.onMessage((msg) => {
-          expect(msg.header.msg_type).to.be('inspect_request');
-          msg.parent_header = msg.header;
-          tester.send(msg);
-        });
-        kernel.requestInspect(options).then(() => { done(); });
-      });
-
-    });
-
-    context('#requestIsComplete()', () => {
-
-      it('should resolve the promise', (done) => {
-        let options: KernelMessage.IIsCompleteRequest = {
-          code: 'hello'
-        };
-        let promise = kernel.requestIsComplete(options);
-        tester.onMessage((msg) => {
-          expect(msg.header.msg_type).to.be('is_complete_request');
-          msg.parent_header = msg.header;
-          tester.send(msg);
-        });
-        promise.then(() => { done(); });
-      });
-
-    });
-
-    context('#requestHistory()', () => {
-
-      it('should resolve the promise', (done) => {
-        let options: KernelMessage.IHistoryRequest = {
-          output: true,
-          raw: true,
-          hist_access_type: 'search',
-          session: 0,
-          start: 1,
-          stop: 2,
-          n: 1,
-          pattern: '*',
-          unique: true,
-        };
-        let promise = kernel.requestHistory(options);
-        tester.onMessage((msg) => {
-          expect(msg.header.msg_type).to.be('history_request');
-          msg.parent_header = msg.header;
-          tester.send(msg);
-        });
-        promise.then(() => { done(); });
-      });
-    });
-
-    context('#sendInputReply()', () => {
-
-      it('should resolve the promise', (done) => {
-        kernel.sendInputReply({ value: 'test' });
-        tester.onMessage((msg) => {
-          expect(msg.header.msg_type).to.be('input_reply');
-          done();
-        });
-      });
-
-      it('should fail if the kernel is dead', (done) => {
-        tester.sendStatus('dead');
-        kernel.statusChanged.connect(() => {
-          try {
-            kernel.sendInputReply({ value: 'test' });
-          } catch (err) {
-            expect(err.message).to.be('Kernel is dead');
-            done();
-          }
-        });
-      });
-    });
-
-    context('#requestExecute()', () => {
-
-      it('should send and handle incoming messages', (done) => {
-        let newMsg: KernelMessage.IMessage;
-        let content: KernelMessage.IExecuteRequest = {
-          code: 'test',
-          silent: false,
-          store_history: true,
-          user_expressions: {},
-          allow_stdin: false,
-          stop_on_error: false
-        };
-        let future = kernel.requestExecute(content);
-        expect(future.onDone).to.be(null);
-        expect(future.onStdin).to.be(null);
-        expect(future.onReply).to.be(null);
-        expect(future.onIOPub).to.be(null);
-
-        let options: KernelMessage.IOptions = {
-          msgType: 'custom',
-          channel: 'shell',
-          username: kernel.username,
-          session: kernel.clientId
-        };
-
-        tester.onMessage((msg) => {
-          expect(msg.channel).to.be('shell');
-
-          // send a reply
-          options.channel = 'shell';
-          newMsg = KernelMessage.createMessage(options);
-          newMsg.parent_header = msg.header;
-          tester.send(newMsg);
-
-          future.onReply = () => {
-            // trigger onStdin
-            options.channel = 'stdin';
-            newMsg = KernelMessage.createMessage(options);
-            newMsg.parent_header = msg.header;
-            tester.send(newMsg);
-          };
-
-          future.onStdin = () => {
-            // trigger onIOPub with a 'stream' message
-            options.channel = 'iopub';
-            options.msgType = 'stream';
-            let streamContent: JSONObject = { name: 'stdout', text: '' };
-            newMsg = KernelMessage.createMessage(options, streamContent);
-            newMsg.parent_header = msg.header;
-            tester.send(newMsg);
-          };
-
-          future.onIOPub = (ioMsg) => {
-            if (ioMsg.header.msg_type === 'stream') {
-              // trigger onDone
-              options.msgType = 'status';
-              newMsg = KernelMessage.createMessage(options, { execution_state: 'idle' });
-              newMsg.parent_header = msg.header;
-              tester.send(newMsg);
-            }
-          };
-
-          future.onDone = () => {
-            doLater(() => {
-              expect(future.isDisposed).to.be(true);
-              done();
-            });
-          };
-        });
-
-      });
-
-      it('should not dispose of KernelFuture when disposeOnDone=false', (done) => {
-        let options: KernelMessage.IExecuteRequest = {
-          code: 'test',
-          silent: false,
-          store_history: true,
-          user_expressions: {},
-          allow_stdin: false,
-          stop_on_error: false
-        };
-        let future = kernel.requestExecute(options, false);
-        expect(future.onDone).to.be(null);
-        expect(future.onStdin).to.be(null);
-        expect(future.onReply).to.be(null);
-        expect(future.onIOPub).to.be(null);
-
-        tester.onMessage((msg) => {
-          expect(msg.channel).to.be('shell');
-
-          // send a reply
-          msg.parent_header = msg.header;
-          msg.channel = 'shell';
-          tester.send(msg);
-
-          future.onReply = () => {
-            // trigger onIOPub with a 'stream' message
-            msg.channel = 'iopub';
-            msg.header.msg_type = 'stream';
-            msg.content = { 'name': 'stdout', 'text': 'foo' };
-            tester.send(msg);
-          };
-
-          future.onIOPub = () => {
-            if (msg.header.msg_type === 'stream') {
-              // trigger onDone
-              msg.header.msg_type = 'status';
-              (msg as KernelMessage.IStatusMsg).content.execution_state = 'idle';
-              tester.send(msg);
-            }
-          };
-
-          future.onDone = () => {
-            doLater(() => {
-              expect(future.isDisposed).to.be(false);
-              expect(future.onDone).to.be(null);
-              expect(future.onIOPub).to.not.be(null);
-              future.dispose();
-              expect(future.onIOPub).to.be(null);
-              expect(future.isDisposed).to.be(true);
-              done();
-            });
-          };
-
-        });
-      });
-
-    });
-
-    context('#registerMessageHook()', () => {
-
-      it('should have the most recently registered hook run first', (done) => {
-        let options: KernelMessage.IExecuteRequest = {
-          code: 'test',
-          silent: false,
-          store_history: true,
-          user_expressions: {},
-          allow_stdin: false,
-          stop_on_error: false
-        };
-        let future = kernel.requestExecute(options, false);
-        tester.onMessage((message) => {
-          // send a reply
-          let parent_header = message.header;
-          let msg = createMsg('shell', parent_header);
-          tester.send(msg);
-
-          future.onReply = () => {
-            // trigger onIOPub with a 'stream' message
-            let msgStream = createMsg('iopub', parent_header);
-            msgStream.header.msg_type = 'stream';
-            msgStream.content = { 'name': 'stdout', 'text': 'foo' };
-            tester.send(msgStream);
-            // trigger onDone
-            let msgDone = createMsg('iopub', parent_header);
-            msgDone.header.msg_type = 'status';
-            (msgDone as KernelMessage.IStatusMsg).content.execution_state = 'idle';
-            tester.send(msgDone);
-          };
-
-          let calls: string[] = [];
-          kernel.registerMessageHook(parent_header.msg_id, (msg) => {
-            calls.push('last');
-            return true;
-          });
-
-          kernel.registerMessageHook(parent_header.msg_id, (msg) => {
-            calls.push('first');
-            // not returning should also continue handling
-            return void 0;
-          });
-
-          future.onIOPub = () => {
-            calls.push('iopub')
-          };
-
-          future.onDone = () => {
-            // the last hook was called for the stream and the status message.
-            expect(calls).to.eql(['first', 'last', 'iopub', 'first', 'last', 'iopub']);
-            doLater(() => {
-              done();
-            });
-          };
-        });
-      });
-
-      it('should abort processing if a hook returns false, but the done logic should still work', (done) => {
-        let options: KernelMessage.IExecuteRequest = {
-          code: 'test',
-          silent: false,
-          store_history: true,
-          user_expressions: {},
-          allow_stdin: false,
-          stop_on_error: false
-        };
-        let future = kernel.requestExecute(options, false);
-        tester.onMessage((message) => {
-          // send a reply
-          let parent_header = message.header;
-          let msg = createMsg('shell', parent_header);
-          tester.send(msg);
-
-          future.onReply = () => {
-            // trigger onIOPub with a 'stream' message
-            let msgStream = createMsg('iopub', parent_header);
-            msgStream.header.msg_type = 'stream';
-            msgStream.content = { 'name': 'stdout', 'text': 'foo' };
-            tester.send(msgStream);
-            // trigger onDone
-            let msgDone = createMsg('iopub', parent_header);
-            msgDone.header.msg_type = 'status';
-            (msgDone as KernelMessage.IStatusMsg).content.execution_state = 'idle';
-            tester.send(msgDone);
-          };
-
-          let calls: string[] = [];
-          kernel.registerMessageHook(parent_header.msg_id, (msg) => {
-            calls.push('last');
-            return true;
-          });
-
-          kernel.registerMessageHook(parent_header.msg_id, (msg) => {
-            calls.push('first');
-            return false;
-          });
-
-          future.onIOPub = () => {
-            calls.push('iopub')
-          };
-
-          future.onDone = () => {
-            // the last hook was called for the stream and the status message.
-            expect(calls).to.eql(['first', 'first']);
-            doLater(() => {
-              done();
-            });
-          };
-        });
-      });
-
-      it('should process additions on the next run', (done) => {
-        let options: KernelMessage.IExecuteRequest = {
-          code: 'test',
-          silent: false,
-          store_history: true,
-          user_expressions: {},
-          allow_stdin: false,
-          stop_on_error: false
-        };
-        let future = kernel.requestExecute(options, false);
-        tester.onMessage((message) => {
-          // send a reply
-          let parent_header = message.header;
-          let msg = createMsg('shell', parent_header);
-          tester.send(msg);
-
-          future.onReply = () => {
-            // trigger onIOPub with a 'stream' message
-            let msgStream = createMsg('iopub', parent_header);
-            msgStream.header.msg_type = 'stream';
-            msgStream.content = { 'name': 'stdout', 'text': 'foo' };
-            tester.send(msgStream);
-            // trigger onDone
-            let msgDone = createMsg('iopub', parent_header);
-            msgDone.header.msg_type = 'status';
-            (msgDone as KernelMessage.IStatusMsg).content.execution_state = 'idle';
-            tester.send(msgDone);
-          };
-
-          let calls: string[] = [];
-          kernel.registerMessageHook(parent_header.msg_id, (msg) => {
-            calls.push('last');
-            kernel.registerMessageHook(parent_header.msg_id, (msg) => {
-              calls.push('first');
-              return true;
-            });
-            return true;
-          });
-
-          future.onIOPub = () => {
-            calls.push('iopub')
-          };
-
-          future.onDone = () => {
-            expect(calls).to.eql(['last', 'iopub', 'first', 'last', 'iopub']);
-            doLater(() => {
-              done();
-            });
-          };
-        });
-      });
-
-      it('should deactivate a hook immediately on removal', (done) => {
-        let options: KernelMessage.IExecuteRequest = {
-          code: 'test',
-          silent: false,
-          store_history: true,
-          user_expressions: {},
-          allow_stdin: false,
-          stop_on_error: false
-        };
-        let future = kernel.requestExecute(options, false);
-        tester.onMessage((message) => {
-          // send a reply
-          let parent_header = message.header;
-          let msg = createMsg('shell', parent_header);
-          tester.send(msg);
-
-          future.onReply = () => {
-            // trigger onIOPub with a 'stream' message
-            let msgStream = createMsg('iopub', parent_header);
-            msgStream.header.msg_type = 'stream';
-            msgStream.content = { 'name': 'stdout', 'text': 'foo' };
-            tester.send(msgStream);
-            // trigger onDone
-            let msgDone = createMsg('iopub', parent_header);
-            msgDone.header.msg_type = 'status';
-            (msgDone as KernelMessage.IStatusMsg).content.execution_state = 'idle';
-            tester.send(msgDone);
-          };
-
-          let calls: string[] = [];
-          let toDelete = (msg: KernelMessage.IIOPubMessage) => {
-            calls.push('delete');
-            return true;
-          }
-          let toDeleteHook = kernel.registerMessageHook(parent_header.msg_id, toDelete);
-
-          kernel.registerMessageHook(parent_header.msg_id, (msg) => {
-            if (calls.length > 0) {
-              // delete the hook the second time around
-              toDeleteHook.dispose();
-            }
-            calls.push('first');
-            return true;
-          });
-
-          future.onIOPub = () => {
-            calls.push('iopub')
-          };
-
-          future.onDone = () => {
-            expect(calls).to.eql(['first', 'delete', 'iopub', 'first', 'iopub']);
-            doLater(() => {
-              done();
-            });
-          };
-        });
-      });
-
-    });
-  });
-
-  describe('IFuture', () => {
-
-    beforeEach((done) => {
-      Kernel.startNew().then(k => {
-        kernel = k;
-        done();
-      }).catch(done);
-    });
-
-    it('should have a msg attribute', () => {
-      let future = kernel.requestExecute({ code: 'hello' });
-      expect(typeof future.msg.header.msg_id).to.be('string');
-    });
-
-    describe('Message hooks', () => {
-
-      it('should have the most recently registered hook run first', (done) => {
-        let options: KernelMessage.IExecuteRequest = {
-          code: 'test',
-          silent: false,
-          store_history: true,
-          user_expressions: {},
-          allow_stdin: false,
-          stop_on_error: false
-        };
-        let future = kernel.requestExecute(options, false);
-        tester.onMessage((message) => {
-          // send a reply
-          let parent_header = message.header;
-          let msg = createMsg('shell', parent_header);
-          tester.send(msg);
-
-          future.onReply = () => {
-            // trigger onIOPub with a 'stream' message
-            let msgStream = createMsg('iopub', parent_header);
-            msgStream.header.msg_type = 'stream';
-            msgStream.content = { 'name': 'stdout', 'text': 'foo' };
-            tester.send(msgStream);
-            // trigger onDone
-            let msgDone = createMsg('iopub', parent_header);
-            msgDone.header.msg_type = 'status';
-            (msgDone as KernelMessage.IStatusMsg).content.execution_state = 'idle';
-            tester.send(msgDone);
-          };
-
-          let calls: string[] = [];
-          future.registerMessageHook((msg) => {
-            calls.push('last');
-            return true;
-          });
-
-          future.registerMessageHook((msg) => {
-            calls.push('first');
-            // Check to make sure we actually got the messages we expected.
-            if (msg.header.msg_type === 'stream') {
-              expect((msg as KernelMessage.IStreamMsg).content.text).to.be('foo1');
-            } else {
-              expect((msg as KernelMessage.IStatusMsg).content.execution_state).to.be('idle');
-            }
-            // not returning should also continue handling
-            return void 0;
-          });
-
-          future.onIOPub = () => {
-            calls.push('iopub')
-          };
-
-          future.onDone = () => {
-            // the last hook was called for the stream and the status message.
-            expect(calls).to.eql(['first', 'last', 'iopub', 'first', 'last', 'iopub']);
-            doLater(() => {
-              done();
-            });
-          };
-        });
-      });
-
-      it('should abort processing if a hook returns false, but the done logic should still work', (done) => {
-        let options: KernelMessage.IExecuteRequest = {
-          code: 'test',
-          silent: false,
-          store_history: true,
-          user_expressions: {},
-          allow_stdin: false,
-          stop_on_error: false
-        };
-        let future = kernel.requestExecute(options, false);
-        tester.onMessage((message) => {
-          // send a reply
-          let parent_header = message.header;
-          let msg = createMsg('shell', parent_header);
-          tester.send(msg);
-
-          future.onReply = () => {
-            // trigger onIOPub with a 'stream' message
-            let msgStream = createMsg('iopub', parent_header);
-            msgStream.header.msg_type = 'stream';
-            msgStream.content = { 'name': 'stdout', 'text': 'foo' };
-            tester.send(msgStream);
-            // trigger onDone
-            let msgDone = createMsg('iopub', parent_header);
-            msgDone.header.msg_type = 'status';
-            (msgDone as KernelMessage.IStatusMsg).content.execution_state = 'idle';
-            tester.send(msgDone);
-          };
-
-          let calls: string[] = [];
-          future.registerMessageHook((msg) => {
-            calls.push('last');
-            return true;
-          });
-
-          future.registerMessageHook((msg) => {
-            calls.push('first');
-            return false;
-          });
-
-          future.onIOPub = () => {
-            calls.push('iopub')
-          };
-
-          future.onDone = () => {
-            // the last hook was called for the stream and the status message.
-            expect(calls).to.eql(['first', 'first']);
-            doLater(() => {
-              done();
-            });
-          };
-        });
-      });
-
-      it('should process additions on the next run', (done) => {
-        let options: KernelMessage.IExecuteRequest = {
-          code: 'test',
-          silent: false,
-          store_history: true,
-          user_expressions: {},
-          allow_stdin: false,
-          stop_on_error: false
-        };
-        let future = kernel.requestExecute(options, false);
-        tester.onMessage((message) => {
-          // send a reply
-          let parent_header = message.header;
-          let msg = createMsg('shell', parent_header);
-          tester.send(msg);
-
-          future.onReply = () => {
-            // trigger onIOPub with a 'stream' message
-            let msgStream = createMsg('iopub', parent_header);
-            msgStream.header.msg_type = 'stream';
-            msgStream.content = { 'name': 'stdout', 'text': 'foo' };
-            tester.send(msgStream);
-            // trigger onDone
-            let msgDone = createMsg('iopub', parent_header);
-            msgDone.header.msg_type = 'status';
-            (msgDone as KernelMessage.IStatusMsg).content.execution_state = 'idle';
-            tester.send(msgDone);
-          };
-
-          let calls: string[] = [];
-          future.registerMessageHook((msg) => {
-            calls.push('last');
-            future.registerMessageHook((msg) => {
-              calls.push('first');
-              return true;
-            });
-            return true;
-          });
-
-          future.onIOPub = () => {
-            calls.push('iopub')
-          };
-
-          future.onDone = () => {
-            expect(calls).to.eql(['last', 'iopub', 'first', 'last', 'iopub']);
-            doLater(() => {
-              done();
-            });
-          };
-        });
-      });
-
-      it('should deactivate message hooks immediately on removal', (done) => {
-        let options: KernelMessage.IExecuteRequest = {
-          code: 'test',
-          silent: false,
-          store_history: true,
-          user_expressions: {},
-          allow_stdin: false,
-          stop_on_error: false
-        };
-        let future = kernel.requestExecute(options, false);
-        tester.onMessage((message) => {
-          // send a reply
-          let parent_header = message.header;
-          let msg = createMsg('shell', parent_header);
-          tester.send(msg);
-
-          future.onReply = () => {
-            // trigger onIOPub with a 'stream' message
-            let msgStream = createMsg('iopub', parent_header);
-            msgStream.header.msg_type = 'stream';
-            msgStream.content = { 'name': 'stdout', 'text': 'foo' };
-            tester.send(msgStream);
-            // trigger onDone
-            let msgDone = createMsg('iopub', parent_header);
-            msgDone.header.msg_type = 'status';
-            (msgDone as KernelMessage.IStatusMsg).content.execution_state = 'idle';
-            tester.send(msgDone);
-          };
-
-          let calls: string[] = [];
-          let toDelete = (msg: KernelMessage.IIOPubMessage) => {
-            calls.push('delete');
-            return true;
-          }
-          future.registerMessageHook(toDelete);
-
-          let first = (msg: KernelMessage.IIOPubMessage) => {
-            if (calls.length > 0) {
-              // delete the hook the second time around
-              future.removeMessageHook(toDelete);
-            }
-            calls.push('first');
-            return true;
-          }
-          future.registerMessageHook(first);
-
-          future.onIOPub = () => {
-            calls.push('iopub')
-          };
-
-          future.onDone = () => {
-            expect(calls).to.eql(['first', 'delete', 'iopub', 'first', 'iopub']);
-            doLater(() => {
-              future.dispose();
-              future.removeMessageHook(first);
-              done();
-            });
-          };
-        });
-      });
-
-    });
-  });
-
-  describe('Kernel.getSpecs()', () => {
-
-    it('should load the kernelspecs', (done) => {
-      let ids = {
-        'python': PYTHON_SPEC,
-        'python3': PYTHON3_SPEC
-      };
-      tester.specs =  { 'default': 'python',
-                        'kernelspecs': ids };
-      Kernel.getSpecs().then(specs => {
-        let names = Object.keys(specs.kernelspecs);
-        expect(names[0]).to.be('python');
-        expect(names[1]).to.be('python3');
-        done();
-      }).catch(done);
-    });
-
-    it('should accept ajax options', (done) => {
-      let ids = {
-        'python': PYTHON_SPEC,
-        'python3': PYTHON3_SPEC
-      };
-      tester.specs = { 'default': 'python',
-                       'kernelspecs': ids };
-      Kernel.getSpecs(serverSettings).then(specs => {
-        let names = Object.keys(specs.kernelspecs);
-        expect(names[0]).to.be('python');
-        expect(names[1]).to.be('python3');
-        done();
-      }).catch(done);
-    });
-
-    it('should handle a missing default parameter', (done) => {
-      tester.onRequest = () => {
-        tester.respond(200, { 'kernelspecs': { 'python': PYTHON_SPEC } });
-      };
-      Kernel.getSpecs().then(specs => {
-        expect(specs.default).to.be('python');
-      }).then(done, done);
-    });
-
-    it('should throw for a missing kernelspecs parameter', (done) => {
-      tester.onRequest = () => {
-        tester.respond(200, { 'default': PYTHON_SPEC.name });
-      };
-      let promise = Kernel.getSpecs();
-      expectAjaxError(promise, done, 'No kernelspecs found');
-    });
-
-    it('should omit an invalid kernelspec', (done) => {
-      let R_SPEC = JSON.parse(JSON.stringify(PYTHON_SPEC));
-      R_SPEC.name = 1;
-      tester.onRequest = () => {
-        tester.respond(200, { 'default': 'python',
-                               'kernelspecs': { 'R': R_SPEC,
-                                                'python': PYTHON_SPEC }
-        });
-      };
-      Kernel.getSpecs().then(specs => {
-        expect(specs.default).to.be('python');
-        expect(specs.kernelspecs['R']).to.be(void 0);
-      }).then(done, done);
-    });
-
-    it('should handle an improper name', (done) => {
-      let R_SPEC = JSON.parse(JSON.stringify(PYTHON_SPEC));
-      R_SPEC.name = 1;
-      tester.onRequest = () => {
-        tester.respond(200, { 'default': 'R',
-                               'kernelspecs': { 'R': R_SPEC } });
-      };
-      let promise = Kernel.getSpecs();
-      expectAjaxError(promise, done, 'No valid kernelspecs found');
-    });
-
-    it('should handle an improper language', (done) => {
-      let R_SPEC = JSON.parse(JSON.stringify(PYTHON_SPEC));
-      R_SPEC.spec.language = 1;
-      tester.onRequest = () => {
-        tester.respond(200, { 'default': 'R',
-                             'kernelspecs': { 'R': R_SPEC } });
-      };
-      let promise = Kernel.getSpecs();
-      expectAjaxError(promise, done, 'No valid kernelspecs found');
-    });
-
-    it('should handle an improper argv', (done) => {
-      let R_SPEC = JSON.parse(JSON.stringify(PYTHON_SPEC));
-      R_SPEC.spec.argv = 'hello';
-      tester.onRequest = () => {
-        tester.respond(200, { 'default': 'R',
-                               'kernelspecs': { 'R': R_SPEC } });
-      };
-      let promise = Kernel.getSpecs();
-      expectAjaxError(promise, done, 'No valid kernelspecs found');
-    });
-
-    it('should handle an improper display_name', (done) => {
-      let R_SPEC = JSON.parse(JSON.stringify(PYTHON_SPEC));
-      R_SPEC.spec.display_name = ['hello'];
-      tester.onRequest = () => {
-        tester.respond(200, { 'default': 'R',
-                               'kernelspecs': { 'R': R_SPEC } });
-      };
-      let promise = Kernel.getSpecs();
-      expectAjaxError(promise, done, 'No valid kernelspecs found');
-    });
-
-    it('should handle missing resources', (done) => {
-      let R_SPEC = JSON.parse(JSON.stringify(PYTHON_SPEC));
-      delete R_SPEC.resources;
-      tester.onRequest = () => {
-        tester.respond(200, { 'default': 'R',
-                             'kernelspecs': { 'R': R_SPEC } });
-      };
-      let promise = Kernel.getSpecs();
-      expectAjaxError(promise, done, 'No valid kernelspecs found');
-    });
-
-    it('should throw an error for an invalid response', (done) => {
-      tester.onRequest = () => {
-        tester.respond(201, { });
-      };
-      let promise = Kernel.getSpecs();
-      expectAjaxError(promise, done, 'Invalid Status: 201');
-    });
-
-  });
+  // describe('Kernel.connectTo()', () => {
+
+  //   it('should reuse an exisiting kernel', (done) => {
+  //     let id = uuid();
+  //     tester.runningKernels = [{ name: 'foo', id }];
+  //     Kernel.connectTo(id).then(k => {
+  //       kernel = k;
+  //       Kernel.connectTo(id).then(newKernel => {
+  //         expect(newKernel.name).to.be(kernel.name);
+  //         expect(newKernel.id).to.be(kernel.id);
+  //         newKernel.dispose();
+  //         done();
+  //       });
+  //     });
+  //   });
+
+  //   it('should connect to a running kernel if given kernel options', (done) => {
+  //     let id = uuid();
+  //     tester.runningKernels = [{ name: KERNEL_OPTIONS.name, id }];
+  //     Kernel.connectTo(id).then(k => {
+  //       kernel = k;
+  //       expect(kernel.name).to.be(KERNEL_OPTIONS.name);
+  //       expect(kernel.id).to.be(id);
+  //       done();
+  //     }).catch(done);
+  //   });
+
+  //   it('should accept server settings', (done) => {
+  //     let id = uuid();
+  //     tester.runningKernels = [{ name: KERNEL_OPTIONS.name, id }];
+  //     Kernel.connectTo(id, serverSettings).then(k => {
+  //       kernel = k;
+  //       expect(kernel.name).to.be(KERNEL_OPTIONS.name);
+  //       expect(kernel.id).to.be(id);
+  //       done();
+  //     }).catch(done);
+  //   });
+
+  //   it('should fail if no running kernel available', (done) => {
+  //     let id = uuid();
+  //     tester.onRequest = () => {
+  //       tester.respond(400, { });
+  //     };
+  //     let kernelPromise = Kernel.connectTo(id);
+  //     expectFailure(kernelPromise, done, 'No running kernel with id: ' + id);
+  //   });
+
+  // });
+
+  // describe('Kernel.shutdown()', () => {
+
+  //   it('should shut down a kernel by id', (done) => {
+  //     Kernel.shutdown('foo').then(done, done);
+  //   });
+
+  //   it('should handle a 404 error', (done) => {
+  //     tester.onRequest = () => {
+  //       tester.respond(404, { });
+  //     };
+  //     Kernel.shutdown('foo').then(done, done);
+  //   });
+
+  // });
+
+  // describe('Kernel.IKernel', () => {
+
+  //   beforeEach((done) => {
+  //     Kernel.startNew().then(k => {
+  //       kernel = k;
+  //       return kernel.ready;
+  //     }).then(() => {
+  //       done();
+  //     }).catch(done);
+  //   });
+
+  //   context('#terminated', () => {
+
+  //     it('should be emitted when the kernel is shut down', (done) => {
+  //       kernel.terminated.connect((sender, args) => {
+  //         expect(sender).to.be(kernel);
+  //         expect(args).to.be(void 0);
+  //         done();
+  //       });
+  //       kernel.shutdown();
+  //     });
+
+  //   });
+
+  //   context('#statusChanged', () => {
+
+  //     it('should be a signal following the Kernel status', (done) => {
+  //       kernel.statusChanged.connect(() => {
+  //         if (kernel.status === 'busy') {
+  //           done();
+  //         }
+  //       });
+  //       tester.sendStatus('busy');
+  //     });
+
+  //   });
+
+  //   context('#iopubMessage', () => {
+
+  //     it('should be emitted for an iopub message', (done) => {
+  //       kernel.iopubMessage.connect((k, msg) => {
+  //         expect(msg.header.msg_type).to.be('status');
+  //         done();
+  //       });
+  //       let msg = KernelMessage.createMessage({
+  //         msgType: 'status',
+  //         channel: 'iopub',
+  //         session: kernel.clientId
+  //       }) as KernelMessage.IStatusMsg;
+  //       msg.content.execution_state = 'idle';
+  //       msg.parent_header = msg.header;
+  //       tester.send(msg);
+  //     });
+
+  //     it('should be emitted regardless of the sender', (done) => {
+  //       kernel.iopubMessage.connect((k, msg) => {
+  //         expect(msg.header.msg_type).to.be('status');
+  //         done();
+  //       });
+  //       let msg = KernelMessage.createMessage({
+  //         msgType: 'status',
+  //         channel: 'iopub',
+  //         session: 'baz'
+  //       }) as KernelMessage.IStatusMsg;
+  //       msg.content.execution_state = 'idle';
+  //       msg.parent_header = msg.header;
+  //       tester.send(msg);
+  //     });
+
+  //   });
+
+  //   context('#unhandledMessage', () => {
+
+  //     it('should be emitted for an unhandled message', (done) => {
+  //       kernel.unhandledMessage.connect((k, msg) => {
+  //         expect(msg.header.msg_type).to.be('foo');
+  //         done();
+  //       });
+  //       let msg = KernelMessage.createShellMessage({
+  //         msgType: 'foo',
+  //         channel: 'shell',
+  //         session: kernel.clientId
+  //       });
+  //       msg.parent_header = msg.header;
+  //       tester.send(msg);
+  //     });
+
+  //     it('should not be emitted for an iopub signal', () => {
+  //       let called = false;
+  //       kernel.unhandledMessage.connect((k, msg) => {
+  //         called = true;
+  //       });
+  //       let msg = KernelMessage.createMessage({
+  //         msgType: 'status',
+  //         channel: 'iopub',
+  //         session: kernel.clientId
+  //       }) as KernelMessage.IStatusMsg;
+  //       msg.content.execution_state = 'idle';
+  //       msg.parent_header = msg.header;
+  //       tester.send(msg);
+  //       expect(called).to.be(false);
+  //     });
+
+  //     it('should not be emitted for a different client session', () => {
+  //       let called = false;
+  //       kernel.unhandledMessage.connect((k, msg) => {
+  //         called = true;
+  //       });
+  //       let msg = KernelMessage.createShellMessage({
+  //         msgType: 'foo',
+  //         channel: 'shell',
+  //         session: 'baz'
+  //       });
+  //       msg.parent_header = msg.header;
+  //       tester.send(msg);
+  //       expect(called).to.be(false);
+  //     });
+
+  //   });
+
+  //   context('#id', () => {
+
+  //     it('should be a string', () => {
+  //       expect(typeof kernel.id).to.be('string');
+  //     });
+
+  //   });
+
+  //   context('#name', () => {
+
+  //     it('should be a string', () => {
+  //       expect(typeof kernel.name).to.be('string');
+  //     });
+
+  //   });
+
+  //   context('#model', () => {
+
+  //     it('should be an IModel', () => {
+  //       let model = kernel.model;
+  //       expect(typeof model.name).to.be('string');
+  //       expect(typeof model.id).to.be('string');
+  //     });
+
+  //   });
+
+  //   context('#username', () => {
+
+  //     it('should be a string', () => {
+  //       expect(typeof kernel.username).to.be('string');
+  //     });
+
+  //   });
+
+  //   context('#serverSettings', () => {
+
+  //     it('should be the server settings', () => {
+  //       expect(kernel.serverSettings.baseUrl).to.be(PageConfig.getBaseUrl());
+  //     });
+
+  //   });
+
+  //   context('#clientId', () => {
+
+  //     it('should be a string', () => {
+  //       expect(typeof kernel.clientId).to.be('string');
+  //     });
+  //   });
+
+  //   context('#status', () => {
+
+  //     it('should get an idle status', (done) => {
+  //       kernel.statusChanged.connect(() => {
+  //         if (kernel.status === 'idle') {
+  //           done();
+  //         }
+  //       });
+  //       tester.sendStatus('idle');
+  //     });
+
+  //     it('should get a restarting status', (done) => {
+  //       kernel.statusChanged.connect(() => {
+  //         if (kernel.status === 'restarting') {
+  //           done();
+  //         }
+  //       });
+  //       tester.sendStatus('restarting');
+  //     });
+
+  //     it('should get a busy status', (done) => {
+  //       kernel.statusChanged.connect(() => {
+  //         if (kernel.status === 'busy') {
+  //           done();
+  //         }
+  //       });
+  //       tester.sendStatus('busy');
+  //     });
+
+  //     it('should get a reconnecting status', (done) => {
+  //       kernel.statusChanged.connect(() => {
+  //         if (kernel.status === 'reconnecting') {
+  //           done();
+  //         }
+  //       });
+  //       tester.close();
+  //     });
+
+  //     it('should get a dead status', (done) => {
+  //       kernel.statusChanged.connect(() => {
+  //         if (kernel.status === 'dead') {
+  //           done();
+  //         }
+  //       });
+  //       tester.sendStatus('dead');
+  //     });
+
+  //     it('should handle an invalid status', (done) => {
+  //       kernel.statusChanged.connect(() => {
+  //         if (kernel.status === 'idle') {
+  //           done();
+  //         }
+  //       });
+  //       tester.sendStatus('celebrating');
+  //       tester.sendStatus('idle');
+  //     });
+  //   });
+
+  //   context('#info', () => {
+
+  //     it('should get the kernel info', () => {
+  //       return kernel.ready.then(() => {
+  //         let name = kernel.info.language_info.name;
+  //         expect(name).to.be(EXAMPLE_KERNEL_INFO.language_info.name);
+  //       });
+  //     });
+
+  //   });
+
+  //   context('#getSpec()', () => {
+
+  //     it('should resolve with the spec', () => {
+  //       return kernel.getSpec().then(spec => {
+  //         expect(spec.language).to.be('python');
+  //       });
+  //     });
+
+  //   });
+
+  //   context('#isReady', () => {
+
+  //     it('should test whether the kernel is ready', () => {
+  //       return kernel.shutdown().then (() => {
+  //         return Kernel.startNew();
+  //       }).then(k => {
+  //         kernel = k;
+  //         expect(kernel.isReady).to.be(false);
+  //         return kernel.ready;
+  //       }).then(() => {
+  //         expect(kernel.isReady).to.be(true);
+  //       });
+  //     });
+  //   });
+
+  //   context('#ready', () => {
+
+  //     it('should resolve when the kernel is ready', () => {
+  //       return kernel.ready;
+  //     });
+
+  //   });
+
+  //   context('#isDisposed', () => {
+
+  //     it('should be true after we dispose of the kernel', () => {
+  //       expect(kernel.isDisposed).to.be(false);
+  //       kernel.dispose();
+  //       expect(kernel.isDisposed).to.be(true);
+  //     });
+
+  //     it('should be safe to call multiple times', () => {
+  //       expect(kernel.isDisposed).to.be(false);
+  //       expect(kernel.isDisposed).to.be(false);
+  //       kernel.dispose();
+  //       expect(kernel.isDisposed).to.be(true);
+  //       expect(kernel.isDisposed).to.be(true);
+  //     });
+  //   });
+
+  //   context('#dispose()', () => {
+
+  //     it('should dispose of the resources held by the kernel', () => {
+  //       let future = kernel.requestExecute({ code: 'foo' });
+  //       let comm = kernel.connectToComm('foo');
+  //       expect(future.isDisposed).to.be(false);
+  //       expect(comm.isDisposed).to.be(false);
+  //       kernel.dispose();
+  //       expect(future.isDisposed).to.be(true);
+  //       expect(comm.isDisposed).to.be(true);
+  //     });
+
+  //     it('should be safe to call twice', () => {
+  //       let future = kernel.requestExecute({ code: 'foo' });
+  //       let comm = kernel.connectToComm('foo');
+  //       expect(future.isDisposed).to.be(false);
+  //       expect(comm.isDisposed).to.be(false);
+  //       kernel.dispose();
+  //       expect(future.isDisposed).to.be(true);
+  //       expect(comm.isDisposed).to.be(true);
+  //       expect(kernel.isDisposed).to.be(true);
+  //       kernel.dispose();
+  //       expect(future.isDisposed).to.be(true);
+  //       expect(comm.isDisposed).to.be(true);
+  //       expect(kernel.isDisposed).to.be(true);
+  //     });
+  //   });
+
+  //   context('#sendShellMessage()', () => {
+
+  //     it('should send a message to the kernel', (done) => {
+  //       let options: KernelMessage.IOptions = {
+  //         msgType: 'custom',
+  //         channel: 'shell',
+  //         username: kernel.username,
+  //         session: kernel.clientId
+  //       };
+  //       let msg = KernelMessage.createShellMessage(options);
+  //       kernel.sendShellMessage(msg, true);
+  //       tester.onMessage((msg) => {
+  //         expect(msg.header.msg_type).to.be('custom');
+  //         done();
+  //       });
+  //     });
+
+  //     it('should send a binary message', (done) => {
+  //       let options: KernelMessage.IOptions = {
+  //         msgType: 'custom',
+  //         channel: 'shell',
+  //         username: kernel.username,
+  //         session: kernel.clientId
+  //       };
+  //       let encoder = new TextEncoder('utf8');
+  //       let data = encoder.encode('hello');
+  //       let msg = KernelMessage.createShellMessage(options, {}, {}, [data, data.buffer]);
+  //       kernel.sendShellMessage(msg, true);
+
+  //       tester.onMessage((msg: any) => {
+  //         let decoder = new TextDecoder('utf8');
+  //         let item = msg.buffers[0] as DataView;
+  //         expect(decoder.decode(item)).to.be('hello');
+  //         done();
+  //       });
+  //     });
+
+  //     it('should fail if the kernel is dead', (done) => {
+  //       let options: KernelMessage.IOptions = {
+  //         msgType: 'custom',
+  //         channel: 'shell',
+  //         username: kernel.username,
+  //         session: kernel.clientId
+  //       };
+  //       let msg = KernelMessage.createShellMessage(options);
+  //       tester.sendStatus('dead');
+  //       kernel.statusChanged.connect(() => {
+  //         try {
+  //           kernel.sendShellMessage(msg, true);
+  //         } catch (err) {
+  //           expect(err.message).to.be('Kernel is dead');
+  //           done();
+  //         }
+  //       });
+  //     });
+
+  //     it('should handle out of order messages', (done) => {
+  //       let options: KernelMessage.IOptions = {
+  //         msgType: 'custom',
+  //         channel: 'shell',
+  //         username: kernel.username,
+  //         session: kernel.clientId
+  //       };
+  //       let msg = KernelMessage.createShellMessage(options);
+  //       let future = kernel.sendShellMessage(msg, true);
+  //       let newMsg: KernelMessage.IMessage;
+
+  //       tester.onMessage((msg) => {
+  //         // trigger onDone
+  //         options.msgType = 'status';
+  //         options.channel = 'iopub';
+  //         newMsg = KernelMessage.createMessage(options, { execution_state: 'idle' });
+  //         newMsg.parent_header = msg.header;
+  //         tester.send(newMsg);
+
+  //         future.onIOPub = () => {
+  //           options.msgType = 'custom';
+  //           options.channel = 'shell';
+  //           newMsg = KernelMessage.createShellMessage(options);
+  //           newMsg.parent_header = msg.header;
+  //           tester.send(newMsg);
+  //         };
+
+  //         future.onDone = () => {
+  //           done();
+  //         };
+  //       });
+  //     });
+  //   });
+
+  //   context('#interrupt()', () => {
+
+  //     it('should interrupt and resolve with a valid server response', (done) => {
+  //       kernel.interrupt().then(() => { done(); });
+  //     });
+
+  //     it('should throw an error for an invalid response', (done) => {
+  //       tester.onRequest = () => {
+  //         tester.respond(200,  { id: kernel.id, name: kernel.name });
+  //       };
+  //       let interrupt = kernel.interrupt();
+  //       expectAjaxError(interrupt, done, 'Invalid Status: 200');
+  //     });
+
+  //     it('should throw an error for an error response', (done) => {
+  //       tester.onRequest = () => {
+  //         tester.respond(500, { });
+  //       };
+  //       let interrupt = kernel.interrupt();
+  //       expectFailure(interrupt, done, '');
+  //     });
+
+  //     it('should fail if the kernel is dead', (done) => {
+  //       tester.sendStatus('dead');
+  //       kernel.statusChanged.connect(() => {
+  //         if (kernel.status === 'dead') {
+  //           expectFailure(kernel.interrupt(), done, 'Kernel is dead');
+  //         }
+  //       });
+  //     });
+  //   });
+
+  //   context('#restart()', () => {
+
+  //     it('should restart and resolve with a valid server response', (done) => {
+  //       kernel.restart().then(() => { done(); });
+  //     });
+
+  //     it('should fail if the kernel does not restart', (done) => {
+  //       tester.onRequest = () => {
+  //         tester.respond(500, {});
+  //       };
+  //       let restart = kernel.restart();
+  //       expectFailure(restart, done, '');
+  //     });
+
+  //     it('should throw an error for an invalid response', (done) => {
+  //       tester.onRequest = () => {
+  //         tester.respond(205, { id: kernel.id, name: kernel.name });
+  //       };
+  //       let restart = kernel.restart();
+  //       expectAjaxError(restart, done, 'Invalid Status: 205');
+  //     });
+
+  //     it('should throw an error for an error response', (done) => {
+  //       tester.onRequest = () => {
+  //         tester.respond(500, { });
+  //       };
+  //       let restart = kernel.restart();
+  //       expectFailure(restart, done, '');
+  //     });
+
+  //     it('should throw an error for an invalid id', (done) => {
+  //       tester.onRequest = () => {
+  //         tester.respond(200, { });
+  //       };
+  //       let restart = kernel.restart();
+  //       expectFailure(restart, done);
+  //     });
+
+  //     it('should dispose of existing comm and future objects', (done) => {
+  //       let comm = kernel.connectToComm('test');
+  //       let future = kernel.requestExecute({ code: 'foo' });
+  //       tester.runningKernels = [{ id: kernel.id, name: kernel.name }];
+  //       kernel.restart().then(() => {
+  //         expect(comm.isDisposed).to.be(true);
+  //         expect(future.isDisposed).to.be(true);
+  //         done();
+  //       });
+  //     });
+
+  //   });
+
+  //   describe('#reconnect()', () => {
+
+  //     it('should reconnect the websocket', (done) => {
+  //       kernel.ready.then(() => {
+  //         return kernel.reconnect();
+  //       }).then(() => {
+  //         done();
+  //       }).catch(done);
+  //     });
+
+  //     it("should emit a `'reconnecting'` status", (done) => {
+  //       let called = false;
+  //       kernel.ready.then(() => {
+  //         return kernel.reconnect();
+  //       }).then(() => {
+  //         expect(called).to.be(true);
+  //         done();
+  //       }).catch(done);
+  //       kernel.statusChanged.connect(() => {
+  //         if (kernel.status === 'reconnecting') {
+  //           called = true;
+  //         }
+  //       });
+  //     });
+
+  //   });
+
+  //   context('#shutdown()', () => {
+
+  //     it('should shut down and resolve with a valid server response', (done) => {
+  //       kernel.shutdown().then(() => { done(); });
+  //     });
+
+  //     it('should throw an error for an invalid response', (done) => {
+  //       tester.onRequest = () => {
+  //         tester.respond(200, { id: uuid(), name: KERNEL_OPTIONS.name });
+  //       };
+  //       let shutdown = kernel.shutdown();
+  //       expectAjaxError(shutdown, done, 'Invalid Status: 200');
+  //     });
+
+  //     it('should handle a 404 error', (done) => {
+  //       tester.onRequest = () => {
+  //         tester.respond(404, { });
+  //       };
+  //       kernel.shutdown().then(done, done);
+  //     });
+
+  //     it('should throw an error for an error response', (done) => {
+  //       tester.onRequest = () => {
+  //         tester.respond(500, { });
+  //       };
+  //       let shutdown = kernel.shutdown();
+  //       expectFailure(shutdown, done, '');
+  //     });
+
+  //     it('should fail if the kernel is dead', (done) => {
+  //       tester.sendStatus('dead');
+  //       kernel.statusChanged.connect(() => {
+  //         if (kernel.status === 'dead') {
+  //           expectFailure(kernel.shutdown(), done, 'Kernel is dead');
+  //         }
+  //       });
+  //     });
+
+  //     it('should dispose of all kernel instances', (done) => {
+  //       let kernel2: Kernel.IKernel;
+  //       Kernel.connectTo(kernel.id).then(k => {
+  //         kernel2 = k;
+  //         return kernel.shutdown();
+  //       }).then(() => {
+  //         expect(kernel2.isDisposed).to.be(true);
+  //         done();
+  //       }).catch(done);
+  //     });
+
+  //   });
+
+  //   context('#requestKernelInfo()', () => {
+
+  //     it('should resolve the promise', (done) => {
+  //       // resolved by KernelTester
+  //       kernel.requestKernelInfo().then((msg) => {
+  //         let name = msg.content.language_info.name;
+  //         expect(name).to.be(EXAMPLE_KERNEL_INFO.language_info.name);
+  //         done();
+  //       });
+  //     });
+  //   });
+
+  //   context('#requestComplete()', () => {
+
+  //     it('should resolve the promise', (done) => {
+  //       let options: KernelMessage.ICompleteRequest = {
+  //         code: 'hello',
+  //         cursor_pos: 4
+  //       };
+  //       tester.onMessage((msg) => {
+  //         expect(msg.header.msg_type).to.be('complete_request');
+  //         msg.parent_header = msg.header;
+  //         tester.send(msg);
+  //       });
+  //       kernel.requestComplete(options).then(() => { done(); });
+  //     });
+
+  //     it('should reject the promise if the kernel is dead', (done) => {
+  //       let options: KernelMessage.ICompleteRequest = {
+  //         code: 'hello',
+  //         cursor_pos: 4
+  //       };
+  //       tester.sendStatus('dead');
+  //       kernel.statusChanged.connect(() => {
+  //         if (kernel.status === 'dead') {
+  //           let promise = kernel.requestComplete(options);
+  //           expectFailure(promise, done, 'Kernel is dead');
+  //         }
+  //       });
+  //     });
+  //   });
+
+  //   context('#requestInspect()', () => {
+
+  //     it('should resolve the promise', (done) => {
+  //       let options: KernelMessage.IInspectRequest = {
+  //         code: 'hello',
+  //         cursor_pos: 4,
+  //         detail_level: 0
+  //       };
+  //       tester.onMessage((msg) => {
+  //         expect(msg.header.msg_type).to.be('inspect_request');
+  //         msg.parent_header = msg.header;
+  //         tester.send(msg);
+  //       });
+  //       kernel.requestInspect(options).then(() => { done(); });
+  //     });
+
+  //   });
+
+  //   context('#requestIsComplete()', () => {
+
+  //     it('should resolve the promise', (done) => {
+  //       let options: KernelMessage.IIsCompleteRequest = {
+  //         code: 'hello'
+  //       };
+  //       let promise = kernel.requestIsComplete(options);
+  //       tester.onMessage((msg) => {
+  //         expect(msg.header.msg_type).to.be('is_complete_request');
+  //         msg.parent_header = msg.header;
+  //         tester.send(msg);
+  //       });
+  //       promise.then(() => { done(); });
+  //     });
+
+  //   });
+
+  //   context('#requestHistory()', () => {
+
+  //     it('should resolve the promise', (done) => {
+  //       let options: KernelMessage.IHistoryRequest = {
+  //         output: true,
+  //         raw: true,
+  //         hist_access_type: 'search',
+  //         session: 0,
+  //         start: 1,
+  //         stop: 2,
+  //         n: 1,
+  //         pattern: '*',
+  //         unique: true,
+  //       };
+  //       let promise = kernel.requestHistory(options);
+  //       tester.onMessage((msg) => {
+  //         expect(msg.header.msg_type).to.be('history_request');
+  //         msg.parent_header = msg.header;
+  //         tester.send(msg);
+  //       });
+  //       promise.then(() => { done(); });
+  //     });
+  //   });
+
+  //   context('#sendInputReply()', () => {
+
+  //     it('should resolve the promise', (done) => {
+  //       kernel.sendInputReply({ value: 'test' });
+  //       tester.onMessage((msg) => {
+  //         expect(msg.header.msg_type).to.be('input_reply');
+  //         done();
+  //       });
+  //     });
+
+  //     it('should fail if the kernel is dead', (done) => {
+  //       tester.sendStatus('dead');
+  //       kernel.statusChanged.connect(() => {
+  //         try {
+  //           kernel.sendInputReply({ value: 'test' });
+  //         } catch (err) {
+  //           expect(err.message).to.be('Kernel is dead');
+  //           done();
+  //         }
+  //       });
+  //     });
+  //   });
+
+  //   context('#requestExecute()', () => {
+
+  //     it('should send and handle incoming messages', (done) => {
+  //       let newMsg: KernelMessage.IMessage;
+  //       let content: KernelMessage.IExecuteRequest = {
+  //         code: 'test',
+  //         silent: false,
+  //         store_history: true,
+  //         user_expressions: {},
+  //         allow_stdin: false,
+  //         stop_on_error: false
+  //       };
+  //       let future = kernel.requestExecute(content);
+  //       expect(future.onDone).to.be(null);
+  //       expect(future.onStdin).to.be(null);
+  //       expect(future.onReply).to.be(null);
+  //       expect(future.onIOPub).to.be(null);
+
+  //       let options: KernelMessage.IOptions = {
+  //         msgType: 'custom',
+  //         channel: 'shell',
+  //         username: kernel.username,
+  //         session: kernel.clientId
+  //       };
+
+  //       tester.onMessage((msg) => {
+  //         expect(msg.channel).to.be('shell');
+
+  //         // send a reply
+  //         options.channel = 'shell';
+  //         newMsg = KernelMessage.createMessage(options);
+  //         newMsg.parent_header = msg.header;
+  //         tester.send(newMsg);
+
+  //         future.onReply = () => {
+  //           // trigger onStdin
+  //           options.channel = 'stdin';
+  //           newMsg = KernelMessage.createMessage(options);
+  //           newMsg.parent_header = msg.header;
+  //           tester.send(newMsg);
+  //         };
+
+  //         future.onStdin = () => {
+  //           // trigger onIOPub with a 'stream' message
+  //           options.channel = 'iopub';
+  //           options.msgType = 'stream';
+  //           let streamContent: JSONObject = { name: 'stdout', text: '' };
+  //           newMsg = KernelMessage.createMessage(options, streamContent);
+  //           newMsg.parent_header = msg.header;
+  //           tester.send(newMsg);
+  //         };
+
+  //         future.onIOPub = (ioMsg) => {
+  //           if (ioMsg.header.msg_type === 'stream') {
+  //             // trigger onDone
+  //             options.msgType = 'status';
+  //             newMsg = KernelMessage.createMessage(options, { execution_state: 'idle' });
+  //             newMsg.parent_header = msg.header;
+  //             tester.send(newMsg);
+  //           }
+  //         };
+
+  //         future.onDone = () => {
+  //           doLater(() => {
+  //             expect(future.isDisposed).to.be(true);
+  //             done();
+  //           });
+  //         };
+  //       });
+
+  //     });
+
+  //     it('should not dispose of KernelFuture when disposeOnDone=false', (done) => {
+  //       let options: KernelMessage.IExecuteRequest = {
+  //         code: 'test',
+  //         silent: false,
+  //         store_history: true,
+  //         user_expressions: {},
+  //         allow_stdin: false,
+  //         stop_on_error: false
+  //       };
+  //       let future = kernel.requestExecute(options, false);
+  //       expect(future.onDone).to.be(null);
+  //       expect(future.onStdin).to.be(null);
+  //       expect(future.onReply).to.be(null);
+  //       expect(future.onIOPub).to.be(null);
+
+  //       tester.onMessage((msg) => {
+  //         expect(msg.channel).to.be('shell');
+
+  //         // send a reply
+  //         msg.parent_header = msg.header;
+  //         msg.channel = 'shell';
+  //         tester.send(msg);
+
+  //         future.onReply = () => {
+  //           // trigger onIOPub with a 'stream' message
+  //           msg.channel = 'iopub';
+  //           msg.header.msg_type = 'stream';
+  //           msg.content = { 'name': 'stdout', 'text': 'foo' };
+  //           tester.send(msg);
+  //         };
+
+  //         future.onIOPub = () => {
+  //           if (msg.header.msg_type === 'stream') {
+  //             // trigger onDone
+  //             msg.header.msg_type = 'status';
+  //             (msg as KernelMessage.IStatusMsg).content.execution_state = 'idle';
+  //             tester.send(msg);
+  //           }
+  //         };
+
+  //         future.onDone = () => {
+  //           doLater(() => {
+  //             expect(future.isDisposed).to.be(false);
+  //             expect(future.onDone).to.be(null);
+  //             expect(future.onIOPub).to.not.be(null);
+  //             future.dispose();
+  //             expect(future.onIOPub).to.be(null);
+  //             expect(future.isDisposed).to.be(true);
+  //             done();
+  //           });
+  //         };
+
+  //       });
+  //     });
+
+  //   });
+
+  //   context('#registerMessageHook()', () => {
+
+  //     it('should have the most recently registered hook run first', (done) => {
+  //       let options: KernelMessage.IExecuteRequest = {
+  //         code: 'test',
+  //         silent: false,
+  //         store_history: true,
+  //         user_expressions: {},
+  //         allow_stdin: false,
+  //         stop_on_error: false
+  //       };
+  //       let future = kernel.requestExecute(options, false);
+  //       tester.onMessage((message) => {
+  //         // send a reply
+  //         let parent_header = message.header;
+  //         let msg = createMsg('shell', parent_header);
+  //         tester.send(msg);
+
+  //         future.onReply = () => {
+  //           // trigger onIOPub with a 'stream' message
+  //           let msgStream = createMsg('iopub', parent_header);
+  //           msgStream.header.msg_type = 'stream';
+  //           msgStream.content = { 'name': 'stdout', 'text': 'foo' };
+  //           tester.send(msgStream);
+  //           // trigger onDone
+  //           let msgDone = createMsg('iopub', parent_header);
+  //           msgDone.header.msg_type = 'status';
+  //           (msgDone as KernelMessage.IStatusMsg).content.execution_state = 'idle';
+  //           tester.send(msgDone);
+  //         };
+
+  //         let calls: string[] = [];
+  //         kernel.registerMessageHook(parent_header.msg_id, (msg) => {
+  //           calls.push('last');
+  //           return true;
+  //         });
+
+  //         kernel.registerMessageHook(parent_header.msg_id, (msg) => {
+  //           calls.push('first');
+  //           // not returning should also continue handling
+  //           return void 0;
+  //         });
+
+  //         future.onIOPub = () => {
+  //           calls.push('iopub')
+  //         };
+
+  //         future.onDone = () => {
+  //           // the last hook was called for the stream and the status message.
+  //           expect(calls).to.eql(['first', 'last', 'iopub', 'first', 'last', 'iopub']);
+  //           doLater(() => {
+  //             done();
+  //           });
+  //         };
+  //       });
+  //     });
+
+  //     it('should abort processing if a hook returns false, but the done logic should still work', (done) => {
+  //       let options: KernelMessage.IExecuteRequest = {
+  //         code: 'test',
+  //         silent: false,
+  //         store_history: true,
+  //         user_expressions: {},
+  //         allow_stdin: false,
+  //         stop_on_error: false
+  //       };
+  //       let future = kernel.requestExecute(options, false);
+  //       tester.onMessage((message) => {
+  //         // send a reply
+  //         let parent_header = message.header;
+  //         let msg = createMsg('shell', parent_header);
+  //         tester.send(msg);
+
+  //         future.onReply = () => {
+  //           // trigger onIOPub with a 'stream' message
+  //           let msgStream = createMsg('iopub', parent_header);
+  //           msgStream.header.msg_type = 'stream';
+  //           msgStream.content = { 'name': 'stdout', 'text': 'foo' };
+  //           tester.send(msgStream);
+  //           // trigger onDone
+  //           let msgDone = createMsg('iopub', parent_header);
+  //           msgDone.header.msg_type = 'status';
+  //           (msgDone as KernelMessage.IStatusMsg).content.execution_state = 'idle';
+  //           tester.send(msgDone);
+  //         };
+
+  //         let calls: string[] = [];
+  //         kernel.registerMessageHook(parent_header.msg_id, (msg) => {
+  //           calls.push('last');
+  //           return true;
+  //         });
+
+  //         kernel.registerMessageHook(parent_header.msg_id, (msg) => {
+  //           calls.push('first');
+  //           return false;
+  //         });
+
+  //         future.onIOPub = () => {
+  //           calls.push('iopub')
+  //         };
+
+  //         future.onDone = () => {
+  //           // the last hook was called for the stream and the status message.
+  //           expect(calls).to.eql(['first', 'first']);
+  //           doLater(() => {
+  //             done();
+  //           });
+  //         };
+  //       });
+  //     });
+
+  //     it('should process additions on the next run', (done) => {
+  //       let options: KernelMessage.IExecuteRequest = {
+  //         code: 'test',
+  //         silent: false,
+  //         store_history: true,
+  //         user_expressions: {},
+  //         allow_stdin: false,
+  //         stop_on_error: false
+  //       };
+  //       let future = kernel.requestExecute(options, false);
+  //       tester.onMessage((message) => {
+  //         // send a reply
+  //         let parent_header = message.header;
+  //         let msg = createMsg('shell', parent_header);
+  //         tester.send(msg);
+
+  //         future.onReply = () => {
+  //           // trigger onIOPub with a 'stream' message
+  //           let msgStream = createMsg('iopub', parent_header);
+  //           msgStream.header.msg_type = 'stream';
+  //           msgStream.content = { 'name': 'stdout', 'text': 'foo' };
+  //           tester.send(msgStream);
+  //           // trigger onDone
+  //           let msgDone = createMsg('iopub', parent_header);
+  //           msgDone.header.msg_type = 'status';
+  //           (msgDone as KernelMessage.IStatusMsg).content.execution_state = 'idle';
+  //           tester.send(msgDone);
+  //         };
+
+  //         let calls: string[] = [];
+  //         kernel.registerMessageHook(parent_header.msg_id, (msg) => {
+  //           calls.push('last');
+  //           kernel.registerMessageHook(parent_header.msg_id, (msg) => {
+  //             calls.push('first');
+  //             return true;
+  //           });
+  //           return true;
+  //         });
+
+  //         future.onIOPub = () => {
+  //           calls.push('iopub')
+  //         };
+
+  //         future.onDone = () => {
+  //           expect(calls).to.eql(['last', 'iopub', 'first', 'last', 'iopub']);
+  //           doLater(() => {
+  //             done();
+  //           });
+  //         };
+  //       });
+  //     });
+
+  //     it('should deactivate a hook immediately on removal', (done) => {
+  //       let options: KernelMessage.IExecuteRequest = {
+  //         code: 'test',
+  //         silent: false,
+  //         store_history: true,
+  //         user_expressions: {},
+  //         allow_stdin: false,
+  //         stop_on_error: false
+  //       };
+  //       let future = kernel.requestExecute(options, false);
+  //       tester.onMessage((message) => {
+  //         // send a reply
+  //         let parent_header = message.header;
+  //         let msg = createMsg('shell', parent_header);
+  //         tester.send(msg);
+
+  //         future.onReply = () => {
+  //           // trigger onIOPub with a 'stream' message
+  //           let msgStream = createMsg('iopub', parent_header);
+  //           msgStream.header.msg_type = 'stream';
+  //           msgStream.content = { 'name': 'stdout', 'text': 'foo' };
+  //           tester.send(msgStream);
+  //           // trigger onDone
+  //           let msgDone = createMsg('iopub', parent_header);
+  //           msgDone.header.msg_type = 'status';
+  //           (msgDone as KernelMessage.IStatusMsg).content.execution_state = 'idle';
+  //           tester.send(msgDone);
+  //         };
+
+  //         let calls: string[] = [];
+  //         let toDelete = (msg: KernelMessage.IIOPubMessage) => {
+  //           calls.push('delete');
+  //           return true;
+  //         }
+  //         let toDeleteHook = kernel.registerMessageHook(parent_header.msg_id, toDelete);
+
+  //         kernel.registerMessageHook(parent_header.msg_id, (msg) => {
+  //           if (calls.length > 0) {
+  //             // delete the hook the second time around
+  //             toDeleteHook.dispose();
+  //           }
+  //           calls.push('first');
+  //           return true;
+  //         });
+
+  //         future.onIOPub = () => {
+  //           calls.push('iopub')
+  //         };
+
+  //         future.onDone = () => {
+  //           expect(calls).to.eql(['first', 'delete', 'iopub', 'first', 'iopub']);
+  //           doLater(() => {
+  //             done();
+  //           });
+  //         };
+  //       });
+  //     });
+
+  //   });
+  // });
+
+  // describe('IFuture', () => {
+
+  //   beforeEach((done) => {
+  //     Kernel.startNew().then(k => {
+  //       kernel = k;
+  //       done();
+  //     }).catch(done);
+  //   });
+
+  //   it('should have a msg attribute', () => {
+  //     let future = kernel.requestExecute({ code: 'hello' });
+  //     expect(typeof future.msg.header.msg_id).to.be('string');
+  //   });
+
+  //   describe('Message hooks', () => {
+
+  //     it('should have the most recently registered hook run first', (done) => {
+  //       let options: KernelMessage.IExecuteRequest = {
+  //         code: 'test',
+  //         silent: false,
+  //         store_history: true,
+  //         user_expressions: {},
+  //         allow_stdin: false,
+  //         stop_on_error: false
+  //       };
+  //       let future = kernel.requestExecute(options, false);
+  //       tester.onMessage((message) => {
+  //         // send a reply
+  //         let parent_header = message.header;
+  //         let msg = createMsg('shell', parent_header);
+  //         tester.send(msg);
+
+  //         future.onReply = () => {
+  //           // trigger onIOPub with a 'stream' message
+  //           let msgStream = createMsg('iopub', parent_header);
+  //           msgStream.header.msg_type = 'stream';
+  //           msgStream.content = { 'name': 'stdout', 'text': 'foo' };
+  //           tester.send(msgStream);
+  //           // trigger onDone
+  //           let msgDone = createMsg('iopub', parent_header);
+  //           msgDone.header.msg_type = 'status';
+  //           (msgDone as KernelMessage.IStatusMsg).content.execution_state = 'idle';
+  //           tester.send(msgDone);
+  //         };
+
+  //         let calls: string[] = [];
+  //         future.registerMessageHook((msg) => {
+  //           calls.push('last');
+  //           return true;
+  //         });
+
+  //         future.registerMessageHook((msg) => {
+  //           calls.push('first');
+  //           // Check to make sure we actually got the messages we expected.
+  //           if (msg.header.msg_type === 'stream') {
+  //             expect((msg as KernelMessage.IStreamMsg).content.text).to.be('foo1');
+  //           } else {
+  //             expect((msg as KernelMessage.IStatusMsg).content.execution_state).to.be('idle');
+  //           }
+  //           // not returning should also continue handling
+  //           return void 0;
+  //         });
+
+  //         future.onIOPub = () => {
+  //           calls.push('iopub')
+  //         };
+
+  //         future.onDone = () => {
+  //           // the last hook was called for the stream and the status message.
+  //           expect(calls).to.eql(['first', 'last', 'iopub', 'first', 'last', 'iopub']);
+  //           doLater(() => {
+  //             done();
+  //           });
+  //         };
+  //       });
+  //     });
+
+  //     it('should abort processing if a hook returns false, but the done logic should still work', (done) => {
+  //       let options: KernelMessage.IExecuteRequest = {
+  //         code: 'test',
+  //         silent: false,
+  //         store_history: true,
+  //         user_expressions: {},
+  //         allow_stdin: false,
+  //         stop_on_error: false
+  //       };
+  //       let future = kernel.requestExecute(options, false);
+  //       tester.onMessage((message) => {
+  //         // send a reply
+  //         let parent_header = message.header;
+  //         let msg = createMsg('shell', parent_header);
+  //         tester.send(msg);
+
+  //         future.onReply = () => {
+  //           // trigger onIOPub with a 'stream' message
+  //           let msgStream = createMsg('iopub', parent_header);
+  //           msgStream.header.msg_type = 'stream';
+  //           msgStream.content = { 'name': 'stdout', 'text': 'foo' };
+  //           tester.send(msgStream);
+  //           // trigger onDone
+  //           let msgDone = createMsg('iopub', parent_header);
+  //           msgDone.header.msg_type = 'status';
+  //           (msgDone as KernelMessage.IStatusMsg).content.execution_state = 'idle';
+  //           tester.send(msgDone);
+  //         };
+
+  //         let calls: string[] = [];
+  //         future.registerMessageHook((msg) => {
+  //           calls.push('last');
+  //           return true;
+  //         });
+
+  //         future.registerMessageHook((msg) => {
+  //           calls.push('first');
+  //           return false;
+  //         });
+
+  //         future.onIOPub = () => {
+  //           calls.push('iopub')
+  //         };
+
+  //         future.onDone = () => {
+  //           // the last hook was called for the stream and the status message.
+  //           expect(calls).to.eql(['first', 'first']);
+  //           doLater(() => {
+  //             done();
+  //           });
+  //         };
+  //       });
+  //     });
+
+  //     it('should process additions on the next run', (done) => {
+  //       let options: KernelMessage.IExecuteRequest = {
+  //         code: 'test',
+  //         silent: false,
+  //         store_history: true,
+  //         user_expressions: {},
+  //         allow_stdin: false,
+  //         stop_on_error: false
+  //       };
+  //       let future = kernel.requestExecute(options, false);
+  //       tester.onMessage((message) => {
+  //         // send a reply
+  //         let parent_header = message.header;
+  //         let msg = createMsg('shell', parent_header);
+  //         tester.send(msg);
+
+  //         future.onReply = () => {
+  //           // trigger onIOPub with a 'stream' message
+  //           let msgStream = createMsg('iopub', parent_header);
+  //           msgStream.header.msg_type = 'stream';
+  //           msgStream.content = { 'name': 'stdout', 'text': 'foo' };
+  //           tester.send(msgStream);
+  //           // trigger onDone
+  //           let msgDone = createMsg('iopub', parent_header);
+  //           msgDone.header.msg_type = 'status';
+  //           (msgDone as KernelMessage.IStatusMsg).content.execution_state = 'idle';
+  //           tester.send(msgDone);
+  //         };
+
+  //         let calls: string[] = [];
+  //         future.registerMessageHook((msg) => {
+  //           calls.push('last');
+  //           future.registerMessageHook((msg) => {
+  //             calls.push('first');
+  //             return true;
+  //           });
+  //           return true;
+  //         });
+
+  //         future.onIOPub = () => {
+  //           calls.push('iopub')
+  //         };
+
+  //         future.onDone = () => {
+  //           expect(calls).to.eql(['last', 'iopub', 'first', 'last', 'iopub']);
+  //           doLater(() => {
+  //             done();
+  //           });
+  //         };
+  //       });
+  //     });
+
+  //     it('should deactivate message hooks immediately on removal', (done) => {
+  //       let options: KernelMessage.IExecuteRequest = {
+  //         code: 'test',
+  //         silent: false,
+  //         store_history: true,
+  //         user_expressions: {},
+  //         allow_stdin: false,
+  //         stop_on_error: false
+  //       };
+  //       let future = kernel.requestExecute(options, false);
+  //       tester.onMessage((message) => {
+  //         // send a reply
+  //         let parent_header = message.header;
+  //         let msg = createMsg('shell', parent_header);
+  //         tester.send(msg);
+
+  //         future.onReply = () => {
+  //           // trigger onIOPub with a 'stream' message
+  //           let msgStream = createMsg('iopub', parent_header);
+  //           msgStream.header.msg_type = 'stream';
+  //           msgStream.content = { 'name': 'stdout', 'text': 'foo' };
+  //           tester.send(msgStream);
+  //           // trigger onDone
+  //           let msgDone = createMsg('iopub', parent_header);
+  //           msgDone.header.msg_type = 'status';
+  //           (msgDone as KernelMessage.IStatusMsg).content.execution_state = 'idle';
+  //           tester.send(msgDone);
+  //         };
+
+  //         let calls: string[] = [];
+  //         let toDelete = (msg: KernelMessage.IIOPubMessage) => {
+  //           calls.push('delete');
+  //           return true;
+  //         }
+  //         future.registerMessageHook(toDelete);
+
+  //         let first = (msg: KernelMessage.IIOPubMessage) => {
+  //           if (calls.length > 0) {
+  //             // delete the hook the second time around
+  //             future.removeMessageHook(toDelete);
+  //           }
+  //           calls.push('first');
+  //           return true;
+  //         }
+  //         future.registerMessageHook(first);
+
+  //         future.onIOPub = () => {
+  //           calls.push('iopub')
+  //         };
+
+  //         future.onDone = () => {
+  //           expect(calls).to.eql(['first', 'delete', 'iopub', 'first', 'iopub']);
+  //           doLater(() => {
+  //             future.dispose();
+  //             future.removeMessageHook(first);
+  //             done();
+  //           });
+  //         };
+  //       });
+  //     });
+
+  //   });
+  // });
+
+  // describe('Kernel.getSpecs()', () => {
+
+  //   it('should load the kernelspecs', (done) => {
+  //     let ids = {
+  //       'python': PYTHON_SPEC,
+  //       'python3': PYTHON3_SPEC
+  //     };
+  //     tester.specs =  { 'default': 'python',
+  //                       'kernelspecs': ids };
+  //     Kernel.getSpecs().then(specs => {
+  //       let names = Object.keys(specs.kernelspecs);
+  //       expect(names[0]).to.be('python');
+  //       expect(names[1]).to.be('python3');
+  //       done();
+  //     }).catch(done);
+  //   });
+
+  //   it('should accept ajax options', (done) => {
+  //     let ids = {
+  //       'python': PYTHON_SPEC,
+  //       'python3': PYTHON3_SPEC
+  //     };
+  //     tester.specs = { 'default': 'python',
+  //                      'kernelspecs': ids };
+  //     Kernel.getSpecs(serverSettings).then(specs => {
+  //       let names = Object.keys(specs.kernelspecs);
+  //       expect(names[0]).to.be('python');
+  //       expect(names[1]).to.be('python3');
+  //       done();
+  //     }).catch(done);
+  //   });
+
+  //   it('should handle a missing default parameter', (done) => {
+  //     tester.onRequest = () => {
+  //       tester.respond(200, { 'kernelspecs': { 'python': PYTHON_SPEC } });
+  //     };
+  //     Kernel.getSpecs().then(specs => {
+  //       expect(specs.default).to.be('python');
+  //     }).then(done, done);
+  //   });
+
+  //   it('should throw for a missing kernelspecs parameter', (done) => {
+  //     tester.onRequest = () => {
+  //       tester.respond(200, { 'default': PYTHON_SPEC.name });
+  //     };
+  //     let promise = Kernel.getSpecs();
+  //     expectAjaxError(promise, done, 'No kernelspecs found');
+  //   });
+
+  //   it('should omit an invalid kernelspec', (done) => {
+  //     let R_SPEC = JSON.parse(JSON.stringify(PYTHON_SPEC));
+  //     R_SPEC.name = 1;
+  //     tester.onRequest = () => {
+  //       tester.respond(200, { 'default': 'python',
+  //                              'kernelspecs': { 'R': R_SPEC,
+  //                                               'python': PYTHON_SPEC }
+  //       });
+  //     };
+  //     Kernel.getSpecs().then(specs => {
+  //       expect(specs.default).to.be('python');
+  //       expect(specs.kernelspecs['R']).to.be(void 0);
+  //     }).then(done, done);
+  //   });
+
+  //   it('should handle an improper name', (done) => {
+  //     let R_SPEC = JSON.parse(JSON.stringify(PYTHON_SPEC));
+  //     R_SPEC.name = 1;
+  //     tester.onRequest = () => {
+  //       tester.respond(200, { 'default': 'R',
+  //                              'kernelspecs': { 'R': R_SPEC } });
+  //     };
+  //     let promise = Kernel.getSpecs();
+  //     expectAjaxError(promise, done, 'No valid kernelspecs found');
+  //   });
+
+  //   it('should handle an improper language', (done) => {
+  //     let R_SPEC = JSON.parse(JSON.stringify(PYTHON_SPEC));
+  //     R_SPEC.spec.language = 1;
+  //     tester.onRequest = () => {
+  //       tester.respond(200, { 'default': 'R',
+  //                            'kernelspecs': { 'R': R_SPEC } });
+  //     };
+  //     let promise = Kernel.getSpecs();
+  //     expectAjaxError(promise, done, 'No valid kernelspecs found');
+  //   });
+
+  //   it('should handle an improper argv', (done) => {
+  //     let R_SPEC = JSON.parse(JSON.stringify(PYTHON_SPEC));
+  //     R_SPEC.spec.argv = 'hello';
+  //     tester.onRequest = () => {
+  //       tester.respond(200, { 'default': 'R',
+  //                              'kernelspecs': { 'R': R_SPEC } });
+  //     };
+  //     let promise = Kernel.getSpecs();
+  //     expectAjaxError(promise, done, 'No valid kernelspecs found');
+  //   });
+
+  //   it('should handle an improper display_name', (done) => {
+  //     let R_SPEC = JSON.parse(JSON.stringify(PYTHON_SPEC));
+  //     R_SPEC.spec.display_name = ['hello'];
+  //     tester.onRequest = () => {
+  //       tester.respond(200, { 'default': 'R',
+  //                              'kernelspecs': { 'R': R_SPEC } });
+  //     };
+  //     let promise = Kernel.getSpecs();
+  //     expectAjaxError(promise, done, 'No valid kernelspecs found');
+  //   });
+
+  //   it('should handle missing resources', (done) => {
+  //     let R_SPEC = JSON.parse(JSON.stringify(PYTHON_SPEC));
+  //     delete R_SPEC.resources;
+  //     tester.onRequest = () => {
+  //       tester.respond(200, { 'default': 'R',
+  //                            'kernelspecs': { 'R': R_SPEC } });
+  //     };
+  //     let promise = Kernel.getSpecs();
+  //     expectAjaxError(promise, done, 'No valid kernelspecs found');
+  //   });
+
+  //   it('should throw an error for an invalid response', (done) => {
+  //     tester.onRequest = () => {
+  //       tester.respond(201, { });
+  //     };
+  //     let promise = Kernel.getSpecs();
+  //     expectAjaxError(promise, done, 'Invalid Status: 201');
+  //   });
+
+  // });
 
 });

+ 5 - 1
packages/services/test/src/kernel/manager.spec.ts

@@ -16,7 +16,11 @@ import {
 } from '@phosphor/coreutils';
 
 import {
-  KernelManager, Kernel, ServerConnection
+  KernelManager, Kernel
+} from '../../../lib/kernel';
+
+import {
+  ServerConnection
 } from '../../../lib';
 
 import {

+ 7 - 1
packages/services/test/src/utils.ts

@@ -19,9 +19,13 @@ import {
 } from 'ws';
 
 import {
-  Contents, Kernel, KernelMessage, TerminalSession, Session, ServerConnection
+  Contents, TerminalSession, Session, ServerConnection
 } from '../../lib';
 
+import {
+  Kernel, KernelMessage
+} from '../../lib/kernel';
+
 import {
   deserialize, serialize
 } from '../../lib/kernel/serialize';
@@ -34,6 +38,7 @@ import {
 // stub for node global
 declare var global: any;
 
+console.log('****setting websocket');
 global.WebSocket = WebSocket;
 if (typeof window === 'undefined') {
   global.XMLHttpRequest = MockXMLHttpRequest;
@@ -336,6 +341,7 @@ class RequestSocketTester extends RequestHandler {
     this._server = new Server({ port: 8888 });
     this._promiseDelegate = new PromiseDelegate<void>();
     this._server.on('connection', ws => {
+      console.log('*****made a connection');
       this._ws = ws;
       this.onSocket(ws);
       this._promiseDelegate.resolve(void 0);