/*
* ALMA - Atacama Large Millimiter Array (c) European Southern Observatory, 2011
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package cern.laser.business.pojo;
import java.net.InetAddress;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import javax.jms.JMSException;
import javax.jms.Message;
import junit.framework.TestCase;
import org.apache.log4j.Appender;
import org.apache.log4j.Layout;
import org.apache.log4j.Level;
import org.apache.log4j.spi.ErrorHandler;
import org.apache.log4j.spi.Filter;
import org.apache.log4j.spi.LoggingEvent;
import org.omg.CORBA.ORB;
import alma.JavaContainerError.wrappers.AcsJContainerServicesEx;
import alma.acs.container.testsupport.DummyContainerServices;
import alma.acs.logging.ClientLogManager;
import alma.acs.util.ACSPorts;
import cern.laser.business.cache.AlarmCacheListenerImpl;
import cern.laser.business.data.AlarmChange;
import cern.laser.source.alarmsysteminterface.FaultState;
import cern.laser.source.alarmsysteminterface.impl.ASIMessageHelper;
import cern.laser.source.alarmsysteminterface.impl.FaultStateImpl;
import cern.laser.source.alarmsysteminterface.impl.XMLMessageHelper;
import cern.laser.source.alarmsysteminterface.impl.message.ASIMessage;
import com.cosylab.CDB.DAL;
import com.cosylab.CDB.DALHelper;
import com.cosylab.acs.jms.ACSJMSTextMessage;
import com.cosylab.acs.laser.dao.ACSAlarmCacheImpl;
import com.cosylab.acs.laser.dao.ACSAlarmDAOImpl;
import com.cosylab.acs.laser.dao.ACSCategoryDAOImpl;
import com.cosylab.acs.laser.dao.ConfigurationAccessor;
import com.cosylab.acs.laser.dao.ConfigurationAccessorFactory;
public class TestAlarmMessageProcessor extends TestCase {
private static Logger m_logger;
private static final int N_STATE_CHANGES = 2;
private static String hostname;
private static ORB m_orb;
private static DAL theDAL;
private static AlarmMessageProcessorImpl processor;
private static Calendar loadingTime;
static {
org.apache.log4j.Logger root = org.apache.log4j.Logger.getRootLogger();
root.removeAllAppenders();
root.addAppender(new Appender() {
@Override
public void setName(String paramString) {
}
@Override
public void setLayout(Layout paramLayout) {
}
@Override
public void setErrorHandler(ErrorHandler paramErrorHandler) {
}
@Override
public boolean requiresLayout() {
return false;
}
@Override
public String getName() {
return null;
}
@Override
public Layout getLayout() {
return null;
}
@Override
public Filter getFilter() {
return null;
}
@Override
public ErrorHandler getErrorHandler() {
return null;
}
@Override
public void close() {
}
@Override
public void clearFilters() {
}
@Override
public void addFilter(Filter paramFilter) {
}
private Map<Level, java.util.logging.Level> levels = new HashMap<Level, java.util.logging.Level>();
{
levels.put(Level.INFO, java.util.logging.Level.INFO);
levels.put(Level.DEBUG, java.util.logging.Level.FINE);
levels.put(Level.TRACE, java.util.logging.Level.FINER);
levels.put(Level.WARN, java.util.logging.Level.WARNING);
levels.put(Level.ERROR, java.util.logging.Level.SEVERE);
}
@Override
public void doAppend(LoggingEvent event) {
LogRecord record = new LogRecord(levels.get(event.getLevel()), event.getRenderedMessage());
record.setLoggerName(event.getLoggerName());
m_logger.log(record);
}
});
System.setProperty("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB");
System.setProperty("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton");
hostname = "localhost";
try {
m_logger = ClientLogManager.getAcsLogManager().getLoggerForApplication("TestAlarmMessageProcessor", false);
hostname = InetAddress.getLocalHost().getHostName();
m_orb = ORB.init((String[])null, null);
theDAL = DALHelper.narrow(m_orb.string_to_object("corbaloc::" + hostname + ":" + ACSPorts.getCDBPort() + "/CDB"));
ConfigurationAccessor configAccessor = ConfigurationAccessorFactory.getInstance(new DummyContainerServices(null, m_logger) {
@Override
public DAL getCDB() throws AcsJContainerServicesEx {
return theDAL;
}
});
ACSAlarmDAOImpl alarmDAO = new ACSAlarmDAOImpl(m_logger);
ACSCategoryDAOImpl categoryDAO = new ACSCategoryDAOImpl(m_logger, alarmDAO);
alarmDAO.setConfAccessor(configAccessor);
categoryDAO.setConfAccessor(configAccessor);
long startTime = System.currentTimeMillis();
alarmDAO.loadAlarms();
long endTime = System.currentTimeMillis();
loadingTime = Calendar.getInstance();
loadingTime.setTimeInMillis(endTime-startTime);
System.out.println("Loading alarm execution time: "+loadingTime.get(Calendar.MINUTE)+" mins and "+loadingTime.get(Calendar.SECOND)+" secs");
categoryDAO.loadCategories();
AlarmCacheServerImpl server = new AlarmCacheServerImpl() {
@Override
public void publish(Collection alarmChanges) {
for (Object o: alarmChanges) {
AlarmChange change = (AlarmChange)o;
m_logger.info(change.getAlarmId() + " changed to " + change.getCurrent().getStatus().getActive());
}
}
@Override
public void notify(Collection alarmChanges) {
// no-op, don't try to send e-mails or SMSs
}
};
server.setAlarmDAO(alarmDAO);
AlarmCacheListenerImpl listener = new AlarmCacheListenerImpl(server);
ACSAlarmCacheImpl alarmCache = new ACSAlarmCacheImpl(alarmDAO, categoryDAO, listener, m_logger);
processor = new AlarmMessageProcessorImpl();
processor.setAlarmCache(alarmCache);
} catch (Exception e) {
e.printStackTrace();
}
}
public void testStressKnownAlarmsUmatchingRR() throws Exception {
Message[] messages = new Message[6];
messages[0] = createJMSMessage("PSA", "CONTROL/DV01/PSA", 1, true);
messages[1] = createJMSMessage("PSA", "CONTROL/DV02/PSA", 1, true);
messages[2] = createJMSMessage("PSA", "CONTROL/LA02/PSA", 1, true);
messages[3] = createJMSMessage("PSA", "CONTROL/DV01/PSA", 2, true);
messages[4] = createJMSMessage("PSA", "CONTROL/DV02/PSA", 2, true);
messages[5] = createJMSMessage("PSA", "CONTROL/LA02/PSA", 2, true);
internalTestStressWithMessages(messages);
}
public void testStressUnknownAlarmsMatchingRR() throws Exception {
Message[] messages = new Message[6];
messages[0] = createJMSMessage("PSD", "CONTROL/CA01/PSD", 2, true);
messages[1] = createJMSMessage("PSD", "CONTROL/CA02/PSD", 2, true);
messages[2] = createJMSMessage("PSD", "CONTROL/CA03/PSA", 2, true);
messages[3] = createJMSMessage("DTX", "CONTROL/CA01/DTXBBpr4", 10, true);
messages[4] = createJMSMessage("DTX", "CONTROL/CA02/DTXBBpr4", 10, true);
messages[5] = createJMSMessage("DTX", "CONTROL/CA03/DTXBBpr4", 10, true);
internalTestStressWithMessages(messages);
}
public void testStressUnknownAlarmsUmatchingRR() throws Exception {
Message[] messages = new Message[6];
messages[0] = createJMSMessage("PSD", "CONTROL/CA01/PSD", 2, true);
messages[1] = createJMSMessage("PSD", "CONTROL/CA02/PSD", 2, true);
messages[2] = createJMSMessage("PSD", "CONTROL/CA03/PSA", 2, true);
messages[3] = createJMSMessage("DTX", "CONTROL/CA01/DTXBBpr0", 10, true);
messages[4] = createJMSMessage("DTX", "CONTROL/CA02/DTXBBpr0", 10, true);
messages[5] = createJMSMessage("DTX", "CONTROL/CA03/DTXBBpr0", 10, true);
internalTestStressWithMessages(messages);
}
public void internalTestStressWithMessages(Message[] messages) throws Exception {
for (int i = 0; i < messages.length; i++)
processor.process(messages[i]);
}
private ACSJMSTextMessage createJMSMessage(String ff, String fm, int code, boolean active)
throws Exception, JMSException {
// Create the fault states
List<FaultState> states = new ArrayList<FaultState>();
for(int j=0; j!= N_STATE_CHANGES; j++) {
FaultState faultState = new FaultStateImpl(ff, fm, code);
faultState.setDescriptor( active ? FaultState.ACTIVE : FaultState.TERMINATE );
faultState.setUserTimestamp(new Timestamp(System.currentTimeMillis()));
states.add(faultState);
}
// Create the ASIMessage with the fault states
ASIMessage asiMessage = ASIMessageHelper.marshal(states);
cern.laser.source.alarmsysteminterface.impl.message.Timestamp timestamp = new cern.laser.source.alarmsysteminterface.impl.message.Timestamp();
long currentTimeMillis = System.currentTimeMillis();
timestamp.setMicroseconds(currentTimeMillis%1000);
timestamp.setSeconds(currentTimeMillis/1000);
asiMessage.setSourceTimestamp(timestamp);
asiMessage.setSourceHostname(hostname);
asiMessage.setBackup(false);
asiMessage.setSourceName("ALARM_SYSTEM_SOURCES");
// And wrap it inside a JMS text message
ACSJMSTextMessage message = new ACSJMSTextMessage(new DummyContainerServices("test", m_logger));
String text = XMLMessageHelper.marshal(asiMessage);
message.setText(text);
return message;
}
@Override
protected void tearDown() throws Exception {
// TODO Auto-generated method stub
super.tearDown();
System.out.println("Loading alarm execution time: "+loadingTime.get(Calendar.MINUTE)+" mins and "+loadingTime.get(Calendar.SECOND)+" secs");
}
}