/*
* ALMA - Atacama Large Millimiter Array
* (c) European Southern Observatory, 2002
* Copyright by ESO (in the framework of the ALMA collaboration),
* All rights reserved
*
* 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 alma.acs.lasercore.test;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import junit.framework.TestCase;
import alma.acs.component.client.ComponentClientTestCase;
import alma.alarmsystem.core.alarms.LaserCoreFaultState;
import alma.alarmsystem.core.alarms.LaserCoreFaultState.LaserCoreFaultCodes;
import cern.laser.business.data.Alarm;
import cern.laser.business.data.Source;
import cern.laser.business.data.Triplet;
import com.cosylab.acs.laser.dao.ACSAlarmDAOImpl;
import com.cosylab.acs.laser.dao.ConfigurationAccessor;
import com.cosylab.acs.laser.dao.ConfigurationAccessorFactory;
/**
* Test the alarm definitions read from the CDB
*
* @author acaproni
*
*/
public class TestAlarmDAO extends ComponentClientTestCase {
/**
* The triplets of the alarms defined in the CDB.
* It should be enough to change this enum if the alarm
* definitions in the CDB are modified.
*
* @author acaproni
*
*/
private enum AlarmTriplets {
TEST_TM1_1("TEST:TEST_MEMBER1:1",2,"Test alarm 1","The cause","Run and fix quickly","A disaster"),
TEST_TM1_2("TEST:TEST_MEMBER1:2",3,"Test alarm 2",null,null,null),
TEST_TM2_1("TEST:TEST_MEMBER2:1",2,"Test alarm 1","The cause","Run and fix quickly","A disaster"),
TEST_TM2_2("TEST:TEST_MEMBER2:2",3,"Test alarm 2",null,null,null),
TEST_DEF_1("TEST:*:1",2,"Test alarm 1","The cause","Run and fix quickly","A disaster"),
TEST_DEF_2("TEST:*:2",3,"Test alarm 2",null,null,null),
PS_PSM_1("PS:PS_MEMBER:1",2,"PS test alarm","A terrible mistake",null,null),
IDL("IDLFamily:IDLMember:1",0,"This alarm has been sent through an IDL method","Sent an IDL alarm",null,null),
NODE_DEFAULT1("NODE_DEFAULT:*:1", 2, "NODE test", null, null, null),
NODE_DEFAULT2("NODE_DEFAULT:*:2", 2, "NODE test", null, null, null),
NODE_DEFAULT3("NODE_DEFAULT:*:3", 2, "NODE test", null, null, null),
NODE_NODE1_1("NODE_DEFAULT:NODE1:1", 2, "NODE test", null, null, null),
NODE_NODE1_2("NODE_DEFAULT:NODE1:2", 2, "NODE test", null, null, null),
NODE_NODE1_3("NODE_DEFAULT:NODE1:3", 2, "NODE test", null, null, null),
NODE_NODE4_1("NODE_DEFAULT:NODE4:1", 2, "NODE test", null, null, null),
NODE_NODE4_2("NODE_DEFAULT:NODE4:2", 2, "NODE test", null, null, null),
NODE_NODE4_3("NODE_DEFAULT:NODE4:3", 2, "NODE test", null, null, null),
NODE_MULTI1("NODE_DEFAULT:MULTIPLICITY_REG:1", 2, "NODE test", null, null, null),
NODE_MULTI2("NODE_DEFAULT:MULTIPLICITY_REG:2", 2, "NODE test", null, null, null),
NODE_MULTI3("NODE_DEFAULT:MULTIPLICITY_REG:3", 2, "NODE test", null, null, null),
REGEXP_NODE1("NODE_REGEXP:REGEXP_NODE1:1", 2, "NODE test", null, null, null),
REGEXP_NODE2("NODE_REGEXP:REGEXP_NODE_2:1", 2, "NODE test", null, null, null),
REGEXP_NODE3("NODE_REGEXP:REGEXP_NODE_3:1", 2, "NODE test", null, null, null),
REGEXP_NODE4("NODE_REGEXP:REGEXP_NODE_4:1", 2, "NODE test", null, null, null),
MF_DEFAULT0("MF_DEFAULT:MULTIPLE_MF_FAILURES:0", 0, "The description for 0",null, null, null),
MF_DEFAULT1("MF_DEFAULT:MULTIPLE_MF_FAILURES:1", 0, "Description 1",null, null, null),
MF_DEFAULT2("MF_DEFAULT:MULTIPLE_MF_FAILURES:2", 0, "The description for 2",null, null, null),
MF_DEFAULT3("MF_DEFAULT:MULTIPLE_MF_FAILURES:3", 0, "The description for 3",null, null, null),
MF_DEFAULT4("MF_DEFAULT:MULTIPLE_MF_FAILURES:4", 0, "The description for 4",null, null, null),
MF_DEFAULT5("MF_DEFAULT:MULTIPLE_MF_FAILURES:5", 1, "MR alarm","Multiplicity reduction generated", null, null),
MF_DEFAULT0_DFM("MF_DEFAULT:*:0", 0, "The description for 0",null, null, null),
MF_DEFAULT1_DFM("MF_DEFAULT:*:1", 0, "Description 1",null, null, null),
MF_DEFAULT2_DFM("MF_DEFAULT:*:2", 0, "The description for 2",null, null, null),
MF_DEFAULT3_DFM("MF_DEFAULT:*:3", 0, "The description for 3",null, null, null),
MF_DEFAULT4_DFM("MF_DEFAULT:*:4", 0, "The description for 4",null, null, null),
MF_DEFAULT5_DFM("MF_DEFAULT:*:5", 1, "MR alarm","Multiplicity reduction generated", null, null),
MF_REGEXP0_REGEXP1("MF_REGEXP:REGEXP1:0", 0, "Regexp for 0",null, null, null),
MF_REGEXP1_REGEXP1("MF_REGEXP:REGEXP1:1", 0, "Regexp 1",null, null, null),
MF_REGEXP2_REGEXP1("MF_REGEXP:REGEXP1:2", 0, "Regexp for 2",null, null, null),
MF_REGEXP3_REGEXP1("MF_REGEXP:REGEXP1:3", 0, "Regexp for 3",null, null, null),
MF_REGEXP4_REGEXP1("MF_REGEXP:REGEXP1:4", 0, "Regexp for 4",null, null, null),
MF_REGEXP5_REGEXP1("MF_REGEXP:REGEXP1:5", 1, "MR alarm with regexp","Multiplicity reduction generated", null, null),
MF_REGEXP0_REGEXP2("MF_REGEXP:REGEXP2:0", 0, "Regexp for 0",null, null, null),
MF_REGEXP1_REGEXP2("MF_REGEXP:REGEXP2:1", 0, "Regexp 1",null, null, null),
MF_REGEXP2_REGEXP2("MF_REGEXP:REGEXP2:2", 0, "Regexp for 2",null, null, null),
MF_REGEXP3_REGEXP2("MF_REGEXP:REGEXP2:3", 0, "Regexp for 3",null, null, null),
MF_REGEXP4_REGEXP2("MF_REGEXP:REGEXP2:4", 0, "Regexp for 4",null, null, null),
MF_REGEXP5_REGEXP2("MF_REGEXP:REGEXP2:5", 1, "MR alarm with regexp","Multiplicity reduction generated", null, null),
MF_REGEXP0_REGEXP3("MF_REGEXP:REGEXP3:0", 0, "Regexp for 0",null, null, null),
MF_REGEXP1_REGEXP3("MF_REGEXP:REGEXP3:1", 0, "Regexp 1",null, null, null),
MF_REGEXP2_REGEXP3("MF_REGEXP:REGEXP3:2", 0, "Regexp for 2",null, null, null),
MF_REGEXP3_REGEXP3("MF_REGEXP:REGEXP3:3", 0, "Regexp for 3",null, null, null),
MF_REGEXP4_REGEXP3("MF_REGEXP:REGEXP3:4", 0, "Regexp for 4",null, null, null),
MF_REGEXP5_REGEXP3("MF_REGEXP:REGEXP3:5", 1, "MR alarm with regexp","Multiplicity reduction generated", null, null),
MF_REGEXP0_REGEXP4("MF_REGEXP:REGEXP4:0", 0, "Regexp for 0",null, null, null),
MF_REGEXP1_REGEXP4("MF_REGEXP:REGEXP4:1", 0, "Regexp 1",null, null, null),
MF_REGEXP2_REGEXP4("MF_REGEXP:REGEXP4:2", 0, "Regexp for 2",null, null, null),
MF_REGEXP3_REGEXP4("MF_REGEXP:REGEXP4:3", 0, "Regexp for 3",null, null, null),
MF_REGEXP4_REGEXP4("MF_REGEXP:REGEXP4:4", 0, "Regexp for 4",null, null, null),
MF_REGEXP5_REGEXP4("MF_REGEXP:REGEXP4:5", 1, "MR alarm with regexp","Multiplicity reduction generated", null, null),
MF_REGEXP0_REGEXP5("MF_REGEXP:REGEXP5:0", 0, "Regexp for 0",null, null, null),
MF_REGEXP1_REGEXP5("MF_REGEXP:REGEXP5:1", 0, "Regexp 1",null, null, null),
MF_REGEXP2_REGEXP5("MF_REGEXP:REGEXP5:2", 0, "Regexp for 2",null, null, null),
MF_REGEXP3_REGEXP5("MF_REGEXP:REGEXP5:3", 0, "Regexp for 3",null, null, null),
MF_REGEXP4_REGEXP5("MF_REGEXP:REGEXP5:4", 0, "Regexp for 4",null, null, null),
MF_REGEXP5_REGEXP5("MF_REGEXP:REGEXP5:5", 1, "MR alarm with regexp","Multiplicity reduction generated", null, null),
MF_REGEXP0_MULTIPLE_MF_REGEXP("MF_REGEXP:MULTIPLE_MF_REGEXP:0", 0, "Regexp for 0",null, null, null),
MF_REGEXP1_MULTIPLE_MF_REGEXP("MF_REGEXP:MULTIPLE_MF_REGEXP:1", 0, "Regexp 1",null, null, null),
MF_REGEXP2_MULTIPLE_MF_REGEXP("MF_REGEXP:MULTIPLE_MF_REGEXP:2", 0, "Regexp for 2",null, null, null),
MF_REGEXP3_MULTIPLE_MF_REGEXP("MF_REGEXP:MULTIPLE_MF_REGEXP:3", 0, "Regexp for 3",null, null, null),
MF_REGEXP4_MULTIPLE_MF_REGEXP("MF_REGEXP:MULTIPLE_MF_REGEXP:4", 0, "Regexp for 4",null, null, null),
MF_REGEXP5_MULTIPLE_MF_REGEXP("MF_REGEXP:MULTIPLE_MF_REGEXP:5", 1, "MR alarm with regexp","Multiplicity reduction generated", null, null),
MF_REGEXP0_DFM("MF_REGEXP:*:0", 0, "Regexp for 0",null, null, null),
MF_REGEXP1_DFM("MF_REGEXP:*:1", 0, "Regexp 1",null, null, null),
MF_REGEXP2_DFM("MF_REGEXP:*:2", 0, "Regexp for 2",null, null, null),
MF_REGEXP3_DFM("MF_REGEXP:*:3", 0, "Regexp for 3",null, null, null),
MF_REGEXP4_DFM("MF_REGEXP:*:4", 0, "Regexp for 4",null, null, null),
MF_REGEXP5_DFM("MF_REGEXP:*:5", 1, "MR alarm with regexp","Multiplicity reduction generated", null, null),
HIER_DEF1("HIERARCHICAL:*:1",2,"Generic FS",null,null,null),
HIER_DEF2("HIERARCHICAL:*:2",2,"MULTI FS",null,null,null),
HIER_DA41_1("HIERARCHICAL:CONTROL/DA41/HIER:1",2,"Generic FS",null,null,null),
HIER_DA41_2("HIERARCHICAL:CONTROL/DA41/HIER:2",2,"MULTI FS",null,null,null),
HIER_MULTI_1("HIERARCHICAL:MULTIPLICITY_HIER:1",2,"Generic FS",null,null,null),
HIER_MULTI_2("HIERARCHICAL:MULTIPLICITY_HIER:2",2,"MULTI FS",null,null,null);
public final String ID;
public final int priority;
public final String description;
public final String cause;
public final String action;
public final String consequence;
private AlarmTriplets(String ID, int priority, String desc,String cause, String action, String consequence) {
this.ID=ID;
this.priority=priority;
this.description=desc;
this.cause=cause;
this.action=action;
this.consequence=consequence;
}
/**
* Check if the passed string is a defined ID.
*
* @param id The ID to check
* @return
*/
public static boolean exist(String id) {
for (AlarmTriplets triplet: AlarmTriplets.values()) {
if (triplet.ID.equals(id)) {
return true;
}
}
// Is the ID of a laser core alarm?
String[] coreIds = new String[LaserCoreFaultCodes.values().length];
for (int t=0; t<LaserCoreFaultCodes.values().length; t++) {
coreIds[t]=LaserCoreFaultState.FaultFamily+":"+LaserCoreFaultState.FaultMember+":"+LaserCoreFaultCodes.values()[t].faultCode;
}
for (String str: coreIds) {
if (str.equals(id)) {
return true;
}
}
return false;
}
/**
* Build the triplet for the given alarm
*/
public Triplet getTriplet() {
String[] parts = ID.split(":");
Triplet ret = new Triplet(parts[0],parts[1],Integer.parseInt(parts[2]));
return ret;
}
}
private ACSAlarmDAOImpl alarmDAO;
/**
* Constructor
*
* @throws Exception
*/
public TestAlarmDAO() throws Exception {
super("TestAlarmDAO");
}
/**
* @see TestCase
*/
public void setUp() throws Exception {
super.setUp();
ConfigurationAccessor conf;
conf = ConfigurationAccessorFactory.getInstance(getContainerServices());
assertNotNull("Got a null ConfigurationAccessor", conf);
alarmDAO=new ACSAlarmDAOImpl(getContainerServices().getLogger());
assertNotNull("AlarmDAO is null", alarmDAO);
alarmDAO.setConfAccessor(conf);
alarmDAO.loadAlarms();
}
/**
* @see TestCase
*/
public void tearDown() throws Exception {
super.tearDown();
}
/**
* Check the getting of all the alarm IDs
*
* The ID of an alarm is given by its triplet
*
* @throws Exception
*/
public void testAlarmIDs() throws Exception {
String[] ids = alarmDAO.getAllAlarmIDs();
assertNotNull(ids);
// There are 8 alarms defined in the CDB
// 6 alarms plus 2 defaults for TEST
// We have to consider the laser core alarms too...
assertEquals(AlarmTriplets.values().length + LaserCoreFaultCodes.values().length, ids.length);
// Check if all the triplets exist
for (String id: ids) {
assertTrue(id+" alarmID does not exist",AlarmTriplets.exist(id));
}
}
/**
* Test the getting of alarms by their ID.
*
* it check the alarm, its ID, its triplet, its priority, its description,
* action, cause, consequence
*/
public void testGetAlarmID() throws Exception {
for (AlarmTriplets triplet: AlarmTriplets.values()) {
if (!triplet.ID.contains("*")) {
Alarm alarm = alarmDAO.getAlarm(triplet.ID);
assertNotNull(alarm);
// CHeck the ID
assertEquals(triplet.ID, alarm.getAlarmId());
// Check the triplet
Triplet alarmTriplet = alarm.getTriplet();
assertNotNull(alarmTriplet);
Triplet defTriplet = triplet.getTriplet();
assertEquals(defTriplet.getFaultFamily(), alarmTriplet.getFaultFamily());
assertEquals(defTriplet.getFaultMember(), alarmTriplet.getFaultMember());
assertEquals(defTriplet.getFaultCode(), alarmTriplet.getFaultCode());
// Check the priority
assertEquals(Integer.valueOf(triplet.priority), alarm.getPriority());
// Check the description
assertEquals(triplet.description, alarm.getProblemDescription());
// Action
assertEquals(triplet.action, alarm.getAction());
// The cause
assertEquals(triplet.cause, alarm.getCause());
// Conseuqnces
assertEquals(triplet.consequence, alarm.getConsequence());
}
}
}
/**
* Test the setting of the responsible person
* by getting PS and one of the TEST member
*
* @throws Exception
*/
public void testResponsiblePerson() throws Exception {
Alarm ps = alarmDAO.getAlarm(AlarmTriplets.PS_PSM_1.ID);
assertNotNull(ps);
assertEquals("123456",ps.getResponsiblePerson().getGsmNumber());
assertEquals("test@eso.org", ps.getResponsiblePerson().getEMail());
assertEquals("", ps.getResponsiblePerson().getFirstName());
assertEquals("Alessandro", ps.getResponsiblePerson().getFamilyName());
Alarm test = alarmDAO.getAlarm(AlarmTriplets.TEST_TM1_1.ID);
assertNotNull(test);
assertEquals("",test.getResponsiblePerson().getGsmNumber());
assertEquals("", test.getResponsiblePerson().getEMail());
assertEquals("", test.getResponsiblePerson().getFirstName());
assertEquals("Alex", test.getResponsiblePerson().getFamilyName());
}
/**
* Test the sources read from CDB (only one at the moment)
*
* @throws Exception
*/
public void testGetSources() throws Exception {
ConcurrentHashMap<String,cern.laser.business.data.Source> sources = alarmDAO.getSources();
assertNotNull(sources);
assertEquals("There should be only one source and not "+sources.size(),1, sources.size());
Set<String> keys =sources.keySet();
assertNotNull(keys);
assertEquals("Invalid number of keys", 1, keys.size());
for (String key: keys) {
Source src = sources.get(key);
assertNotNull(src);
// The key is the Source ID
assertEquals(src.getSourceId(), key);
// Check the description
assertEquals("SOURCE", src.getDescription());
// Check the name
assertEquals("ALARM_SYSTEM_SOURCES", src.getName());
}
}
/**
* Find alarm is like getAlarm but throws an exception
* if the alarm is not found
*
* @throws Exception
*/
public void testFindAlarm() throws Exception {
// Get an alarm that exist
Alarm alarm = alarmDAO.findAlarm(AlarmTriplets.TEST_TM2_1.ID);
assertNotNull(alarm);
assertEquals(AlarmTriplets.TEST_TM2_1.ID, alarm.getAlarmId());
// Get an unknown alarm ==> thorws an exception
Alarm alarm2=null;
try {
alarm2 = alarmDAO.findAlarm("A:b:1");
alarm2=alarm; // Should not be executed
} catch (Exception e) {
// Ok
}
assertNull(alarm2);
}
/**
* Test the deletion of alarms
*/
public void testDeleteAlarm() {
int size =alarmDAO.getAllAlarmIDs().length;
Alarm alarmToDelete = alarmDAO.getAlarm(AlarmTriplets.PS_PSM_1.ID);
assertNotNull(alarmToDelete);
alarmDAO.deleteAlarm(alarmToDelete);
assertEquals(size-1, alarmDAO.getAllAlarmIDs().length);
Alarm deletedAlarm=alarmDAO.getAlarm(alarmToDelete.getAlarmId());
assertNull(deletedAlarm);
// Try to delete an alarm that does not exist
size =alarmDAO.getAllAlarmIDs().length;
alarmDAO.deleteAlarm(alarmToDelete);
assertEquals(size, alarmDAO.getAllAlarmIDs().length);
}
}