manager.spec.ts 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. // Copyright (c) Jupyter Development Team.
  2. // Distributed under the terms of the Modified BSD License.
  3. import { expect } from 'chai';
  4. import { UUID } from '@phosphor/coreutils';
  5. import { toArray } from '@phosphor/algorithm';
  6. import { JSONExt } from '@phosphor/coreutils';
  7. import {
  8. Kernel,
  9. ServerConnection,
  10. SessionManager,
  11. Session
  12. } from '@jupyterlab/services';
  13. import { testEmission } from '@jupyterlab/testutils';
  14. import { KERNELSPECS, handleRequest } from '../utils';
  15. class TestManager extends SessionManager {
  16. intercept: Kernel.ISpecModels | null = null;
  17. protected async requestSpecs(): Promise<void> {
  18. if (this.intercept) {
  19. handleRequest(this, 200, this.intercept);
  20. }
  21. return super.requestSpecs();
  22. }
  23. }
  24. /**
  25. * Start a new session on with a default name.
  26. */
  27. async function startNew(manager: SessionManager): Promise<Session.ISession> {
  28. const session = await manager.startNew({ path: UUID.uuid4() });
  29. return session;
  30. }
  31. describe('session/manager', () => {
  32. let manager: SessionManager;
  33. let session: Session.ISession;
  34. beforeAll(async () => {
  35. session = await Session.startNew({ path: UUID.uuid4() });
  36. });
  37. beforeEach(() => {
  38. manager = new SessionManager();
  39. expect(manager.specs).to.be.null;
  40. });
  41. afterEach(() => {
  42. manager.dispose();
  43. });
  44. afterAll(() => {
  45. return Session.shutdownAll();
  46. });
  47. describe('SessionManager', () => {
  48. describe('#constructor()', () => {
  49. it('should create a new session manager', () => {
  50. expect(manager instanceof SessionManager).to.equal(true);
  51. });
  52. });
  53. describe('#serverSettings', () => {
  54. it('should get the server settings', () => {
  55. manager.dispose();
  56. const serverSettings = ServerConnection.makeSettings();
  57. const token = serverSettings.token;
  58. manager = new SessionManager({ serverSettings });
  59. expect(manager.serverSettings.token).to.equal(token);
  60. });
  61. });
  62. describe('#specs', () => {
  63. it('should be the kernel specs', async () => {
  64. await manager.ready;
  65. expect(manager.specs.default).to.be.ok;
  66. });
  67. });
  68. describe('#isReady', () => {
  69. it('should test whether the manager is ready', async () => {
  70. manager.dispose();
  71. manager = new SessionManager();
  72. expect(manager.isReady).to.equal(false);
  73. await manager.ready;
  74. expect(manager.isReady).to.equal(true);
  75. });
  76. });
  77. describe('#ready', () => {
  78. it('should resolve when the manager is ready', () => {
  79. return manager.ready;
  80. });
  81. });
  82. describe('#running()', () => {
  83. it('should get the running sessions', async () => {
  84. await manager.refreshRunning();
  85. const running = toArray(manager.running());
  86. expect(running.length).to.be.greaterThan(0);
  87. });
  88. });
  89. describe('#specsChanged', () => {
  90. it('should be emitted when the specs change', async () => {
  91. const manager = new TestManager({ standby: 'never' });
  92. const specs = JSONExt.deepCopy(KERNELSPECS) as Kernel.ISpecModels;
  93. let called = false;
  94. manager.specsChanged.connect(() => {
  95. called = true;
  96. });
  97. await manager.ready;
  98. expect(manager.specs.default).to.equal('echo');
  99. specs.default = 'shell';
  100. manager.intercept = specs;
  101. await manager.refreshSpecs();
  102. expect(manager.specs.default).to.equal('shell');
  103. expect(called).to.equal(true);
  104. });
  105. });
  106. describe('#runningChanged', () => {
  107. it('should be emitted when the running sessions changed', async () => {
  108. let promise = testEmission(manager.runningChanged, {
  109. test: (sender, args) => {
  110. expect(sender).to.equal(manager);
  111. expect(toArray(args).length).to.be.greaterThan(0);
  112. }
  113. });
  114. await startNew(manager);
  115. await promise;
  116. });
  117. it('should be emitted when a session is shut down', async () => {
  118. let called = false;
  119. const s = await startNew(manager);
  120. manager.runningChanged.connect(() => {
  121. called = true;
  122. });
  123. await s.shutdown();
  124. await manager.refreshRunning();
  125. expect(called).to.equal(true);
  126. });
  127. it('should be emitted when a session is renamed', async () => {
  128. let called = false;
  129. manager.runningChanged.connect(() => {
  130. called = true;
  131. });
  132. await session.setPath(UUID.uuid4());
  133. await manager.refreshRunning();
  134. expect(called).to.equal(true);
  135. });
  136. it('should be emitted when a session changes kernels', async () => {
  137. let called = false;
  138. manager.runningChanged.connect(() => {
  139. called = true;
  140. });
  141. await session.changeKernel({ name: session.kernel.name });
  142. await manager.refreshRunning();
  143. expect(called).to.equal(true);
  144. });
  145. });
  146. describe('#refreshRunning()', () => {
  147. // Sometimes there is an extra kernel_info_request, which means that a
  148. // future is prematurely disposed.
  149. it('should refresh the list of session ids', async () => {
  150. await manager.refreshRunning();
  151. const running = toArray(manager.running());
  152. expect(running.length).to.be.greaterThan(0);
  153. });
  154. });
  155. describe('#refreshSpecs()', () => {
  156. it('should update list of kernel specs', async () => {
  157. const manager = new TestManager({ standby: 'never' });
  158. const specs = JSONExt.deepCopy(KERNELSPECS) as Kernel.ISpecModels;
  159. await manager.ready;
  160. specs.default = 'shell';
  161. manager.intercept = specs;
  162. expect(manager.specs.default).not.to.equal('shell');
  163. await manager.refreshSpecs();
  164. expect(manager.specs.default).to.equal('shell');
  165. });
  166. });
  167. describe('#startNew()', () => {
  168. it('should start a session', async () => {
  169. const session = await manager.startNew({ path: UUID.uuid4() });
  170. expect(session.id).to.be.ok;
  171. return session.shutdown();
  172. });
  173. it('should emit a runningChanged signal', async () => {
  174. let called = false;
  175. manager.runningChanged.connect(() => {
  176. called = true;
  177. });
  178. await manager.startNew({ path: UUID.uuid4() });
  179. expect(called).to.equal(true);
  180. });
  181. });
  182. describe('#findByPath()', () => {
  183. it('should find an existing session by path', async () => {
  184. const newModel = await manager.findByPath(session.path);
  185. expect(newModel.id).to.equal(session.id);
  186. });
  187. });
  188. describe('#findById()', () => {
  189. it('should find an existing session by id', async () => {
  190. const newModel = await manager.findById(session.id);
  191. expect(newModel.id).to.equal(session.id);
  192. });
  193. });
  194. describe('#connectTo()', () => {
  195. it('should connect to a running session', () => {
  196. const newSession = manager.connectTo(session.model);
  197. expect(newSession.id).to.equal(session.id);
  198. expect(newSession.kernel.id).to.equal(session.kernel.id);
  199. expect(newSession).to.not.equal(session);
  200. expect(newSession.kernel).to.not.equal(session.kernel);
  201. });
  202. });
  203. describe('shutdown()', () => {
  204. it('should shut down a session by id', async () => {
  205. const temp = await startNew(manager);
  206. await manager.shutdown(temp.id);
  207. expect(temp.isDisposed).to.equal(true);
  208. });
  209. it('should emit a runningChanged signal', async () => {
  210. let called = false;
  211. const session = await startNew(manager);
  212. manager.runningChanged.connect((sender, sessions) => {
  213. // Make sure the sessions list does not have our shutdown session in it.
  214. if (!sessions.find(s => s.id === session.id)) {
  215. called = true;
  216. }
  217. });
  218. await manager.shutdown(session.id);
  219. expect(called).to.equal(true);
  220. expect(session.isDisposed).to.equal(true);
  221. });
  222. });
  223. });
  224. });