manager.spec.ts 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. // Copyright (c) Jupyter Development Team.
  2. // Distributed under the terms of the Modified BSD License.
  3. import expect = require('expect.js');
  4. import {
  5. uuid
  6. } from '@jupyterlab/coreutils';
  7. import {
  8. toArray
  9. } from '@phosphor/algorithm';
  10. import {
  11. JSONExt
  12. } from '@phosphor/coreutils';
  13. import {
  14. Kernel, ServerConnection, SessionManager, Session
  15. } from '../../../lib';
  16. import {
  17. KernelTester, KERNELSPECS
  18. } from '../utils';
  19. /**
  20. * Create a unique session id.
  21. */
  22. function createSessionModel(id = ''): Session.IModel {
  23. return {
  24. id: id || uuid(),
  25. notebook: { path: uuid() },
  26. kernel: { id: uuid(), name: uuid() }
  27. };
  28. }
  29. describe('session/manager', () => {
  30. let tester: KernelTester;
  31. let session: Session.ISession;
  32. let manager: SessionManager;
  33. let data: Session.IModel[];
  34. beforeEach((done) => {
  35. data = [createSessionModel(), createSessionModel()];
  36. tester = new KernelTester();
  37. tester.runningSessions = data;
  38. manager = new SessionManager();
  39. expect(manager.specs).to.be(null);
  40. expect(manager.running().next()).to.be(void 0);
  41. manager.ready.then(done, done);
  42. });
  43. afterEach((done) => {
  44. manager.ready.then(() => {
  45. manager.dispose();
  46. if (session) {
  47. session.dispose();
  48. }
  49. tester.dispose();
  50. done();
  51. }).catch(done);
  52. });
  53. describe('SessionManager', () => {
  54. describe('#constructor()', () => {
  55. it('should create a new session manager', () => {
  56. expect(manager instanceof SessionManager).to.be(true);
  57. });
  58. });
  59. describe('#serverSettings', () => {
  60. it('should get the server settings', () => {
  61. manager.dispose();
  62. let serverSettings = ServerConnection.makeSettings({ baseUrl: 'foo' });
  63. manager = new SessionManager({ serverSettings });
  64. expect(manager.serverSettings.baseUrl).to.be('foo');
  65. });
  66. });
  67. describe('#specs', () => {
  68. it('should be the kernel specs', () => {
  69. expect(manager.specs.default).to.be(KERNELSPECS.default);
  70. });
  71. });
  72. describe('#isReady', () => {
  73. it('should test whether the manager is ready', (done) => {
  74. manager.dispose();
  75. manager = new SessionManager();
  76. expect(manager.isReady).to.be(false);
  77. manager.ready.then(() => {
  78. expect(manager.isReady).to.be(true);
  79. done();
  80. }).catch(done);
  81. });
  82. });
  83. describe('#ready', () => {
  84. it('should resolve when the manager is ready', (done) => {
  85. manager.ready.then(done, done);
  86. });
  87. });
  88. describe('#running()', () => {
  89. it('should get the running sessions', () => {
  90. let test = JSONExt.deepEqual(toArray(manager.running()), data);
  91. expect(test).to.be(true);
  92. });
  93. });
  94. describe('#specsChanged', () => {
  95. it('should be emitted when the specs change', (done) => {
  96. let specs = JSONExt.deepCopy(KERNELSPECS) as Kernel.ISpecModels;
  97. specs.default = 'shell';
  98. tester.specs = specs;
  99. manager.specsChanged.connect((sender, args) => {
  100. expect(sender).to.be(manager);
  101. expect(args.default).to.be(specs.default);
  102. done();
  103. });
  104. manager.refreshSpecs();
  105. });
  106. });
  107. describe('#runningChanged', () => {
  108. it('should be emitted in refreshRunning when the running sessions changed', (done) => {
  109. let sessionModels = [createSessionModel(), createSessionModel()];
  110. tester.runningSessions = sessionModels;
  111. manager.runningChanged.connect((sender, args) => {
  112. expect(sender).to.be(manager);
  113. expect(JSONExt.deepEqual(toArray(args), sessionModels)).to.be(true);
  114. done();
  115. });
  116. manager.refreshRunning();
  117. });
  118. it('should be emitted when a session is shut down', (done) => {
  119. manager.startNew({ path: 'foo' }).then(s => {
  120. manager.runningChanged.connect(() => {
  121. manager.dispose();
  122. done();
  123. });
  124. return s.shutdown();
  125. }).catch(done);
  126. });
  127. it('should be emitted when a session is renamed', (done) => {
  128. manager.startNew({ path: 'foo' }).then(s => {
  129. let model = {
  130. id: s.id,
  131. kernel: s.kernel.model,
  132. notebook: { path: 'bar' }
  133. };
  134. tester.onRequest = () => {
  135. tester.respond(200, model);
  136. };
  137. manager.runningChanged.connect(() => {
  138. manager.dispose();
  139. done();
  140. });
  141. return s.rename(model.notebook.path);
  142. }).catch(done);
  143. });
  144. it('should be emitted when a session changes kernels', (done) => {
  145. manager.startNew({ path: 'foo' }).then(s => {
  146. let model = {
  147. id: s.id,
  148. kernel: {
  149. name: 'foo',
  150. id: uuid()
  151. },
  152. notebook: { path: 'bar' }
  153. };
  154. let name = model.kernel.name;
  155. tester.onRequest = request => {
  156. if (request.method === 'PATCH') {
  157. tester.respond(200, model);
  158. } else {
  159. tester.respond(200, { name, id: model.kernel.id });
  160. }
  161. };
  162. manager.runningChanged.connect(() => {
  163. manager.dispose();
  164. done();
  165. });
  166. return s.changeKernel({ name });
  167. }).catch(done);
  168. });
  169. });
  170. describe('#refreshRunning()', () => {
  171. it('should refresh the list of session ids', (done) => {
  172. let sessionModels = [createSessionModel(), createSessionModel()];
  173. tester.runningSessions = sessionModels;
  174. manager.refreshRunning().then(() => {
  175. let running = toArray(manager.running());
  176. expect(running[0]).to.eql(sessionModels[0]);
  177. expect(running[1]).to.eql(sessionModels[1]);
  178. done();
  179. });
  180. });
  181. });
  182. describe('#refreshSpecs()', () => {
  183. it('should refresh the specs', (done) => {
  184. let specs = JSONExt.deepCopy(KERNELSPECS) as Kernel.ISpecModels;
  185. specs.default = 'shell';
  186. tester.specs = specs;
  187. manager.refreshSpecs().then(() => {
  188. expect(manager.specs.default).to.be(specs.default);
  189. done();
  190. }).catch(done);
  191. });
  192. });
  193. describe('#startNew()', () => {
  194. it('should start a session', (done) => {
  195. manager.startNew({ path: 'test.ipynb'}).then(s => {
  196. session = s;
  197. expect(session.id).to.be.ok();
  198. done();
  199. }).catch(done);
  200. });
  201. it('should emit a runningChanged signal', (done) => {
  202. manager.runningChanged.connect(() => {
  203. done();
  204. });
  205. manager.startNew({ path: 'foo.ipynb' });
  206. });
  207. });
  208. describe('#findByPath()', () => {
  209. it('should find an existing session by path', (done) => {
  210. manager.startNew({ path: 'test.ipynb' }).then(s => {
  211. session = s;
  212. tester.runningSessions = [s.model];
  213. return manager.findByPath(session.path);
  214. }).then(newModel => {
  215. expect(newModel.id).to.be(session.id);
  216. done();
  217. }).catch(done);
  218. });
  219. });
  220. describe('#findById()', () => {
  221. it('should find an existing session by id', (done) => {
  222. manager.startNew({ path: 'test.ipynb' }).then(s => {
  223. session = s;
  224. tester.runningSessions = [s.model];
  225. return manager.findById(session.id);
  226. }).then(newModel => {
  227. expect(newModel.id).to.be(session.id);
  228. done();
  229. }).catch(done);
  230. });
  231. });
  232. describe('#connectTo()', () => {
  233. it('should connect to a running session', (done) => {
  234. manager.startNew({ path: 'test.ipynb' }).then(s => {
  235. session = s;
  236. manager.connectTo(session.id).then(newSession => {
  237. expect(newSession.id).to.be(session.id);
  238. expect(newSession.kernel.id).to.be(session.kernel.id);
  239. expect(newSession).to.not.be(session);
  240. expect(newSession.kernel).to.not.be(session.kernel);
  241. newSession.dispose();
  242. done();
  243. });
  244. }).catch(done);
  245. });
  246. it('should emit a runningChanged signal', (done) => {
  247. manager.runningChanged.connect(() => {
  248. done();
  249. });
  250. let model = createSessionModel();
  251. tester.runningSessions = [model];
  252. manager.connectTo(model.id);
  253. });
  254. });
  255. describe('shutdown()', () => {
  256. it('should shut down a session by id', (done) => {
  257. manager.shutdown('foo').then(done, done);
  258. });
  259. it('should emit a runningChanged signal', (done) => {
  260. manager.runningChanged.connect((sender, args) => {
  261. done();
  262. });
  263. manager.shutdown(data[0].id);
  264. });
  265. });
  266. });
  267. });