package rocks.inspectit.server.service.rest;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasEntry;
import static org.hamcrest.Matchers.hasItem;
import static org.hamcrest.Matchers.hasKey;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.nullValue;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import java.util.Collections;
import java.util.Date;
import java.util.Map;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import rocks.inspectit.shared.all.exception.BusinessException;
import rocks.inspectit.shared.cs.cmr.service.IStorageService;
import rocks.inspectit.shared.cs.communication.data.cmr.RecordingData;
import rocks.inspectit.shared.cs.storage.StorageData;
import rocks.inspectit.shared.cs.storage.processor.impl.InvocationExtractorDataProcessor;
import rocks.inspectit.shared.cs.storage.recording.RecordingProperties;
import rocks.inspectit.shared.cs.storage.recording.RecordingState;
/**
* Tests the {@link StorageRestfulService}.
*
* @author Ivan Senic
*
*/
@SuppressWarnings("PMD")
public class StorageRestfulServiceTest {
/**
* Class under test.
*/
private StorageRestfulService restfulService;
/**
* Mocked {@link IStorageService}.
*/
@Mock
private IStorageService storageService;
/**
* {@link StorageData}.
*/
@Mock
private StorageData storageData;
/**
* Init.
*/
@BeforeTest
public void init() {
MockitoAnnotations.initMocks(this);
restfulService = new StorageRestfulService();
restfulService.storageService = storageService;
}
@Test
public void getStorageById() {
String id = "id";
when(storageData.getId()).thenReturn(id);
when(storageService.getExistingStorages()).thenReturn(Collections.singletonList(storageData));
assertThat(restfulService.getStorageById(id), is(storageData));
when(storageData.getId()).thenReturn("");
assertThat(restfulService.getStorageById(id), is(nullValue()));
}
@Test
public void createStorage() throws BusinessException {
String name = "name";
restfulService.createStorage(name);
ArgumentCaptor<StorageData> captor = ArgumentCaptor.forClass(StorageData.class);
verify(storageService, times(1)).createAndOpenStorage(captor.capture());
assertThat(captor.getValue().getName(), is(name));
}
@Test(expectedExceptions = { BusinessException.class })
public void createStorageEmptyName() throws BusinessException {
restfulService.createStorage("");
}
@Test
public void deleteStorage() throws BusinessException {
String id = "id";
restfulService.deleteStorage(id);
ArgumentCaptor<StorageData> captor = ArgumentCaptor.forClass(StorageData.class);
verify(storageService, times(1)).deleteStorage(captor.capture());
assertThat(captor.getValue().getId(), is(id));
}
@Test
public void finalizeStorage() throws BusinessException {
String id = "id";
restfulService.finalizeStorage(id);
ArgumentCaptor<StorageData> captor = ArgumentCaptor.forClass(StorageData.class);
verify(storageService, times(1)).closeStorage(captor.capture());
assertThat(captor.getValue().getId(), is(id));
}
@Test
public void recordingStatus() {
RecordingData recordingData = mock(RecordingData.class, Mockito.RETURNS_SMART_NULLS);
when(storageService.getRecordingData()).thenReturn(recordingData);
when(storageService.getRecordingState()).thenReturn(RecordingState.OFF);
assertThat(restfulService.getRecordingState(), hasEntry("recordingState", (Object) RecordingState.OFF));
verifyZeroInteractions(recordingData);
when(storageService.getRecordingState()).thenReturn(RecordingState.ON);
when(recordingData.getRecordEndDate()).thenReturn(new Date());
Map<String, Object> result = restfulService.getRecordingState();
assertThat(result, hasEntry("recordingState", (Object) RecordingState.ON));
assertThat(result, hasKey("recordingStopDate"));
when(storageService.getRecordingState()).thenReturn(RecordingState.SCHEDULED);
when(recordingData.getRecordStartDate()).thenReturn(new Date());
result = restfulService.getRecordingState();
assertThat(result, hasEntry("recordingState", (Object) RecordingState.SCHEDULED));
assertThat(result, hasKey("schduledStartDate"));
}
@SuppressWarnings("deprecation")
@Test
public void startRecording() throws BusinessException {
String id = "id";
StorageData storageData = new StorageData();
storageData.setId(id);
when(storageService.getExistingStorages()).thenReturn(Collections.singletonList(storageData));
restfulService.startOrScheduleRecording(id, 10L, 20L, true, true);
ArgumentCaptor<RecordingProperties> propertiesCaptor = ArgumentCaptor.forClass(RecordingProperties.class);
verify(storageService, times(1)).startOrScheduleRecording(eq(storageData), propertiesCaptor.capture());
assertThat(propertiesCaptor.getValue().getStartDelay(), is(10L));
assertThat(propertiesCaptor.getValue().getRecordDuration(), is(20L));
assertThat(propertiesCaptor.getValue().isAutoFinalize(), is(true));
assertThat(propertiesCaptor.getValue().getRecordingDataProcessors(), hasItem(is(InvocationExtractorDataProcessor.class)));
restfulService.startOrScheduleRecording(id, 10L, 20L, false, false);
verify(storageService, times(2)).startOrScheduleRecording(eq(storageData), propertiesCaptor.capture());
assertThat(propertiesCaptor.getValue().isAutoFinalize(), is(false));
assertThat(propertiesCaptor.getValue().getRecordingDataProcessors(), not(hasItem(is(InvocationExtractorDataProcessor.class))));
}
}