package alien4cloud.paas; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.lang.reflect.Field; import java.util.Date; import javax.annotation.Resource; import org.elasticsearch.client.Client; import org.elasticsearch.mapping.ElasticSearchClient; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import alien4cloud.dao.IGenericSearchDAO; import alien4cloud.paas.PaaSProviderPollingMonitor; import alien4cloud.paas.model.DeploymentStatus; import alien4cloud.paas.model.PaaSDeploymentStatusMonitorEvent; import alien4cloud.paas.model.PaaSMessageMonitorEvent; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; /** * Test monitoring events recovery */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:application-context-test.xml") public class PaaSProviderPollingMonitorTest { @Resource(name = "alien-es-dao") private IGenericSearchDAO alienDao; @Resource(name = "alien-monitor-es-dao") private IGenericSearchDAO alienMonitorDao; @Resource ElasticSearchClient esclient; Client nodeClient; private final ObjectMapper jsonMapper = new ObjectMapper(); private Date latestEventDate = null; private Date latestStatusDate = null; @Before public void initMocks() throws IOException, InterruptedException { nodeClient = esclient.getClient(); } private void initEvents() throws JsonProcessingException, InterruptedException { // add 2 message events PaaSMessageMonitorEvent eventMessage = null; String eventJson = null; int i = 0; for (i = 0; i < 2; i++) { eventMessage = new PaaSMessageMonitorEvent(); eventMessage.setOrchestratorId("CloudID"); eventMessage.setDate(addMinutesToDate(2, new Date()).getTime()); eventMessage.setDeploymentId("ID-XXX+" + i); eventMessage.setMessage("EVENT MESSAGE : " + eventMessage.getDate()); eventJson = jsonMapper.writeValueAsString(eventMessage); nodeClient.prepareIndex("deploymentmonitorevents", PaaSMessageMonitorEvent.class.getSimpleName().toLowerCase()).setSource(eventJson) .setRefresh(true).execute().actionGet(); } // add 3 deployment status events PaaSDeploymentStatusMonitorEvent eventDeploymentStatus = null; for (i = 0; i < 3; i++) { eventDeploymentStatus = new PaaSDeploymentStatusMonitorEvent(); eventDeploymentStatus.setOrchestratorId("CloudID"); eventDeploymentStatus.setDate(addMinutesToDate(2, new Date()).getTime()); eventDeploymentStatus.setDeploymentId("DEP_ID-" + i); eventDeploymentStatus.setDeploymentStatus(DeploymentStatus.DEPLOYED); eventJson = jsonMapper.writeValueAsString(eventDeploymentStatus); nodeClient.prepareIndex("deploymentmonitorevents", PaaSDeploymentStatusMonitorEvent.class.getSimpleName().toLowerCase()).setSource(eventJson) .setRefresh(true).execute().actionGet(); } // save the last inserted date (PaaSDeploymentStatusMonitorEvent should be generated from alien only and never from the orchestrator). latestEventDate = new Date(eventMessage.getDate()); latestStatusDate = new Date(eventDeploymentStatus.getDate()); } @Test public void testLoadEventsFromLastRegistered() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, JsonProcessingException, InterruptedException { // init with some events initEvents(); PaaSProviderPollingMonitor paaSProviderPollingMonitor = new PaaSProviderPollingMonitor(alienDao, alienMonitorDao, null, null, "CloudID"); Field lastPollingDateField = PaaSProviderPollingMonitor.class.getDeclaredField("lastPollingDate"); lastPollingDateField.setAccessible(true); Date lastDate = (Date) lastPollingDateField.get(paaSProviderPollingMonitor); assertNotEquals(latestStatusDate, lastDate); assertEquals(latestEventDate, lastDate); } @Test public void testLoadEventsWithoutEvents() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { PaaSProviderPollingMonitor paaSProviderPollingMonitor = new PaaSProviderPollingMonitor(alienDao, alienMonitorDao, null, null, "CloudID"); Field lastPollingDateField = PaaSProviderPollingMonitor.class.getDeclaredField("lastPollingDate"); lastPollingDateField.setAccessible(true); Date lastDate = (Date) lastPollingDateField.get(paaSProviderPollingMonitor); // lastDate should be a new Date() initialized in PaaSProviderPollingMonitor constructor assertTrue(lastDate.after(new Date())); } private Date addMinutesToDate(int minutes, Date beforeTime) { final long ONE_MINUTE_IN_MILLIS = 60000;// millisecs long curTimeInMs = beforeTime.getTime(); Date afterAddingMins = new Date(curTimeInMs + (minutes * ONE_MINUTE_IN_MILLIS)); return afterAddingMins; } }