manager.spec.ts 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. // Copyright (c) Jupyter Development Team.
  2. // Distributed under the terms of the Modified BSD License.
  3. import {
  4. flakyIt as it,
  5. JupyterServer,
  6. sleep,
  7. testEmission
  8. } from '@jupyterlab/testutils';
  9. import { toArray } from '@lumino/algorithm';
  10. import { Kernel, KernelAPI, KernelManager } from '../../src';
  11. import { makeSettings } from '../utils';
  12. const server = new JupyterServer();
  13. beforeAll(async () => {
  14. await server.start();
  15. });
  16. afterAll(async () => {
  17. await server.shutdown();
  18. });
  19. describe('kernel/manager', () => {
  20. let manager: KernelManager;
  21. let kernel: Kernel.IModel;
  22. beforeAll(async () => {
  23. jest.setTimeout(20000);
  24. kernel = await KernelAPI.startNew();
  25. });
  26. beforeEach(() => {
  27. manager = new KernelManager({ standby: 'never' });
  28. return manager.ready;
  29. });
  30. afterEach(() => {
  31. manager.dispose();
  32. });
  33. afterAll(async () => {
  34. const models = await KernelAPI.listRunning();
  35. await Promise.all(models.map(m => KernelAPI.shutdownKernel(m.id)));
  36. });
  37. describe('KernelManager', () => {
  38. describe('#constructor()', () => {
  39. it('should take the options as an argument', async () => {
  40. manager.dispose();
  41. manager = new KernelManager({
  42. serverSettings: makeSettings(),
  43. standby: 'never'
  44. });
  45. expect(manager instanceof KernelManager).toBe(true);
  46. await manager.ready;
  47. });
  48. });
  49. describe('#serverSettings', () => {
  50. it('should get the server settings', async () => {
  51. manager.dispose();
  52. const serverSettings = makeSettings();
  53. const standby = 'never';
  54. const token = serverSettings.token;
  55. manager = new KernelManager({ serverSettings, standby });
  56. await manager.ready;
  57. expect(manager.serverSettings.token).toBe(token);
  58. });
  59. });
  60. describe('#running()', () => {
  61. it('should get the running sessions', async () => {
  62. await manager.refreshRunning();
  63. expect(toArray(manager.running()).length).toBeGreaterThan(0);
  64. });
  65. });
  66. describe('#runningChanged', () => {
  67. it('should be emitted in refreshRunning when the running kernels changed', async () => {
  68. let called = false;
  69. manager.runningChanged.connect((sender, args) => {
  70. expect(sender).toBe(manager);
  71. expect(toArray(args).length).toBeGreaterThan(0);
  72. called = true;
  73. });
  74. await KernelAPI.startNew();
  75. await manager.refreshRunning();
  76. expect(called).toBe(true);
  77. });
  78. it('should be emitted when a kernel is shut down', async () => {
  79. const kernel = await manager.startNew();
  80. await kernel.info;
  81. let called = false;
  82. manager.runningChanged.connect(() => {
  83. called = true;
  84. });
  85. await manager.shutdown(kernel.id);
  86. await manager.refreshRunning();
  87. expect(called).toBe(true);
  88. });
  89. });
  90. describe('#isReady', () => {
  91. it('should test whether the manager is ready', async () => {
  92. manager.dispose();
  93. manager = new KernelManager({ standby: 'never' });
  94. expect(manager.isReady).toBe(false);
  95. await manager.ready;
  96. expect(manager.isReady).toBe(true);
  97. });
  98. });
  99. describe('#ready', () => {
  100. it('should resolve when the manager is ready', () => {
  101. return manager.ready;
  102. });
  103. });
  104. describe('#refreshRunning()', () => {
  105. it('should update the running kernels', async () => {
  106. await manager.refreshRunning();
  107. expect(toArray(manager.running()).length).toBeGreaterThan(0);
  108. });
  109. it('should update the running kernels when one is shut down', async () => {
  110. const old = toArray(manager.running()).length;
  111. await KernelAPI.startNew();
  112. await manager.refreshRunning();
  113. expect(toArray(manager.running()).length).toBeGreaterThan(old);
  114. });
  115. });
  116. describe('#startNew()', () => {
  117. it('should start a new kernel', () => {
  118. return manager.startNew();
  119. });
  120. it('should emit a runningChanged signal', async () => {
  121. let called = false;
  122. manager.runningChanged.connect(() => {
  123. called = true;
  124. });
  125. const kernel = await manager.startNew();
  126. await kernel.info;
  127. expect(called).toBe(true);
  128. });
  129. });
  130. describe('#findById()', () => {
  131. it('should find an existing kernel by id', async () => {
  132. const id = kernel.id;
  133. const model = await manager.findById(id);
  134. expect(model!.id).toBe(id);
  135. });
  136. });
  137. describe('#connectTo()', () => {
  138. it('should connect to an existing kernel', () => {
  139. const id = kernel.id;
  140. const newConnection = manager.connectTo({ model: kernel });
  141. expect(newConnection.model.id).toBe(id);
  142. });
  143. });
  144. describe('shutdown()', () => {
  145. it('should shut down a kernel by id', async () => {
  146. const kernel = await manager.startNew();
  147. await kernel.info;
  148. await manager.shutdown(kernel.id);
  149. expect(kernel.isDisposed).toBe(true);
  150. });
  151. it('should emit a runningChanged signal', async () => {
  152. const kernel = await manager.startNew();
  153. const emission = testEmission(manager.runningChanged, {
  154. test: () => {
  155. expect(kernel.isDisposed).toBe(false);
  156. }
  157. });
  158. await kernel.info;
  159. await manager.shutdown(kernel.id);
  160. await emission;
  161. });
  162. it('should dispose of all relevant kernel connections', async () => {
  163. const kernel0 = await manager.startNew();
  164. const kernel1 = manager.connectTo({ model: kernel0.model });
  165. await kernel0.info;
  166. await kernel1.info;
  167. await manager.refreshRunning();
  168. await kernel0.shutdown();
  169. expect(kernel0.status).toBe('dead');
  170. expect(kernel0.isDisposed).toBe(true);
  171. // Wait for the round trip to the server to update the connections.
  172. await sleep(100);
  173. expect(kernel1.status).toBe('dead');
  174. expect(kernel1.isDisposed).toBe(true);
  175. });
  176. });
  177. });
  178. });