package com.freedomotic.plugins.devices.persistence;
import static com.freedomotic.plugins.devices.persistence.util.PersistenceUtility.generateCalendarInMillis;
import java.util.List;
import java.util.UUID;
import org.apache.avro.generic.GenericData;
import org.apache.avro.generic.GenericRecord;
import org.junit.Assert;
import org.junit.Test;
import com.freedomotic.plugins.devices.persistence.model.FreedomoticDataDAO;
import com.freedomotic.plugins.devices.persistence.model.SerializedPersistedData;
import com.freedomotic.reactions.Command;
/**
* Unit test for simple App.
*/
public class PersistencePluginTestIT extends CassandraTestSetup {
/*
It creates a fake event
*/
private Command getFakeCommandForTest() {
Command c = new Command();
c.setProperty("event.date.year", "2016");
c.setProperty("event.date.month", "12");
c.setProperty("event.date.day", "8");
c.setProperty("event.time.hour", "11");
c.setProperty("event.time.minute", "50");
c.setProperty("event.time.second", "32");
c.setProperty("event.type", "event");
c.setProperty("event.uuid", UUID.randomUUID().toString());
c.setProperty("event.object.name", "TEST");
c.setProperty("event.object.protocol", "TEST_PROTOCOL");
c.setProperty("event.object.address", "123.123.123.123");
return c;
}
@Test
public void testTimestampValue() {
Long timestamp = generateCalendarInMillis(this.getFakeCommandForTest());
Assert.assertEquals(1481194232000l, timestamp.longValue()); //8 December 2016 11:50:32 AM
}
/**
* It performs the saving of an event on Cassandra
*/
@Test
public void persistEventOnCassandra() {
FreedomoticDataDAO dao = new FreedomoticDataDAO(cluster);
Command c = this.getFakeCommandForTest();
Long timestamp = generateCalendarInMillis(c);
String event_uuid = c.getProperty("event.uuid");
String name = c.getProperty("event.object.name");
boolean persisted = dao.persistEvent(event_uuid, name, timestamp, c.getProperties().getProperties());
Assert.assertEquals("Persisted event should have been performed", true, persisted);
persisted = dao.persistEvent(event_uuid, name, timestamp, c.getProperties().getProperties());
Assert.assertEquals("Persisted event should NOT have been performed twice", false, persisted);
}
/**
* It persist an event and later it retrieves all the persisted events from Cassandra.
* <br>
* Then, it checks if within the persisted events do exist a proper serialized version of the event previously persisted.
*/
@SuppressWarnings("unchecked")
@Test
public void checkIfAPersistedEventIsProperlyRetrievedAndDeserialized() {
FreedomoticDataDAO dao = new FreedomoticDataDAO(cluster);
Command c = this.getFakeCommandForTest();
Long timestamp = generateCalendarInMillis(c);
String event_uuid = c.getProperty("event.uuid");
String name = c.getProperty("event.object.name");
String protocolPropertyToSave = c.getProperty("event.object.protocol");
boolean persisted = dao.persistEvent(event_uuid, name, timestamp, c.getProperties().getProperties());
Assert.assertEquals("Persisted event should have been performed", true, persisted);
List<SerializedPersistedData> events = dao.getPersistedData();
Assert.assertNotEquals("Retrieved events must be more than zero!", 0, events.size());
GenericRecord genericRecord = null;
GenericData.Array<GenericData.Record> properties = null;
for(SerializedPersistedData event:events) {
Assert.assertNotNull(event.getFreedomoticInstanceId());
if(event_uuid.equals(event.getUuid().toString()))
genericRecord = event.deserialize();
}
Assert.assertNotNull(genericRecord);
Assert.assertEquals(name, genericRecord.get("name").toString());
properties = (GenericData.Array<GenericData.Record>) genericRecord.get("properties");
String savedProtocolProperty = null;
for(GenericRecord record:properties) {
String keyname = record.get("key").toString();
String value = record.get("value").toString();
if("event.object.protocol".equals(keyname))
savedProtocolProperty = value;
}
Assert.assertEquals(protocolPropertyToSave, savedProtocolProperty);
}
}