/*
* To change this template, choose Tools | Templates and open the template in
* the editor.
*/
package com.wordpress.salaboy.procedures;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.drools.grid.SocketService;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import com.wordpress.salaboy.context.tracking.ContextTrackingProvider;
import com.wordpress.salaboy.context.tracking.ContextTrackingService;
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.Call;
import com.wordpress.salaboy.model.Emergency;
import com.wordpress.salaboy.model.FireTruck;
import com.wordpress.salaboy.model.FirefightersDepartment;
import com.wordpress.salaboy.model.Location;
import com.wordpress.salaboy.model.Vehicle;
import com.wordpress.salaboy.model.messages.FireExtinctedMessage;
import com.wordpress.salaboy.model.messages.FireTruckOutOfWaterMessage;
import com.wordpress.salaboy.model.messages.ProcedureCompletedMessage;
import com.wordpress.salaboy.model.messages.VehicleHitsEmergencyMessage;
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.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.junit.Test;
/**
*
* @author esteban
*/
public abstract class DefaultFireProcedureBaseTest extends GridBaseTest {
protected PersistenceService persistenceService;
protected ContextTrackingService trackingService;
private Emergency emergency = null;
private FireTruck fireTruck = null;
private Call call = null;
private FirefightersDepartment firefightersDepartment = null;
private MessageConsumerWorker procedureEndedWorker;
private int proceduresEndedCount;
public DefaultFireProcedureBaseTest() {
}
@Before
public void setUp() throws Exception {
HumanTaskServerService.getInstance().initTaskServer();
initializePersistenceAndTracking();
emergency = new Emergency();
fireTruck = new FireTruck("FireTruck 1");
persistenceService.storeVehicle(fireTruck);
call = new Call(1, 2, new Date());
persistenceService.storeCall(call);
emergency.setCall(call);
emergency.setLocation(new Location(1, 2));
emergency.setType(Emergency.EmergencyType.FIRE);
emergency.setNroOfPeople(1);
persistenceService.storeEmergency(emergency);
firefightersDepartment = new FirefightersDepartment("Firefighter Department 1", 12, 1);
persistenceService.storeFirefightersDepartment(firefightersDepartment);
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();
}
@After
public void tearDown() throws Exception {
MessageServerSingleton.getInstance().stop();
if (remoteN1 != null) {
remoteN1.dispose();
}
if (grid1 != null) {
grid1.get(SocketService.class).close();
}
if (procedureEndedWorker != null) {
procedureEndedWorker.stopWorker();
}
HumanTaskServerService.getInstance().stopTaskServer();
PersistenceServiceProvider.clear();
ContextTrackingProvider.clear();
ProceduresMGMTService.clear();
}
@Test
public void defaultFireSimpleTest() throws Exception {
//start the process
this.startProcess(call, emergency);
//Because of the emergency, a new Task is ready for garage: pick the corresponding vehicle/s
List<Vehicle> trucks = new ArrayList<Vehicle>();
trucks.add(fireTruck);
this.testGarageTask(emergency, trucks);
// The fire truck doesn't reach the emergency yet. No task for
// the firefighter.
Map<String, String> firefighterTasks = this.getFirefighterTasks();
Assert.assertTrue(firefighterTasks.isEmpty());
// Now the fire truck arrives to the emergency
ProceduresMGMTService.getInstance().notifyProcedures(
MessageToEventConverter.convertMessageToEvent(new VehicleHitsEmergencyMessage(fireTruck.getId(),
emergency.getId(), new Date())));
Thread.sleep(2000);
// A new task for the firefighter should be there now
firefighterTasks = this.getFirefighterTasks();
Assert.assertEquals(1, firefighterTasks.size());
//The firefighter completes the task
String firefighterTaskId = firefighterTasks.keySet().iterator().next();
this.completeTask("firefighter", firefighterTaskId);
// Becasuse the fire truck still got enough water, no "Water Refill"
// task exists
firefighterTasks = this.getFirefighterTasks();
Assert.assertTrue(firefighterTasks.isEmpty());
//The process didn't finish yet
Assert.assertEquals(0, proceduresEndedCount);
// Ok, no more fire!
ProceduresMGMTService.getInstance().notifyProcedures(
MessageToEventConverter.convertMessageToEvent(new FireExtinctedMessage(emergency.getId(), new Date())));
Thread.sleep(5000);
//The emergency has ended
Assert.assertEquals(1, proceduresEndedCount);
}
@Test
public void fireTruckOutOfWaterx2Test() throws Exception {
//start the process
this.startProcess(call, emergency);
//Because of the emergency, a new Task is ready for garage: pick the corresponding vehicle/s
List<Vehicle> trucks = new ArrayList<Vehicle>();
trucks.add(fireTruck);
this.testGarageTask(emergency, trucks);
// The fire truck doesn't reach the emergency yet. No task for
// the firefighter.
Map<String, String> firefighterTasks = this.getFirefighterTasks();
Assert.assertTrue(firefighterTasks.isEmpty());
// Now the fire truck arrives to the emergency
ProceduresMGMTService.getInstance().notifyProcedures(
MessageToEventConverter.convertMessageToEvent(new VehicleHitsEmergencyMessage(fireTruck.getId(),
emergency.getId(), new Date())));
Thread.sleep(2000);
// A new task for the firefighter should be there now
firefighterTasks = this.getFirefighterTasks();
Assert.assertEquals(1, firefighterTasks.size());
//The firefighter completes the task
String firefighterTaskId = firefighterTasks.keySet().iterator().next();
this.completeTask("firefighter", firefighterTaskId);
// Becasuse the fire truck still got enough water, no "Water Refill"
// task exists
firefighterTasks = this.getFirefighterTasks();
Assert.assertTrue(firefighterTasks.isEmpty());
// Sudenly, the fire truck runs out of water
ProceduresMGMTService.getInstance().notifyProcedures(
MessageToEventConverter.convertMessageToEvent( new FireTruckOutOfWaterMessage(emergency.getId(), fireTruck.getId(),
new Date())));
Thread.sleep(5000);
//Now, the firefighter has a new task
firefighterTasks = this.getFirefighterTasks();
Assert.assertEquals(1, firefighterTasks.size());
firefighterTaskId = firefighterTasks.keySet().iterator().next();
String firefighterTaskName = firefighterTasks.values().iterator().next();
Assert.assertEquals(
"Water Refill: go to ( " + firefightersDepartment.getX() + ", "
+ firefightersDepartment.getY() + " )", firefighterTaskName);
// The firefighter completes the task
this.completeTask("firefighter", firefighterTaskId);
// No more tasks for firefighter
firefighterTasks = this.getFirefighterTasks();
Assert.assertTrue(firefighterTasks.isEmpty());
// The Fire Truck returns to the emergency
ProceduresMGMTService.getInstance().notifyProcedures(
MessageToEventConverter.convertMessageToEvent(new VehicleHitsEmergencyMessage(fireTruck.getId(),
emergency.getId(), new Date())));
Thread.sleep(5000);
// A new task for the firefighter should be there now
firefighterTasks = this.getFirefighterTasks();
Assert.assertEquals(1, firefighterTasks.size());
firefighterTaskId = firefighterTasks.keySet().iterator().next();
// The firefighter completes the task
this.completeTask("firefighter", firefighterTaskId);
// Becasuse the fire truck still got enough water, no "Water Refill"
// task exists
firefighterTasks = this.getFirefighterTasks();
Assert.assertTrue(firefighterTasks.isEmpty());
// Again, the fire truck runs out of water
ProceduresMGMTService.getInstance().notifyProcedures(
MessageToEventConverter.convertMessageToEvent(new FireTruckOutOfWaterMessage(emergency.getId(), fireTruck.getId(),
new Date())));
Thread.sleep(5000);
firefighterTasks = this.getFirefighterTasks();
Assert.assertEquals(1, firefighterTasks.size());
firefighterTaskId = firefighterTasks.keySet().iterator().next();
firefighterTaskName = firefighterTasks.values().iterator().next();
Assert.assertEquals(
"Water Refill: go to ( " + firefightersDepartment.getX() + ", "
+ firefightersDepartment.getY() + " )", firefighterTaskName);
// The firefighter completes the task
this.completeTask("firefighter", firefighterTaskId);
// No more tasks for firefighter
firefighterTasks = this.getFirefighterTasks();
Assert.assertTrue(firefighterTasks.isEmpty());
//The process didn't finish yet
Assert.assertEquals(0, proceduresEndedCount);
// Ok, no more fire!
ProceduresMGMTService.getInstance().notifyProcedures(
MessageToEventConverter.convertMessageToEvent(new FireExtinctedMessage(emergency.getId(), new Date())));
Thread.sleep(5000);
//The emergency has ended
Assert.assertEquals(1, proceduresEndedCount);
}
private void startProcess(Call call, Emergency emergency) throws InterruptedException {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("call", call);
parameters.put("emergency", emergency);
try {
ProceduresMGMTService.getInstance().newRequestedProcedure(emergency.getId(),
"DefaultFireProcedure", parameters);
} catch (IOException ex) {
Logger.getLogger(DefaultFireProcedureBaseTest.class.getName()).log(Level.SEVERE, null, ex);
}
Thread.sleep(2000);
}
protected abstract void testGarageTask(Emergency emergency, List<Vehicle> selectedVehicles) throws Exception;
protected abstract Map<String, String> getFirefighterTasks() throws Exception;
protected abstract void completeTask(String user, String taskId) throws Exception;
protected abstract void initializePersistenceAndTracking();
}