package com.wordpress.salaboy.procedures;
import com.wordpress.salaboy.context.tracking.ContextTrackingProvider;
import com.wordpress.salaboy.context.tracking.ContextTrackingService;
import org.drools.grid.SocketService;
import com.wordpress.salaboy.grid.GridBaseTest;
import com.wordpress.salaboy.messaging.MessageConsumerWorker;
import com.wordpress.salaboy.messaging.MessageConsumerWorkerHandler;
import com.wordpress.salaboy.messaging.MessageServerSingleton;
import com.wordpress.salaboy.model.Ambulance;
import com.wordpress.salaboy.model.Call;
import com.wordpress.salaboy.model.Emergency;
import com.wordpress.salaboy.model.Hospital;
import com.wordpress.salaboy.model.Location;
import com.wordpress.salaboy.model.Vehicle;
import com.wordpress.salaboy.model.messages.ProcedureCompletedMessage;
import com.wordpress.salaboy.model.messages.VehicleHitsEmergencyMessage;
import com.wordpress.salaboy.model.messages.VehicleHitsHospitalMessage;
import com.wordpress.salaboy.model.persistence.PersistenceService;
import com.wordpress.salaboy.model.persistence.PersistenceServiceProvider;
import com.wordpress.salaboy.services.HumanTaskServerService;
import com.wordpress.salaboy.services.ProceduresMGMTService;
import com.wordpress.salaboy.services.util.MessageToEventConverter;
import java.io.File;
import java.util.*;
import static org.junit.Assert.*;
import org.junit.Test;
/**
*
* @author salaboy
*/
public abstract class DefaultHeartAttackProcedureBaseTest extends GridBaseTest {
private Emergency emergency = null;
private Call call = null;
private MessageConsumerWorker procedureEndedWorker;
private int proceduresEndedCount;
protected PersistenceService persistenceService;
protected ContextTrackingService trackingService;
private Ambulance ambulance1;
private Ambulance ambulance2;
public DefaultHeartAttackProcedureBaseTest() {
}
private static void deleteRecursively(File file) {
if (!file.exists()) {
return;
}
if (file.isDirectory()) {
for (File child : file.listFiles()) {
deleteRecursively(child);
}
}
if (!file.delete()) {
throw new RuntimeException(
"Couldn't empty database. Offending file:" + file);
}
}
protected void setUp() throws Exception {
System.out.println("Setting up in Super");
deleteRecursively(new File(ContextTrackingProvider.defaultDB));
deleteRecursively(new File("/data"));
persistenceService = PersistenceServiceProvider.getPersistenceService();
trackingService = ContextTrackingProvider.getTrackingService();
HumanTaskServerService.getInstance().initTaskServer();
call = new Call(1, 2, new Date());
assertEquals(0, persistenceService.getAllCalls().size());
persistenceService.storeCall(call);
assertEquals(1, persistenceService.getAllCalls().size());
emergency = new Emergency();
emergency.setCall(call);
emergency.setLocation(new Location(1, 2));
emergency.setType(Emergency.EmergencyType.HEART_ATTACK);
emergency.setNroOfPeople(1);
assertEquals(0, persistenceService.getAllEmergencies().size());
persistenceService.storeEmergency(emergency);
assertEquals(1, persistenceService.getAllEmergencies().size());
trackingService.attachEmergency(call.getId(), emergency.getId());
persistenceService.storeHospital(new Hospital("My Hospital", 12, 1));
assertEquals(0, persistenceService.getAllVehicles().size());
ambulance1 = new Ambulance("My Ambulance Number 1");
persistenceService.storeVehicle(ambulance1);
ambulance2 = new Ambulance("My Ambulance Number 2");
persistenceService.storeVehicle(ambulance2);
assertEquals(2, persistenceService.getAllVehicles().size());
MessageServerSingleton.getInstance().start();
this.coreServicesMap = new HashMap();
createRemoteNode();
//Procedure Ended Worker
procedureEndedWorker = new MessageConsumerWorker("ProcedureEndedCoreServer", new MessageConsumerWorkerHandler<ProcedureCompletedMessage>() {
@Override
public void handleMessage(ProcedureCompletedMessage procedureEndsMessage) {
proceduresEndedCount++;
}
});
procedureEndedWorker.start();
}
protected void tearDown() throws Exception {
System.out.println("Tearing Down in Super");
HumanTaskServerService.getInstance().stopTaskServer();
MessageServerSingleton.getInstance().stop();
if (remoteN1 != null) {
remoteN1.dispose();
}
if (grid1 != null) {
grid1.get(SocketService.class).close();
}
if (procedureEndedWorker != null) {
procedureEndedWorker.stopWorker();
}
PersistenceServiceProvider.clear();
ContextTrackingProvider.clear();
ProceduresMGMTService.clear();
}
@Test
public void defaultHeartAttackSimpleTest() throws Exception {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("call", call);
parameters.put("emergency", emergency);
assertEquals(0, persistenceService.getAllProcedures().size());
ProceduresMGMTService.getInstance().newRequestedProcedure(emergency.getId(), "DefaultHeartAttackProcedure", parameters);
Thread.sleep(5000);
assertEquals(1, persistenceService.getAllProcedures().size());
List<Vehicle> vehicles = new ArrayList<Vehicle>();
vehicles.add(ambulance1);
doGarageTask(emergency, vehicles);
Thread.sleep(5000);
//The vehicle reaches the emergency
ProceduresMGMTService.getInstance().notifyProcedures(MessageToEventConverter.convertMessageToEvent(new VehicleHitsEmergencyMessage(ambulance1.getId(), emergency.getId(), new Date())));
Thread.sleep(4000);
//1 task for the doctor
Map<String, String> doctorTasksId = getDoctorTasksId();
assertEquals(1, doctorTasksId.size());
//The doctor completes the task
doDoctorTask(doctorTasksId.keySet().iterator().next());
Thread.sleep(4000);
//The process didn't finish yet
assertEquals(0, proceduresEndedCount);
//The vehicle reaches the hospital
ProceduresMGMTService.getInstance().notifyProcedures(MessageToEventConverter.convertMessageToEvent(new VehicleHitsHospitalMessage(ambulance1.getId(), new Hospital("Hospital A", 0, 0), emergency.getId(), new Date())));
Thread.sleep(5000);
//The emergency has ended
assertEquals(1, proceduresEndedCount);
}
@Test
public void defaultHeartAttackWith2VehiclesTest() throws Exception {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("call", call);
parameters.put("emergency", emergency);
//we want to dispatch 2 ambulances
List<Vehicle> vehicles = new ArrayList<Vehicle>();
vehicles.add(ambulance1);
vehicles.add(ambulance2);
assertEquals(0, persistenceService.getAllProcedures().size());
ProceduresMGMTService.getInstance().newRequestedProcedure(emergency.getId(), "DefaultHeartAttackProcedure", parameters);
Thread.sleep(5000);
assertEquals(1, persistenceService.getAllProcedures().size());
doGarageTask(emergency, vehicles);
Thread.sleep(5000);
//The vehicle 2 reaches the emergency
ProceduresMGMTService.getInstance().notifyProcedures(MessageToEventConverter.convertMessageToEvent(new VehicleHitsEmergencyMessage(ambulance2.getId(), emergency.getId(), new Date())));
Thread.sleep(4000);
//1 task for doctor now
Map<String, String> doctorTasksId = getDoctorTasksId();
assertEquals(1, doctorTasksId.size());
}
protected abstract void doGarageTask(Emergency emergency, List<Vehicle> selectedVehicles) throws Exception;
protected abstract Map<String, String> getDoctorTasksId() throws Exception;
protected abstract void doDoctorTask(String taskId) throws Exception;
}