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() {