import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.opennaas.extensions.gim.controller.APCPDUPowerControllerDriver;
import org.opennaas.extensions.gim.controller.BasicConsumerController;
import org.opennaas.extensions.gim.controller.BasicDeliveryController;
import org.opennaas.extensions.gim.controller.ModelElementNotFoundException;
import org.opennaas.extensions.gim.controller.PDUController;
import org.opennaas.extensions.gim.controller.PDUPowerControllerDriver;
import org.opennaas.extensions.gim.controller.RouterWithPDUPowerController;
import org.opennaas.extensions.gim.controller.snmp.APCDriver_SNMP;
import org.opennaas.extensions.gim.model.core.entities.GIModel;
import org.opennaas.extensions.gim.model.core.entities.PowerConsumer;
import org.opennaas.extensions.gim.model.core.entities.PowerDelivery;
import org.opennaas.extensions.gim.model.core.entities.PowerSupply;
import org.opennaas.extensions.gim.model.core.entities.pdu.PDU;
import org.opennaas.extensions.gim.model.core.entities.pdu.PDUPort;
import org.opennaas.extensions.gim.model.core.entities.sockets.PowerReceptor;
import org.opennaas.extensions.gim.model.core.entities.sockets.PowerSource;
import org.opennaas.extensions.gim.model.energy.Energy;
import org.opennaas.extensions.gim.model.energy.EnergyClass;
import org.opennaas.extensions.gim.model.energy.EnergyType;
import org.opennaas.extensions.gim.model.load.MeasuredLoad;
import org.opennaas.extensions.gim.model.log.PowerMonitorLog;
public class APCDriverTest {
private final String pduIPAddress = "udp:193.1.29.121/161";
private GIModel model;
APCDriver_SNMP snmpDriver;
PDUPowerControllerDriver apcDriver;
PDUController pduController;
RouterWithPDUPowerController routerController;
BasicConsumerController consumerController;
@Before
public void initModelAndControllers() throws IOException {
model = initModel();
initControllers();
}
@Test
@Ignore
public void testPowerMonitorAndSupplyFromRouterController() throws Exception {
boolean status = routerController.getPowerStatus();
System.out.println("Port Status: " + status);
Assert.assertTrue("Port should be powered on", status);
MeasuredLoad ml = routerController.getCurrentPowerMetrics();
Assert.assertNotNull(ml);
System.out.println("Router Voltage @ " + ml.getReadingTime().toLocaleString() + ": " + ml.getVoltage() + " Volts");
System.out.println("Router Current @ " + ml.getReadingTime().toLocaleString() + ": " + ml.getCurrent() + " Amps");
System.out.println("Router Power @ " + ml.getReadingTime().toLocaleString() + ": " + ml.getPower() + "KW");
System.out.println("Router Energy @ " + ml.getReadingTime().toLocaleString() + ": " + ml.getEnergy() + "KWh");
Assert.assertFalse(ml.getVoltage() == 0);
Assert.assertFalse(ml.getCurrent() == 0);
Assert.assertFalse(ml.getPower() == 0);
Assert.assertFalse(ml.getEnergy() == 0);
Energy e1 = routerController.getAggregatedEnergy();
Energy e = model.getSupplies().get(0).getEnergy();
Assert.assertEquals(e.getEnergyClass(), e1.getEnergyClass());
Assert.assertEquals(e.getEnergyType(), e1.getEnergyType());
Assert.assertEquals(e.getCO2perKw(), e1.getCO2perKw());
Assert.assertEquals(model.getSupplies().get(0).getPricePerUnit(), routerController.getAggregatedPricePerEnergyUnit());
PowerSource source = model.getDeliveries().get(0).getPowerSources().get(0);
Assert.assertTrue(source.getPowerMonitorLog().getMeasuredLoads().contains(ml));
}
/**
* This test may interrupt power to a physical device. It is ignored to ensure test battery is not causing service disruption.
*
* @throws Exception
*/
@Test
@Ignore
public void testPowerManagementFromRouterController() throws Exception {
boolean status = routerController.getPowerStatus();
System.out.println("Port Status: " + status);
Assert.assertTrue("Port should be powered on", status);
routerController.powerOff();
status = routerController.getPowerStatus();
System.out.println("Power Status: " + status);
Assert.assertFalse("Must be powered off", status);
routerController.powerOn();
status = routerController.getPowerStatus();
System.out.println("Power Status: " + status);
Assert.assertTrue("Must be powered on", status);
}
@Test
public void testConsumerController() throws ModelElementNotFoundException, Exception {
String consumerId = "consumer-0001";
String receptorId = "consumer-0001/receptor-0001";
Assert.assertEquals(model.getSupplies().get(0).getEnergy(), consumerController.getAggregatedEnergy(consumerId));
consumerController.getAggregatedEnergyPrice(consumerId);
}
private GIModel initModel() {
Energy e = new Energy(EnergyClass.Green, EnergyType.Wind, 0.11, 100);
PowerSupply supply = new PowerSupply();
supply.setId("supply-0001");
supply.setEnergy(e);
supply.setPricePerUnit(0.12);
// supply.setRatedLoad(ratedLoad);
PowerSource source = new PowerSource();
source.setEnergy(supply.getEnergy());
source.setPricePerUnit(supply.getPricePerUnit());
source.setPowerState(true);
source.setId("supply-0001/source-0001");
source.setElementId("supply-0001");
source.setPowerMonitorLog(new PowerMonitorLog(1, 2));
supply.setPowerSources(new ArrayList<PowerSource>(Arrays.asList(source)));
PowerDelivery delivery = new PowerDelivery();
delivery.setId("delivery-0001");
PowerReceptor receptor = new PowerReceptor();
receptor.setId("delivery-0001/receptor-0001");
receptor.setElementId("delivery-0001");
receptor.setPowerState(true);
receptor.setAttachedTo(source);
delivery.setPowerReceptors(new ArrayList<PowerReceptor>(Arrays.asList(receptor)));
PowerSource source2 = new PowerSource();
source2.setEnergy(supply.getEnergy()); // this data should be filled in with the output of IDeliveryController calculateAggregatedEnergy
source2.setPricePerUnit(supply.getPricePerUnit()); // this data should be filled in with the output of IDeliveryController
// calculateAggregatedEnergyPrice
source2.setPowerState(true);
source2.setId("delivery-0001/source-0001");
source2.setElementId("delivery-0001");
source2.setPowerMonitorLog(new PowerMonitorLog(1, 2));
delivery.setPowerSources(new ArrayList<PowerSource>(Arrays.asList(source2)));
PowerConsumer consumer = new PowerConsumer();
consumer.setId("consumer-0001");
PowerReceptor receptor2 = new PowerReceptor();
receptor2.setId("consumer-0001/receptor-0001");
receptor2.setElementId("consumer-0001");
receptor2.setPowerState(true);
receptor2.setAttachedTo(source2);
consumer.setPowerReceptors(new ArrayList<PowerReceptor>(Arrays.asList(receptor2)));
GIModel model = new GIModel();
model.setConsumers(new ArrayList<PowerConsumer>(Arrays.asList(consumer)));
model.setDeliveries(new ArrayList<PowerDelivery>(Arrays.asList(delivery)));
model.setSupplies(new ArrayList<PowerSupply>(Arrays.asList(supply)));
return model;
}
private void initControllers() throws IOException {
PowerDelivery delivery = model.getDeliveries().get(0);
// create PDU model from delivery
PDU pdu = new PDU();
pdu.setId(delivery.getId());
List<PDUPort> pduPorts = new ArrayList<PDUPort>(delivery.getPowerSources().size());
PowerSource source;
for (int i = 0; i < delivery.getPowerSources().size(); i++) {
source = delivery.getPowerSources().get(i);
PDUPort port = new PDUPort();
port.setId(source.getId());
port.setOutletIndex(i + 1);
pduPorts.add(port);
}
pdu.setPowerSources(pduPorts);
snmpDriver = new APCDriver_SNMP(pduIPAddress);
PDUPort port = (PDUPort) pdu.getPowerSources().get(0);
Map<String, Integer> outletIndexes = new HashMap<String, Integer>();
outletIndexes.put(port.getId(), port.getOutletIndex());
APCPDUPowerControllerDriver apcDriver = new APCPDUPowerControllerDriver();
apcDriver.setDriver(snmpDriver);
apcDriver.setOutletIndexes(outletIndexes);
apcDriver.setPdu(pdu);
this.apcDriver = apcDriver;
BasicDeliveryController deliveryController = new BasicDeliveryController();
deliveryController.setModel(model);
pduController = new PDUController();
pduController.setDeliveryController(deliveryController);
pduController.setDeliveryId(pdu.getId());
pduController.setDriver(apcDriver);
consumerController = new BasicConsumerController();
consumerController.setModel(model);
routerController = new RouterWithPDUPowerController();
routerController.setConsumerController(consumerController);
routerController.setPduController(pduController);
routerController.setConsumerId("consumer-0001");
}
}