/** * NOTE: This copyright does *not* cover user programs that use HQ * program services by normal system calls through the application * program interfaces provided as part of the Hyperic Plug-in Development * Kit or the Hyperic Client Development Kit - this is merely considered * normal use of the program, and does *not* fall under the heading of * "derived work". * * Copyright (C) [2009-2010], VMware, Inc. * This file is part of HQ. * * HQ is free software; you can redistribute it and/or modify * it under the terms version 2 of the GNU General Public License as * published by the Free Software Foundation. This program 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 General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA. * */ package org.hyperic.hq.events.ext; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import junit.framework.TestCase; import org.easymock.EasyMock; import org.hyperic.hq.events.InvalidTriggerDataException; import org.hyperic.hq.events.MockEvent; import org.hyperic.hq.events.server.session.AlertRegulator; /** * Unit test of {@link RegisteredTriggers} * @author jhickey * */ public class RegisteredTriggersTest extends TestCase { private RegisteredTriggers registeredTriggers; private AlertRegulator alertRegulator; private void replay() { EasyMock.replay(alertRegulator); } /** * Sets up the tests */ @Override public void setUp() throws Exception { super.setUp(); this.alertRegulator = EasyMock.createMock(AlertRegulator.class); this.registeredTriggers = new RegisteredTriggers(alertRegulator); } /** * Verifies successful disable of triggers * @throws InvalidTriggerDataException * @throws InstantiationException * @throws IllegalAccessException */ public void testDisableTriggers() { Integer triggerId = Integer.valueOf(987); Integer[] interestedInstances = new Integer[] { 123, 456 }; RegisterableTriggerInterface trigger1 = EasyMock.createMock(RegisterableTriggerInterface.class); EasyMock.expect(trigger1.getId()).andReturn(triggerId).times(2); EasyMock.expect(trigger1.getInterestedEventTypes()).andReturn(new Class[] { MockEvent.class }); EasyMock.expect(trigger1.getInterestedInstanceIDs(MockEvent.class)).andReturn(interestedInstances); trigger1.setEnabled(false); List<Integer> expectedDisabledTriggers = new ArrayList<Integer>(); expectedDisabledTriggers.add(triggerId); EasyMock.replay(trigger1); replay(); registeredTriggers.addTrigger(trigger1); registeredTriggers.setTriggersEnabled(expectedDisabledTriggers, false); verify(); EasyMock.verify(trigger1); } /** * Verifies that no interested triggers are returned if alerts are globally * disabled * @throws InvalidTriggerDataException * @throws InstantiationException * @throws IllegalAccessException */ public void testGetInterestedTriggersAlertsGloballyDisabled() { Integer triggerId = Integer.valueOf(987); Integer[] interestedInstances = new Integer[] { 123, 456 }; RegisterableTriggerInterface trigger1 = EasyMock.createMock(RegisterableTriggerInterface.class); EasyMock.expect(trigger1.getId()).andReturn(triggerId).times(2); EasyMock.expect(trigger1.getInterestedEventTypes()).andReturn(new Class[] { MockEvent.class }); EasyMock.expect(trigger1.getInterestedInstanceIDs(MockEvent.class)).andReturn(interestedInstances); EasyMock.expect(alertRegulator.alertsAllowed()).andReturn(false).times(5); EasyMock.replay(trigger1); replay(); registeredTriggers.addTrigger(trigger1); assertTrue(registeredTriggers.getInterestedTriggers(new MockEvent(3l, 123), 123).isEmpty()); assertFalse(registeredTriggers.isTriggerInterested(new MockEvent(7l, 123))); registeredTriggers.getInterestedTriggers(new MockEvent(3l, 123)).isEmpty(); verify(); EasyMock.verify(trigger1); } /** * Verifies that the init method properly clears the internal state */ public void testInit() { Integer triggerId = Integer.valueOf(987); Integer[] interestedInstances = new Integer[] { 123, 456 }; RegisterableTriggerInterface trigger1 = EasyMock.createMock(RegisterableTriggerInterface.class); EasyMock.expect(trigger1.getId()).andReturn(triggerId).times(2); EasyMock.expect(trigger1.getInterestedEventTypes()).andReturn(new Class[] { MockEvent.class }); EasyMock.expect(trigger1.getInterestedInstanceIDs(MockEvent.class)).andReturn(interestedInstances); EasyMock.replay(trigger1); replay(); registeredTriggers.addTrigger(trigger1); registeredTriggers.init(); EasyMock.verify(trigger1); verify(); assertTrue(registeredTriggers.getTriggers().isEmpty()); } /** * Verifies successful register of triggers and retrieval through instance * and static methods */ public void testRegisterAndRetrieve() { Integer triggerId = Integer.valueOf(987); Integer trigger2Id = Integer.valueOf(456); Integer[] interestedInstances = new Integer[] { 123, 456 }; RegisterableTriggerInterface trigger1 = EasyMock.createMock(RegisterableTriggerInterface.class); RegisterableTriggerInterface trigger2 = EasyMock.createMock(RegisterableTriggerInterface.class); EasyMock.expect(trigger1.getId()).andReturn(triggerId).times(2); EasyMock.expect(trigger1.getInterestedEventTypes()).andReturn(new Class[] { MockEvent.class }); EasyMock.expect(trigger1.getInterestedInstanceIDs(MockEvent.class)).andReturn(interestedInstances); EasyMock.expect(trigger2.getId()).andReturn(trigger2Id).times(2); EasyMock.expect(trigger2.getInterestedEventTypes()).andReturn(new Class[] { MockEvent.class }); EasyMock.expect(trigger2.getInterestedInstanceIDs(MockEvent.class)).andReturn(interestedInstances); EasyMock.expect(trigger1.isEnabled()).andReturn(true).times(2); EasyMock.expect(trigger2.isEnabled()).andReturn(true).times(2); EasyMock.replay(trigger1, trigger2); EasyMock.expect(alertRegulator.alertsAllowed()).andReturn(true).times(7); replay(); registeredTriggers.addTrigger(trigger1); registeredTriggers.addTrigger(trigger2); Map<TriggerEventKey, Map<Integer, RegisterableTriggerInterface>> registeredTriggersMap = registeredTriggers .getTriggers(); assertEquals(2, registeredTriggersMap.size()); Map<Integer, RegisterableTriggerInterface> instance1 = registeredTriggersMap.get(new TriggerEventKey( MockEvent.class, 123)); assertNotNull(instance1); assertEquals(2, instance1.size()); assertNotNull(instance1.get(987)); assertNotNull(instance1.get(trigger2Id)); Map<Integer, RegisterableTriggerInterface> instance2 = registeredTriggersMap.get(new TriggerEventKey( MockEvent.class, 456)); assertNotNull(instance2); assertEquals(2, instance2.size()); assertNotNull(instance2.get(987)); assertNotNull(instance2.get(trigger2Id)); Collection<RegisterableTriggerInterface> interestedTriggers = registeredTriggers .getInterestedTriggers(new MockEvent(7l, 123)); assertEquals(2, interestedTriggers.size()); Collection<RegisterableTriggerInterface> interestedTriggers2 = registeredTriggers .getInterestedTriggers(new MockEvent(7l, 999)); assertTrue(interestedTriggers2.isEmpty()); assertTrue(registeredTriggers.isTriggerInterested(new MockEvent(7l, 123))); assertFalse(registeredTriggers.isTriggerInterested(new MockEvent(7l, 999))); EasyMock.verify(trigger1, trigger2); verify(); } /** * Verifies successful register of triggers and retrieval of enabled * triggers only through instance and static methods */ public void testRegisterAndRetrieveTriggerDisabled() { Integer triggerId = Integer.valueOf(987); Integer trigger2Id = Integer.valueOf(456); Integer[] interestedInstances = new Integer[] { 123, 456 }; RegisterableTriggerInterface trigger1 = EasyMock.createMock(RegisterableTriggerInterface.class); RegisterableTriggerInterface trigger2 = EasyMock.createMock(RegisterableTriggerInterface.class); EasyMock.expect(trigger1.getId()).andReturn(triggerId).times(2); EasyMock.expect(trigger1.getInterestedEventTypes()).andReturn(new Class[] { MockEvent.class }); EasyMock.expect(trigger1.getInterestedInstanceIDs(MockEvent.class)).andReturn(interestedInstances); EasyMock.expect(trigger2.getId()).andReturn(trigger2Id).times(2); EasyMock.expect(trigger2.getInterestedEventTypes()).andReturn(new Class[] { MockEvent.class }); EasyMock.expect(trigger2.getInterestedInstanceIDs(MockEvent.class)).andReturn(interestedInstances); EasyMock.expect(trigger1.isEnabled()).andReturn(true).times(2); EasyMock.expect(trigger2.isEnabled()).andReturn(false).times(2); EasyMock.expect(alertRegulator.alertsAllowed()).andReturn(true).times(7); EasyMock.replay(trigger1, trigger2); replay(); registeredTriggers.addTrigger(trigger1); registeredTriggers.addTrigger(trigger2); Map<TriggerEventKey, Map<Integer, RegisterableTriggerInterface>> registeredTriggersMap = registeredTriggers .getTriggers(); assertEquals(2, registeredTriggersMap.size()); Map<Integer, RegisterableTriggerInterface> instance1 = registeredTriggersMap.get(new TriggerEventKey( MockEvent.class, 123)); assertNotNull(instance1); assertEquals(2, instance1.size()); assertNotNull(instance1.get(987)); assertNotNull(instance1.get(trigger2Id)); Map<Integer, RegisterableTriggerInterface> instance2 = registeredTriggersMap.get(new TriggerEventKey( MockEvent.class, 456)); assertNotNull(instance2); assertEquals(2, instance2.size()); assertNotNull(instance2.get(987)); assertNotNull(instance2.get(trigger2Id)); Collection<RegisterableTriggerInterface> interestedTriggers = registeredTriggers .getInterestedTriggers(new MockEvent(7l, 123)); assertEquals(1, interestedTriggers.size()); Collection<RegisterableTriggerInterface> interestedTriggers2 = registeredTriggers .getInterestedTriggers(new MockEvent(7l, 999)); assertTrue(interestedTriggers2.isEmpty()); assertTrue(registeredTriggers.isTriggerInterested(new MockEvent(7l, 123))); assertFalse(registeredTriggers.isTriggerInterested(new MockEvent(7l, 999))); EasyMock.verify(trigger1, trigger2); verify(); } /** * Verifies that the trigger map is properly cleaned up when the last * trigger interested in a specific event is removed */ public void testUnregisterTriggerNoneRemainingForEventKey() { Integer triggerId = 567; Map<TriggerEventKey, Map<Integer, RegisterableTriggerInterface>> testTriggers = new HashMap<TriggerEventKey, Map<Integer, RegisterableTriggerInterface>>(); Map<Integer, RegisterableTriggerInterface> triggersById = new HashMap<Integer, RegisterableTriggerInterface>(); RegisterableTriggerInterface trigger1 = EasyMock.createMock(RegisterableTriggerInterface.class); triggersById.put(triggerId, trigger1); testTriggers.put(new TriggerEventKey(MockEvent.class, 123), triggersById); registeredTriggers.setTriggers(testTriggers); EasyMock.replay(trigger1); registeredTriggers.removeTrigger(triggerId); EasyMock.verify(trigger1); Map<TriggerEventKey, Map<Integer, RegisterableTriggerInterface>> trigMap = registeredTriggers.getTriggers(); assertTrue(trigMap.isEmpty()); } /** * Verifies that the trigger map is properly cleaned up when a trigger * interested in a specific event is removed, but others remain */ public void testUnregisterTriggerSomeRemaining() { Integer triggerId = 567; Integer trigger2Id = 9908; Map<TriggerEventKey, Map<Integer, RegisterableTriggerInterface>> testTriggers = new HashMap<TriggerEventKey, Map<Integer, RegisterableTriggerInterface>>(); Map<Integer, RegisterableTriggerInterface> triggersById = new HashMap<Integer, RegisterableTriggerInterface>(); RegisterableTriggerInterface trigger1 = EasyMock.createMock(RegisterableTriggerInterface.class); triggersById.put(triggerId, trigger1); RegisterableTriggerInterface trigger2 = EasyMock.createMock(RegisterableTriggerInterface.class); triggersById.put(trigger2Id, trigger2); testTriggers.put(new TriggerEventKey(MockEvent.class, 123), triggersById); registeredTriggers.setTriggers(testTriggers); EasyMock.replay(trigger1); registeredTriggers.removeTrigger(triggerId); EasyMock.verify(trigger1); Map<TriggerEventKey, Map<Integer, RegisterableTriggerInterface>> trigMap = registeredTriggers.getTriggers(); Map<Integer, RegisterableTriggerInterface> actualTriggers = trigMap.get(new TriggerEventKey(MockEvent.class, 123)); assertNotNull(actualTriggers); assertEquals(1, actualTriggers.size()); assertEquals(trigger2, actualTriggers.get(trigger2Id)); } private void verify() { EasyMock.verify(alertRegulator); } }