kernel.spec.ts 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. // Copyright (c) Jupyter Development Team.
  2. import 'jest';
  3. import { UUID } from '@lumino/coreutils';
  4. import { toArray } from '@lumino/algorithm';
  5. import { KernelAPI } from '../../src';
  6. import {
  7. expectFailure,
  8. testEmission,
  9. JupyterServer,
  10. flakyIt as it
  11. } from '@jupyterlab/testutils';
  12. import {
  13. KernelTester,
  14. makeSettings,
  15. PYTHON_SPEC,
  16. getRequestHandler
  17. } from '../utils';
  18. const PYTHON3_SPEC = JSON.parse(JSON.stringify(PYTHON_SPEC));
  19. PYTHON3_SPEC.name = 'Python3';
  20. PYTHON3_SPEC.display_name = 'python3';
  21. const server = new JupyterServer();
  22. beforeAll(async () => {
  23. await server.start();
  24. });
  25. afterAll(async () => {
  26. await server.shutdown();
  27. });
  28. describe('kernel', () => {
  29. let tester: KernelTester;
  30. afterEach(async () => {
  31. if (tester) {
  32. tester.dispose();
  33. }
  34. const models = await KernelAPI.listRunning();
  35. await Promise.all(models.map(m => KernelAPI.shutdownKernel(m.id)));
  36. });
  37. describe('Kernel.listRunning()', () => {
  38. it('should yield a list of valid kernel ids', async () => {
  39. const kernel = await KernelAPI.startNew();
  40. expect(toArray(await KernelAPI.listRunning()).length).toBeGreaterThan(0);
  41. await KernelAPI.shutdownKernel(kernel.id);
  42. });
  43. it('should accept server settings', async () => {
  44. const serverSettings = makeSettings();
  45. const k = await KernelAPI.startNew({}, serverSettings);
  46. const response = await KernelAPI.listRunning(serverSettings);
  47. expect(toArray(response).length).toBeGreaterThan(0);
  48. await KernelAPI.shutdownKernel(k.id);
  49. });
  50. it('should throw an error for an invalid model', async () => {
  51. const data = { id: UUID.uuid4(), name: 'test' };
  52. const settings = getRequestHandler(200, data);
  53. const promise = KernelAPI.listRunning(settings);
  54. await expectFailure(promise, 'Invalid kernel list');
  55. });
  56. it('should throw an error for an invalid response', async () => {
  57. const settings = getRequestHandler(201, {});
  58. const promise = KernelAPI.listRunning(settings);
  59. await expectFailure(promise, 'Invalid response: 201 Created');
  60. });
  61. it('should throw an error for an error response', async () => {
  62. const settings = getRequestHandler(500, {});
  63. const promise = KernelAPI.listRunning(settings);
  64. await expectFailure(promise, '');
  65. });
  66. });
  67. describe('KernelAPI.startNew()', () => {
  68. it('should accept ajax options', async () => {
  69. const serverSettings = makeSettings();
  70. const k = await KernelAPI.startNew({}, serverSettings);
  71. await KernelAPI.shutdownKernel(k.id);
  72. });
  73. it('should still construct connection if the kernel dies', async () => {
  74. // If a kernel dies immediately, the kernel connection should still send
  75. // out the status signal, then dispose the connection.
  76. tester = new KernelTester();
  77. tester.initialStatus = 'dead';
  78. const kernel = await tester.start();
  79. const dead = testEmission(kernel.statusChanged, {
  80. test: (sender, state) => state === 'dead'
  81. });
  82. await dead;
  83. expect(kernel.isDisposed).toBe(true);
  84. expect(kernel.status).toBe('dead');
  85. tester.dispose();
  86. });
  87. it('should throw an error for an invalid kernel id', async () => {
  88. const serverSettings = getRequestHandler(201, { id: UUID.uuid4() });
  89. const kernelPromise = KernelAPI.startNew({}, serverSettings);
  90. await expectFailure(kernelPromise);
  91. });
  92. it('should throw an error for another invalid kernel id', async () => {
  93. const serverSettings = getRequestHandler(201, {
  94. id: UUID.uuid4(),
  95. name: 1
  96. });
  97. const kernelPromise = KernelAPI.startNew({}, serverSettings);
  98. await expectFailure(kernelPromise);
  99. });
  100. it('should throw an error for an invalid response', async () => {
  101. const data = { id: UUID.uuid4(), name: 'foo' };
  102. const serverSettings = getRequestHandler(200, data);
  103. const kernelPromise = KernelAPI.startNew({}, serverSettings);
  104. await expectFailure(kernelPromise, 'Invalid response: 200 OK');
  105. });
  106. it('should throw an error for an error response', async () => {
  107. const serverSettings = getRequestHandler(500, {});
  108. const kernelPromise = KernelAPI.startNew({}, serverSettings);
  109. await expectFailure(kernelPromise, '');
  110. });
  111. it('should auto-reconnect on websocket error', async () => {
  112. tester = new KernelTester();
  113. const kernel = await tester.start();
  114. await kernel.info;
  115. const emission = testEmission(kernel.connectionStatusChanged, {
  116. find: (k, status) => status === 'connecting'
  117. });
  118. await tester.close();
  119. await emission;
  120. });
  121. });
  122. describe('Kernel.shutdown()', () => {
  123. it('should shut down a kernel by id', async () => {
  124. const kernel = await KernelAPI.startNew();
  125. await KernelAPI.shutdownKernel(kernel.id);
  126. const kernels = await KernelAPI.listRunning();
  127. expect(kernels.find(k => k.id === kernel.id)).toBeUndefined();
  128. });
  129. it('should handle a 404 error', () => {
  130. return KernelAPI.shutdownKernel(UUID.uuid4());
  131. });
  132. });
  133. });