diff --git a/src/services/experiments/execution/__tests__/simulation-service.test.js b/src/services/experiments/execution/__tests__/simulation-service.test.js index ff5d483325b4cf0e6b727936f3776cd2792efe7f..24f3b285afbf4107c6c41221b3d6d85eb35dd977 100644 --- a/src/services/experiments/execution/__tests__/simulation-service.test.js +++ b/src/services/experiments/execution/__tests__/simulation-service.test.js @@ -9,6 +9,7 @@ import MockSimulations from '../../../../mocks/mock_simulations.json'; import SimulationService from '../../../../services/experiments/execution/simulation-service.js'; import ErrorHandlerService from '../../../error-handler-service'; +import RoslibService from '../../../roslib-service'; import { EXPERIMENT_STATE } from '../../../../services/experiments/experiment-constants.js'; jest.setTimeout(10000); @@ -92,4 +93,96 @@ test('verifies whether a simulation is ready', async () => { simReady = SimulationService.instance .simulationReady('mock-server-url', 'wrong-creation-id'); await expect(simReady).rejects.toEqual(undefined); +}); + +test('register for ROS status information', () => { + let statusUpdateCallback = undefined; + let mockStatusListener = { + subscribe: jest.fn((callback) => { + statusUpdateCallback = callback; + }), + removeAllListeners: jest.fn() + }; + jest.spyOn(RoslibService.instance, 'getConnection').mockImplementation(); + jest.spyOn(RoslibService.instance, 'createStringTopic').mockImplementation(() => { + return mockStatusListener; + }); + let progressMessageCallback = jest.fn(); + + // we register twice to check that original sub is destroyed and re-created without error + SimulationService.instance.registerForRosStatusInformation('test-ros-ws-url', progressMessageCallback); + SimulationService.instance.registerForRosStatusInformation('test-ros-ws-url', progressMessageCallback); + expect(RoslibService.instance.getConnection.mock.calls.length).toBe(2); + expect(mockStatusListener.removeAllListeners.mock.calls.length).toBe(1); + + // send status update with task info + let rosStatusData = { + progress: { + task: 'test-some-task', + subtask: 'test-some-subtask' + } + }; + statusUpdateCallback({ data: JSON.stringify(rosStatusData) }); + expect(progressMessageCallback).toHaveBeenCalledWith({ + main: rosStatusData.progress.task, + sub: rosStatusData.progress.subtask + }); + + // send status update indicating we're done + rosStatusData.progress.done = true; + statusUpdateCallback({ data: JSON.stringify(rosStatusData) }); + expect(progressMessageCallback).toHaveBeenCalledWith({ + main: 'Simulation initialized.' + }); + expect(mockStatusListener.removeAllListeners.mock.calls.length).toBe(2); +}); + +test('can retrieve the state of a simulation', async () => { + let returnValueGET = undefined; + jest.spyOn(ErrorHandlerService.instance, 'displayServerHTTPError').mockImplementation(); + jest.spyOn(SimulationService.instance, 'httpRequestGET').mockImplementation(() => { + if (SimulationService.instance.httpRequestGET.mock.calls.length === 1) { + returnValueGET = { state: EXPERIMENT_STATE.PAUSED }; // proper state msg + } + else if (SimulationService.instance.httpRequestGET.mock.calls.length === 2) { + return Promise.reject(); + } + + return Promise.resolve({ + json: () => { + return returnValueGET; + } + }); + }); + + // call 1 => proper return + let simSate = await SimulationService.instance.getState('test-url', 1); + expect(simSate).toBe(returnValueGET); + + // call 2 => rejected + simSate = await SimulationService.instance.getState('test-url', 1); + expect(ErrorHandlerService.instance.displayServerHTTPError).toHaveBeenCalled(); +}); + +test('can set the state of a simulation', async () => { + let returnValuePUT = undefined; + jest.spyOn(ErrorHandlerService.instance, 'onErrorSimulationUpdate').mockImplementation(); + jest.spyOn(SimulationService.instance, 'httpRequestPUT').mockImplementation(() => { + if (SimulationService.instance.httpRequestGET.mock.calls.length === 1) { + returnValuePUT = {}; + } + else if (SimulationService.instance.httpRequestGET.mock.calls.length === 2) { + return Promise.reject(); + } + + return Promise.resolve(returnValuePUT); + }); + + // call 1 => proper return + let returnValue = await SimulationService.instance.updateState('test-url', 1, EXPERIMENT_STATE.PAUSED); + expect(returnValue).toBe(returnValuePUT); + + // call 2 => rejected + returnValue = await SimulationService.instance.updateState('test-url', 1, EXPERIMENT_STATE.PAUSED); + expect(ErrorHandlerService.instance.onErrorSimulationUpdate).toHaveBeenCalled(); }); \ No newline at end of file diff --git a/src/services/experiments/execution/server-resources-service.js b/src/services/experiments/execution/server-resources-service.js index 7c03b2a3f0957358da0f9674e3edd1c8e594735b..57c2abfc9bbbc71fc64dbfd4e232233c6f203082 100644 --- a/src/services/experiments/execution/server-resources-service.js +++ b/src/services/experiments/execution/server-resources-service.js @@ -106,7 +106,7 @@ class ServerResourcesService extends HttpService { .then(async (response) => { return await response.json(); }) - .catch(/*serverError.displayHTTPError*/ErrorHandlerService.instance.displayServerHTTPError); + .catch(ErrorHandlerService.instance.displayServerHTTPError); } _createSlurmMonitorObservable() {