/*
* NewMain.java
*
* Created on 8 de abril de 2008, 15:47
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package com.wonesys.emsModule.tests;
import java.io.IOException;
import java.net.DatagramSocket;
import java.net.ServerSocket;
import java.util.Collection;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Assert;
import org.junit.Test;
import uk.co.westhawk.snmp.pdu.OneTrapPduv2;
import uk.co.westhawk.snmp.stack.AsnInteger;
import uk.co.westhawk.snmp.stack.AsnObject;
import uk.co.westhawk.snmp.stack.AsnObjectId;
import uk.co.westhawk.snmp.stack.AsnOctets;
import uk.co.westhawk.snmp.stack.AsnUnsInteger;
import uk.co.westhawk.snmp.stack.PduException;
import uk.co.westhawk.snmp.stack.SnmpContext;
import uk.co.westhawk.snmp.stack.SnmpContextv2c;
import uk.co.westhawk.snmp.stack.TrapPduv2;
import uk.co.westhawk.snmp.stack.varbind;
import com.wonesys.emsModule.alarms.Alarm;
import com.wonesys.emsModule.alarms.AlarmsControler;
import com.wonesys.emsModule.hwd.HwdOp;
import com.wonesys.emsModule.hwd.IMessageArrivalListener;
/**
*
* @author mbeltran
* @author Isart Canyameres @ Fundació i2cat
*/
public class EMSmoduleTest implements IMessageArrivalListener {
Log log = LogFactory.getLog(EMSmoduleTest.class);
private static final int ALARM_PORT = 32162;
AlarmsControler alamsControler;
SnmpContext snmpContext;
String message = "";
Object mutex = new Object();
boolean connected = false;
boolean closed = false;
Exception error = null;
/** Creates a new instance of this class */
public EMSmoduleTest() {
alamsControler = new AlarmsControler();
}
@Test
public void libTest() throws Exception {
try {
executa("hwd");
if (error != null) {
Assert.fail(error.getLocalizedMessage());
}
executa("s");
checkAlarmPortIsOpened();
executa("a");
checkAlarmHasBeenReceived();
executa("l");
snmpContext.destroy();
} catch (IOException e) {
// just to display error when test fails
log.error("IOException", e);
throw e;
} catch (Exception e) {
// just to display error when test fails
log.error("IOException", e);
throw e;
}
}
private void checkAlarmPortIsOpened() {
Assert.assertFalse(availablePort(ALARM_PORT));
}
/**
* Checks to see if a specific port is available.
*
* @param port
* the port to check for availability
*/
private static boolean availablePort(int port) {
ServerSocket ss = null;
DatagramSocket ds = null;
try {
ss = new ServerSocket(port);
ss.setReuseAddress(true);
ds = new DatagramSocket(port);
ds.setReuseAddress(true);
return true;
} catch (IOException e) {
} finally {
if (ds != null) {
ds.close();
}
if (ss != null) {
try {
ss.close();
} catch (IOException e) {
/* should not be thrown */
}
}
}
return false;
}
private void checkAlarmHasBeenReceived() {
try {
log.info("Sleeping: Giving time for snmptrap to be received");
Thread.sleep(10000);
log.info("Finished sleeping");
} catch (InterruptedException e) {
log.info("Interrupted!", e);
}
Collection<Alarm> list = alamsControler.getAlarmsList();
log.info("Check Alarm Has Been Received in AlarmControler " + alamsControler);
log.info("Alarms size: " + list.size());
Assert.assertFalse(list.isEmpty());
}
/**
* Simulates an alarm has been received.
*
* @throws IOException
*/
private void sendSNMPTrap() throws IOException {
snmpContext = new SnmpContextv2c("127.0.0.1", ALARM_PORT); // should send from a different port
snmpContext.setCommunity("publica");
TrapPduv2 pdu = new OneTrapPduv2(snmpContext);
AsnObjectId varbindID;
AsnObject varbindValue;
// pdu.setIpAddress(new byte[] { 127, 0, 0, 1 });
// pdu.setEnterprise("1.3.6.1.4.1.9");
// pdu.setGenericTrap(SnmpConstants.SNMP_TRAP_ENTERPRISESPECIFIC);
// pdu.setSpecificTrap(0);
// pdu.setTimeTicks(20646400);
varbindID = new AsnObjectId("1.3.6.1.2.1.1.3.0");
varbindValue = new AsnUnsInteger(20646400);
pdu.addOid(new varbind(varbindID, varbindValue));
varbindID = new AsnObjectId("1.3.6.1.6.3.1.1.4.1.0");
varbindValue = new AsnObjectId("1.3.6.1.4.1.18223.9.8.2.2");
pdu.addOid(new varbind(varbindID, varbindValue));
varbindID = new AsnObjectId("1.3.6.1.4.1.18223.9.8.2.3");
varbindValue = new AsnInteger(0);
pdu.addOid(new varbind(varbindID, varbindValue));
varbindID = new AsnObjectId("1.3.6.1.4.1.18223.9.8.2.4");
varbindValue = new AsnInteger(4);
pdu.addOid(new varbind(varbindID, varbindValue));
varbindID = new AsnObjectId("1.3.6.1.4.1.18223.9.8.2.5");
varbindValue = new AsnOctets("0B");
pdu.addOid(new varbind(varbindID, varbindValue));
varbindID = new AsnObjectId("1.3.6.1.4.1.18223.9.8.2.6");
varbindValue = new AsnOctets("586376724c617365724f6666");
pdu.addOid(new varbind(varbindID, varbindValue));
varbindID = new AsnObjectId("1.3.6.1.4.1.18223.9.8.2.7");
varbindValue = new AsnOctets("5472616E73636569766572204C61736572206F6666");
pdu.addOid(new varbind(varbindID, varbindValue));
varbindID = new AsnObjectId("1.3.6.1.4.1.18223.9.8.2.8");
varbindValue = new AsnInteger(0);
pdu.addOid(new varbind(varbindID, varbindValue));
varbindID = new AsnObjectId("1.3.6.1.4.1.18223.9.8.2.9");
varbindValue = new AsnOctets("0B0001");
pdu.addOid(new varbind(varbindID, varbindValue));
try {
log.info("Sending Pdu");
pdu.send();
} catch (PduException e) {
log.error("PDUException", e);
}
}
private void executa(String entrada) throws Exception {
if (entrada.equals("hwd")) {
HwdOp hwd = new HwdOp();
String ip = "10.10.80.11";
int port = 27773;
hwd.connect(ip, port, this);
connected = true;
String command = createGetCommand();
log.info("Sending Operation to HWD @ " + ip + ":" + port);
log.info(command);
hwd.sendOp(command);
String response = waitForMessageArrival();
Assert.assertFalse(response.equals(""));
log.info(response);
log.info("Sending Operation to HWD @ " + ip + ":" + port);
log.info(command);
hwd.sendOp(command);
response = waitForMessageArrival();
Assert.assertFalse(response.equals(""));
log.info(response);
hwd.disconnect();
connected = false;
closed = true;
}
else if (entrada.equals("s")) {
int alarmsPort = ALARM_PORT;
log.info("Creating alarm listener at port " + alarmsPort);
alamsControler.createAlarmListener(alarmsPort);
log.info("Alarm listener created at port " + alarmsPort);
} else if (entrada.equals("a")) {
log.info("Generating alarm");
sendSNMPTrap();
} else if (entrada.equals("l")) {
Collection<Alarm> list = alamsControler.getAlarmsList();
log.info("Alarm collection size is " + list.size());
for (Alarm elem : list) {
log.info(elem.toString());
}
alamsControler.flush();
} else
log.error("No implementado");
}
private String createGetCommand() {
// getInventory command
return "5910ffffffffff01ffffffff0000b700";
}
// private String getXOR(String cmd) {
//
// int xor = Integer.parseInt(cmd.substring(0, 2), 16) ^ Integer.parseInt(cmd.substring(2, 4), 16);
// for (int i = 4; i <= cmd.length() - 2; i++) {
// xor = xor ^ Integer.parseInt(cmd.substring(i, i + 2), 16);
// i++;
// }
// String hxor = Integer.toHexString(xor);
// if (hxor.length() < 2) {
// hxor = "0" + hxor;
// }
// return hxor;
// }
/**
* @param args
* the command line arguments
* @throws Exception
*/
public static void main(String[] args) throws Exception {
EMSmoduleTest main = new EMSmoduleTest();
int c;
String entrada = "";
System.out.println("Menu autónomo de EMS Module para pruebas");
System.out.println("Opciones:");
System.out.println("\ts Arranca el servicio de recepcion de alarmas");
System.out.println("\tl Mostrar alarmas registradas");
System.out.println();
System.out.println("\tq Finaliza el programa");
System.out.println();
System.out.println("Para test: snmptrap -v 2c -c publica 192.168.0.22:1162 1 1.3.6.1.4.1.18223.9.1.2.2 1.1 s 0 1.1 x 0x03");
while ((c = System.in.read()) != 'q') {
if (c == '\n') {
main.executa(entrada);
entrada = "";
} else {
// feedback
// System.out.print( (char)c );
entrada += String.valueOf((char) c);
}
}
System.out.println();
System.out.println("Gracias por usar EMS Module");
System.exit(0);
}
public String waitForMessageArrival() throws Exception {
synchronized (mutex) {
message = "";
mutex.wait(30000);
if (message.equals(""))
throw new Exception("Timeout waiting for message arrival");
return message.toString();
}
}
@Override
public void messageReceived(String message) {
synchronized (mutex) {
this.message = message;
mutex.notify();
}
}
@Override
public void errorHappened(Exception e) {
if (connected) {
log.error("Error happened on async reader", e);
error = e;
} else if (!closed) {
log.warn("Error happened on async reader", e);
}
}
}